{
  "openapi": "3.1.0",
  "info": {
    "title": "Zodiacs.org API",
    "version": "v1.2026-09-30",
    "summary": "Free sky data as static files: today's sky, upcoming events, planets, signs, and per-year retrogrades, stations, ingresses, moon phases, eclipses, and aspects. And six calculation endpoints that take a POST body.",
    "description": "The sky data (tags daily and yearly) is static JSON files served from the CDN with open CORS and no authentication. Positions are apparent geocentric tropical ecliptic longitudes computed at 12:00 UTC daily. Data as of 2026-10-07. Guide for AI agents: https://zodiacs.org/api/v1/llms.txt. Documentation: https://zodiacs.org/developers/. The compute endpoints (tag compute) calculate from the body of a POST request, with open CORS and no authentication; their documentation is https://zodiacs.org/developers/compute/.",
    "license": {
      "name": "CC BY 4.0",
      "identifier": "CC-BY-4.0"
    },
    "contact": {
      "url": "https://zodiacs.org/developers/"
    }
  },
  "servers": [
    {
      "url": "https://zodiacs.org"
    }
  ],
  "tags": [
    {
      "name": "daily",
      "description": "Daily publication is scheduled from 00:00 UTC using positions computed for noon UTC. Delivery can be delayed; check each payload edition date."
    },
    {
      "name": "yearly",
      "description": "Regenerated when the underlying yearly data is refreshed."
    },
    {
      "name": "compute",
      "description": "Calculations from a POST body, on the vendored @zodiacs/engine. Birth data goes only in the body; any query string is ignored. The function writes nothing from a request or its result to a log, a file or a database, and responses are not cached; the host's request logs keep each request's web address and IP address. The endpoints answer only while their per-address rate limit is in place, and 503 otherwise. A body with a repeated key is read as JSON.parse reads it: the last value wins. Documentation: https://zodiacs.org/developers/compute/"
    }
  ],
  "paths": {
    "/api/v1/index.json": {
      "get": {
        "operationId": "getIndex",
        "summary": "Every endpoint and document",
        "tags": [
          "daily"
        ],
        "responses": {
          "200": {
            "description": "The endpoint manifest.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/index"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/sky/today.json": {
      "get": {
        "operationId": "getToday",
        "summary": "Today's sky",
        "tags": [
          "daily"
        ],
        "responses": {
          "200": {
            "description": "Today's positions, moon, retrogrades, and events.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/today"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/sky/upcoming.json": {
      "get": {
        "operationId": "getUpcoming",
        "summary": "Upcoming events",
        "tags": [
          "daily"
        ],
        "responses": {
          "200": {
            "description": "The next weeks of sky events.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/upcoming"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/signs.json": {
      "get": {
        "operationId": "getSigns",
        "summary": "The twelve signs",
        "tags": [
          "daily"
        ],
        "responses": {
          "200": {
            "description": "Sign metadata, Sun seasons, and occupants.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/signs"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/planets/{planet}.json": {
      "get": {
        "operationId": "getPlanet",
        "summary": "One body",
        "tags": [
          "daily"
        ],
        "parameters": [
          {
            "name": "planet",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "sun",
                "moon",
                "mercury",
                "venus",
                "mars",
                "jupiter",
                "saturn",
                "uranus",
                "neptune",
                "pluto"
              ]
            },
            "description": "Lowercase body name."
          }
        ],
        "responses": {
          "200": {
            "description": "Current position, retrograde status, next ingress and station.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/planet"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/retrogrades/{year}.json": {
      "get": {
        "operationId": "getRetrogradesYear",
        "summary": "Retrograde windows for a year",
        "tags": [
          "yearly"
        ],
        "parameters": [
          {
            "name": "year",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "enum": [
                2026,
                2027,
                2028,
                2029,
                2030
              ]
            },
            "description": "A covered calendar year (2026–2030)."
          }
        ],
        "responses": {
          "200": {
            "description": "Retrograde windows for a year.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/retrogrades"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/stations/{year}.json": {
      "get": {
        "operationId": "getStationsYear",
        "summary": "Stations for a year",
        "tags": [
          "yearly"
        ],
        "parameters": [
          {
            "name": "year",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "enum": [
                2026,
                2027,
                2028,
                2029,
                2030
              ]
            },
            "description": "A covered calendar year (2026–2030)."
          }
        ],
        "responses": {
          "200": {
            "description": "Stations for a year.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/stations"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/ingresses/{year}.json": {
      "get": {
        "operationId": "getIngressesYear",
        "summary": "Sign ingresses for a year",
        "tags": [
          "yearly"
        ],
        "parameters": [
          {
            "name": "year",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "enum": [
                2026,
                2027,
                2028,
                2029,
                2030
              ]
            },
            "description": "A covered calendar year (2026–2030)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sign ingresses for a year.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ingresses"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/moon-phases/{year}.json": {
      "get": {
        "operationId": "getMoonPhasesYear",
        "summary": "Moon phases for a year",
        "tags": [
          "yearly"
        ],
        "parameters": [
          {
            "name": "year",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "enum": [
                2026,
                2027,
                2028,
                2029,
                2030
              ]
            },
            "description": "A covered calendar year (2026–2030)."
          }
        ],
        "responses": {
          "200": {
            "description": "Moon phases for a year.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/moon-phases"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/eclipses/{year}.json": {
      "get": {
        "operationId": "getEclipsesYear",
        "summary": "Eclipses for a year",
        "tags": [
          "yearly"
        ],
        "parameters": [
          {
            "name": "year",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "enum": [
                2026,
                2027,
                2028,
                2029,
                2030
              ]
            },
            "description": "A covered calendar year (2026–2030)."
          }
        ],
        "responses": {
          "200": {
            "description": "Eclipses for a year.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/eclipses"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/aspects/{year}.json": {
      "get": {
        "operationId": "getAspectsYear",
        "summary": "Exact aspects for a year",
        "tags": [
          "yearly"
        ],
        "parameters": [
          {
            "name": "year",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "enum": [
                2026,
                2027,
                2028,
                2029,
                2030
              ]
            },
            "description": "A covered calendar year (2026–2030)."
          }
        ],
        "responses": {
          "200": {
            "description": "Exact aspects for a year.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                },
                "description": "Every endpoint is open to any origin."
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                },
                "description": "Short on daily files, a day on yearly files."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/aspects"
                }
              }
            }
          },
          "404": {
            "description": "No such file: a year or body outside coverage."
          }
        }
      }
    },
    "/api/v1/chart": {
      "options": {
        "operationId": "preflightChart",
        "summary": "CORS preflight",
        "description": "Answered before anything else is checked, with no body, so that a page on another site can POST to the endpoint.",
        "tags": [
          "compute"
        ],
        "responses": {
          "204": {
            "description": "The methods and headers a cross-origin POST may use.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "POST, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "const": "Content-Type"
                }
              },
              "Access-Control-Max-Age": {
                "schema": {
                  "const": "86400"
                }
              },
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "computeChart",
        "summary": "A natal chart for an instant and a place",
        "description": "Bodies, angles, house cusps and aspects as the engine's natalChart returns them, for an instant given in UTC or as local civil time in an IANA zone. The receipt is the engine's own. Documentation: https://zodiacs.org/developers/compute/#chart",
        "tags": [
          "compute"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlaceInstantRequest"
              },
              "examples": {
                "utc": {
                  "summary": "A UTC instant at Greenwich, Placidus houses",
                  "value": {
                    "utc": "2000-01-01T12:00:00Z",
                    "latitude": 51.4779,
                    "longitude": -0.0015,
                    "houseSystem": "placidus"
                  }
                },
                "local": {
                  "summary": "Local civil time in an IANA zone, whole-sign houses",
                  "value": {
                    "local": {
                      "date": "1990-06-15",
                      "time": "14:30",
                      "zone": "Europe/Paris"
                    },
                    "latitude": 48.8566,
                    "longitude": 2.3522,
                    "houseSystem": "whole"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The result, the receipt, the backend and what to cite.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "No response is stored by a cache."
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChartResponse"
                },
                "examples": {
                  "utc": {
                    "summary": "A UTC instant at Greenwich, Placidus houses",
                    "value": {
                      "schema": "zodiacs.compute-api.chart.v1",
                      "result": {
                        "instant": "2000-01-01T12:00:00.000Z",
                        "local": null,
                        "bodies": [
                          {
                            "body": "Sun",
                            "lon": 280.3687723811323,
                            "lat": 0.0000011205048760998976,
                            "speed": 1.0194308605093738,
                            "retrograde": false,
                            "sign": "capricorn",
                            "degree": 10.368772381132317
                          },
                          {
                            "body": "Moon",
                            "lon": 223.32396777014543,
                            "lat": 5.170788636029834,
                            "speed": 12.021413077249576,
                            "retrograde": false,
                            "sign": "scorpio",
                            "degree": 13.323967770145373
                          },
                          {
                            "body": "Mercury",
                            "lon": 271.8889479012799,
                            "lat": -0.9950670065449166,
                            "speed": 1.5562863864317933,
                            "retrograde": false,
                            "sign": "capricorn",
                            "degree": 1.8889479012798347
                          },
                          {
                            "body": "Venus",
                            "lon": 241.5652674210742,
                            "lat": 2.0659964948803324,
                            "speed": 1.2090421389530093,
                            "retrograde": false,
                            "sign": "sagittarius",
                            "degree": 1.565267421074168
                          },
                          {
                            "body": "Mars",
                            "lon": 327.96393186874616,
                            "lat": -1.0680819810158533,
                            "speed": 0.7756777245333524,
                            "retrograde": false,
                            "sign": "aquarius",
                            "degree": 27.963931868746158
                          },
                          {
                            "body": "Jupiter",
                            "lon": 25.254229769859705,
                            "lat": -1.2604529877805284,
                            "speed": 0.040754132243137065,
                            "retrograde": false,
                            "sign": "aries",
                            "degree": 25.254229769859705
                          },
                          {
                            "body": "Saturn",
                            "lon": 40.39615382546799,
                            "lat": -2.44480970483609,
                            "speed": -0.019940313450206304,
                            "retrograde": true,
                            "sign": "taurus",
                            "degree": 10.39615382546799
                          },
                          {
                            "body": "Uranus",
                            "lon": 314.8061345895963,
                            "lat": -0.6596606626376934,
                            "speed": 0.05034454358110452,
                            "retrograde": false,
                            "sign": "aquarius",
                            "degree": 14.80613458959624
                          },
                          {
                            "body": "Neptune",
                            "lon": 303.1954719643007,
                            "lat": 0.23714822339759897,
                            "speed": 0.03557004143317499,
                            "retrograde": false,
                            "sign": "aquarius",
                            "degree": 3.195471964300623
                          },
                          {
                            "body": "Pluto",
                            "lon": 251.4547650631123,
                            "lat": 10.855210710590136,
                            "speed": 0.03515256619834872,
                            "retrograde": false,
                            "sign": "sagittarius",
                            "degree": 11.45476506311229
                          },
                          {
                            "body": "North Node",
                            "lon": 123.95213652346729,
                            "lat": 0,
                            "speed": -0.0550864209772044,
                            "retrograde": true,
                            "sign": "leo",
                            "degree": 3.9521365234672885
                          },
                          {
                            "body": "South Node",
                            "lon": 303.9521365234673,
                            "lat": 0,
                            "speed": -0.0550864209772044,
                            "retrograde": true,
                            "sign": "aquarius",
                            "degree": 3.9521365234672885
                          }
                        ],
                        "angles": {
                          "asc": 24.26615726733877,
                          "mc": 279.6110742467766,
                          "dsc": 204.2661572673387,
                          "ic": 99.61107424677658
                        },
                        "houses": {
                          "system": "placidus",
                          "cusps": [
                            24.26615726733877,
                            61.14238363670046,
                            82.02080045942967,
                            99.61107424677658,
                            119.06189357712822,
                            147.70063403413616,
                            204.2661572673387,
                            241.14238363670052,
                            262.02080045942967,
                            279.6110742467766,
                            299.0618935771282,
                            327.70063403413616
                          ]
                        },
                        "aspects": [
                          {
                            "a": "Sun",
                            "b": "Saturn",
                            "type": "trine",
                            "orb": 0.027381444335674132,
                            "applying": true
                          },
                          {
                            "a": "Moon",
                            "b": "Uranus",
                            "type": "square",
                            "orb": 1.4821668194508675,
                            "applying": true
                          },
                          {
                            "a": "Venus",
                            "b": "Neptune",
                            "type": "sextile",
                            "orb": 1.630204543226455,
                            "applying": true
                          },
                          {
                            "a": "Mars",
                            "b": "Jupiter",
                            "type": "sextile",
                            "orb": 2.7097020988865097,
                            "applying": false
                          },
                          {
                            "a": "Moon",
                            "b": "Saturn",
                            "type": "opposition",
                            "orb": 2.927813944677382,
                            "applying": false
                          },
                          {
                            "a": "Sun",
                            "b": "Moon",
                            "type": "sextile",
                            "orb": 2.955195389013113,
                            "applying": false
                          },
                          {
                            "a": "Uranus",
                            "b": "Pluto",
                            "type": "sextile",
                            "orb": 3.3513695264840067,
                            "applying": false
                          },
                          {
                            "a": "Venus",
                            "b": "Mars",
                            "type": "square",
                            "orb": 3.6013355523280097,
                            "applying": false
                          },
                          {
                            "a": "Mercury",
                            "b": "Mars",
                            "type": "sextile",
                            "orb": 3.9250160325337333,
                            "applying": false
                          },
                          {
                            "a": "Saturn",
                            "b": "Uranus",
                            "type": "square",
                            "orb": 4.409980764128306,
                            "applying": false
                          },
                          {
                            "a": "Mercury",
                            "b": "Jupiter",
                            "type": "trine",
                            "orb": 6.634718131420186,
                            "applying": false
                          },
                          {
                            "a": "Sun",
                            "b": "Mercury",
                            "type": "conjunction",
                            "orb": 8.479824479852425,
                            "applying": true
                          }
                        ],
                        "flags": [],
                        "deltaT": {
                          "seconds": 63.8285,
                          "sigma": 0.000827,
                          "model": "iers-utc/1",
                          "table": "2026-09-24",
                          "tableDigest": "064d98b4a531053a",
                          "segment": "observed"
                        },
                        "timeScale": {
                          "input": "utc",
                          "basis": "iers",
                          "ut1MinusUtc": {
                            "seconds": 0.35549999999999926,
                            "sigma": 0.000827,
                            "source": "observed"
                          },
                          "leapSeconds": {
                            "taiMinusUtc": 32,
                            "listed": true
                          }
                        }
                      },
                      "receipt": {
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coordinates": {
                          "latitude": 51.4779,
                          "longitude": -0.0015
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "engine": {
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          },
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17"
                        },
                        "houses": {
                          "absenceReason": null,
                          "actual": "placidus",
                          "requested": "placidus"
                        },
                        "inputFlags": [],
                        "instant": "2000-01-01T12:00:00.000Z",
                        "localResolution": null,
                        "provenance": null,
                        "reference": "supplied-instant",
                        "resultFlags": [],
                        "schema": "zodiacs.calculation-receipt.draft-v1",
                        "sourceInstant": "2000-01-01T12:00:00Z",
                        "timeKnown": true,
                        "timeScale": "utc"
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#chart",
                        "receipt": "sha256:50ddf47824a494499851f9993b4084558536aa61936f9ba41c87c9124592a320",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  },
                  "local": {
                    "summary": "Local civil time in an IANA zone, whole-sign houses",
                    "value": {
                      "schema": "zodiacs.compute-api.chart.v1",
                      "result": {
                        "instant": "1990-06-15T12:30:00.000Z",
                        "local": {
                          "offsetMinutes": 120,
                          "flags": [],
                          "localMeanTime": null,
                          "zoneHistory": "runtime",
                          "zoneUncertain": false
                        },
                        "bodies": [
                          {
                            "body": "Sun",
                            "lon": 84.14928002220142,
                            "lat": -0.00001827703878788282,
                            "speed": 0.9551305973047874,
                            "retrograde": false,
                            "sign": "gemini",
                            "degree": 24.149280022201424
                          },
                          {
                            "body": "Moon",
                            "lon": 345.6367188970119,
                            "lat": 3.1501089515977787,
                            "speed": 13.369240872094679,
                            "retrograde": false,
                            "sign": "pisces",
                            "degree": 15.63671889701186
                          },
                          {
                            "body": "Mercury",
                            "lon": 65.7265334199264,
                            "lat": -1.659130144145581,
                            "speed": 1.7170306078924114,
                            "retrograde": false,
                            "sign": "gemini",
                            "degree": 5.7265334199263975
                          },
                          {
                            "body": "Venus",
                            "lon": 48.80186545784608,
                            "lat": -1.9454777463945472,
                            "speed": 1.1760216097229659,
                            "retrograde": false,
                            "sign": "taurus",
                            "degree": 18.801865457846077
                          },
                          {
                            "body": "Mars",
                            "lon": 11.0560354451639,
                            "lat": -1.985442010929648,
                            "speed": 0.7189171010963946,
                            "retrograde": false,
                            "sign": "aries",
                            "degree": 11.0560354451639
                          },
                          {
                            "body": "Jupiter",
                            "lon": 105.89399333781893,
                            "lat": 0.1868222095489725,
                            "speed": 0.2166527083602432,
                            "retrograde": false,
                            "sign": "cancer",
                            "degree": 15.893993337818927
                          },
                          {
                            "body": "Saturn",
                            "lon": 294.0306398433936,
                            "lat": 0.11719975460325133,
                            "speed": -0.0586625626510795,
                            "retrograde": true,
                            "sign": "capricorn",
                            "degree": 24.0306398433936
                          },
                          {
                            "body": "Uranus",
                            "lon": 278.16312067145714,
                            "lat": -0.3255654628085348,
                            "speed": -0.038934664019052434,
                            "retrograde": true,
                            "sign": "capricorn",
                            "degree": 8.163120671457136
                          },
                          {
                            "body": "Neptune",
                            "lon": 283.7163219439272,
                            "lat": 0.8770484012609031,
                            "speed": -0.025031484796045333,
                            "retrograde": true,
                            "sign": "capricorn",
                            "degree": 13.716321943927142
                          },
                          {
                            "body": "Pluto",
                            "lon": 225.40175398202936,
                            "lat": 15.85358596624236,
                            "speed": -0.02017257970976516,
                            "retrograde": true,
                            "sign": "scorpio",
                            "degree": 15.40175398202939
                          },
                          {
                            "body": "North Node",
                            "lon": 308.1217975926026,
                            "lat": 0,
                            "speed": 0.013238202005254607,
                            "retrograde": false,
                            "sign": "aquarius",
                            "degree": 8.121797592602661
                          },
                          {
                            "body": "South Node",
                            "lon": 128.1217975926026,
                            "lat": 0,
                            "speed": 0.013238202005254607,
                            "retrograde": false,
                            "sign": "leo",
                            "degree": 8.121797592602604
                          }
                        ],
                        "angles": {
                          "asc": 182.4651150595028,
                          "mc": 93.10546207243345,
                          "dsc": 2.465115059502807,
                          "ic": 273.1054620724335
                        },
                        "houses": {
                          "system": "whole",
                          "cusps": [
                            180,
                            210,
                            240,
                            270,
                            300,
                            330,
                            0,
                            30,
                            60,
                            90,
                            120,
                            150
                          ]
                        },
                        "aspects": [
                          {
                            "a": "Moon",
                            "b": "Pluto",
                            "type": "trine",
                            "orb": 0.23496491498258365,
                            "applying": false
                          },
                          {
                            "a": "Moon",
                            "b": "Jupiter",
                            "type": "trine",
                            "orb": 0.25727444080700934,
                            "applying": true
                          },
                          {
                            "a": "Jupiter",
                            "b": "Pluto",
                            "type": "trine",
                            "orb": 0.49223935578956457,
                            "applying": false
                          },
                          {
                            "a": "Neptune",
                            "b": "Pluto",
                            "type": "sextile",
                            "orb": 1.6854320381021353,
                            "applying": false
                          },
                          {
                            "a": "Moon",
                            "b": "Neptune",
                            "type": "sextile",
                            "orb": 1.920396953084719,
                            "applying": false
                          },
                          {
                            "a": "Jupiter",
                            "b": "Neptune",
                            "type": "opposition",
                            "orb": 2.1776713938917283,
                            "applying": false
                          },
                          {
                            "a": "Mars",
                            "b": "Neptune",
                            "type": "square",
                            "orb": 2.6602864987632984,
                            "applying": true
                          },
                          {
                            "a": "Mars",
                            "b": "Uranus",
                            "type": "square",
                            "orb": 2.8929147737067638,
                            "applying": false
                          },
                          {
                            "a": "Venus",
                            "b": "Jupiter",
                            "type": "sextile",
                            "orb": 2.9078721200271502,
                            "applying": false
                          },
                          {
                            "a": "Moon",
                            "b": "Venus",
                            "type": "sextile",
                            "orb": 3.1651465608341596,
                            "applying": true
                          },
                          {
                            "a": "Venus",
                            "b": "Pluto",
                            "type": "opposition",
                            "orb": 3.400111475816715,
                            "applying": false
                          },
                          {
                            "a": "Mars",
                            "b": "Jupiter",
                            "type": "square",
                            "orb": 4.837957892655027,
                            "applying": true
                          },
                          {
                            "a": "Venus",
                            "b": "Neptune",
                            "type": "trine",
                            "orb": 5.0855435139188785,
                            "applying": false
                          },
                          {
                            "a": "Venus",
                            "b": "Saturn",
                            "type": "trine",
                            "orb": 5.228774385547524,
                            "applying": true
                          },
                          {
                            "a": "Uranus",
                            "b": "Neptune",
                            "type": "conjunction",
                            "orb": 5.553201272470062,
                            "applying": false
                          },
                          {
                            "a": "Jupiter",
                            "b": "Uranus",
                            "type": "opposition",
                            "orb": 7.73087266636179,
                            "applying": false
                          }
                        ],
                        "flags": [],
                        "deltaT": {
                          "seconds": 57.19704162597656,
                          "sigma": 0.000846,
                          "model": "iers-utc/1",
                          "table": "2026-09-24",
                          "tableDigest": "064d98b4a531053a",
                          "segment": "observed"
                        },
                        "timeScale": {
                          "input": "utc",
                          "basis": "iers",
                          "ut1MinusUtc": {
                            "seconds": -0.013041666666662621,
                            "sigma": 0.000846,
                            "source": "observed"
                          },
                          "leapSeconds": {
                            "taiMinusUtc": 25,
                            "listed": true
                          }
                        }
                      },
                      "receipt": {
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coordinates": {
                          "latitude": 48.8566,
                          "longitude": 2.3522
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "engine": {
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          },
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17"
                        },
                        "houses": {
                          "absenceReason": null,
                          "actual": "whole",
                          "requested": "whole"
                        },
                        "inputFlags": [],
                        "instant": "1990-06-15T12:30:00.000Z",
                        "localResolution": {
                          "date": "1990-06-15",
                          "gapShiftMinutes": 0,
                          "offsetMinutes": 120,
                          "policy": {
                            "fold": "earlier",
                            "gap": "shift-forward"
                          },
                          "time": "14:30",
                          "timeZone": "Europe/Paris"
                        },
                        "provenance": {
                          "runtime": {
                            "name": "node",
                            "tzdbVersion": "2026c"
                          },
                          "status": "claimed"
                        },
                        "reference": "supplied-instant",
                        "resultFlags": [],
                        "schema": "zodiacs.calculation-receipt.draft-v1",
                        "sourceInstant": null,
                        "timeKnown": true,
                        "timeScale": "utc"
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#chart",
                        "receipt": "sha256:110018792c6e08228160843813c791c499568c94cbe3950e8ea166de2fcd0905",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The body is not JSON, or a field is missing, unknown or invalid.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid-request": {
                    "summary": "A latitude at a pole",
                    "value": {
                      "error": {
                        "code": "invalid-request",
                        "message": "Must be a number greater than -90 and less than 90; the engine does not compute angles at the poles.",
                        "pointer": "/latitude"
                      }
                    }
                  },
                  "invalid-json": {
                    "summary": "A body that is not JSON",
                    "value": {
                      "error": {
                        "code": "invalid-json",
                        "message": "The body is not valid JSON in UTF-8."
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The request reached the compute function by a path that is not one of the seven endpoints. The seven paths never answer it.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not-found": {
                    "summary": "The function reached without an endpoint name",
                    "value": {
                      "error": {
                        "code": "not-found",
                        "message": "No compute endpoint is served at this address."
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Only POST, and OPTIONS for a CORS preflight.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Allow": {
                "required": true,
                "description": "The methods the endpoint takes.",
                "schema": {
                  "const": "POST, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "method-not-allowed": {
                    "summary": "A GET",
                    "value": {
                      "error": {
                        "code": "method-not-allowed",
                        "message": "This endpoint accepts POST with a JSON body, and OPTIONS."
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The body is over 16384 bytes.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "payload-too-large": {
                    "summary": "A body declared larger than 16384 bytes",
                    "value": {
                      "error": {
                        "code": "payload-too-large",
                        "message": "The body is larger than 16384 bytes.",
                        "limit": "body.bytes",
                        "max": 16384
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "The body is not sent as application/json.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unsupported-media-type": {
                    "summary": "A body sent as text/plain",
                    "value": {
                      "error": {
                        "code": "unsupported-media-type",
                        "message": "Send the body as application/json in UTF-8, without a content encoding."
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Over a per-address rate limit; Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: the length of the rate limit's window.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    60
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "rate-limited": {
                    "summary": "Over the per-address rate limit",
                    "value": {
                      "error": {
                        "code": "rate-limited",
                        "message": "Too many requests from this address. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 60
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "The engine could not complete the calculation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "calculation-failed": {
                    "summary": "The engine could not complete the calculation",
                    "value": {
                      "error": {
                        "code": "calculation-failed",
                        "message": "The engine could not complete this calculation."
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The compute endpoints are switched off, or their rate limit is not in place or could not be checked: they answer only while it is. Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: 300 when the rate limit could not be checked, 3600 when the API is switched off.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    300,
                    3600
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "disabled": {
                    "summary": "The switch is off",
                    "value": {
                      "error": {
                        "code": "disabled",
                        "message": "The compute API is switched off. Try again later.",
                        "retryAfterSeconds": 3600
                      }
                    }
                  },
                  "rate-limit-unavailable": {
                    "summary": "The rate limit is not in place, or could not be checked",
                    "value": {
                      "error": {
                        "code": "rate-limit-unavailable",
                        "message": "The compute API answers only while its rate limit is in place, and the limit could not be checked. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 300
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/positions": {
      "options": {
        "operationId": "preflightPositions",
        "summary": "CORS preflight",
        "description": "Answered before anything else is checked, with no body, so that a page on another site can POST to the endpoint.",
        "tags": [
          "compute"
        ],
        "responses": {
          "204": {
            "description": "The methods and headers a cross-origin POST may use.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "POST, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "const": "Content-Type"
                }
              },
              "Access-Control-Max-Age": {
                "schema": {
                  "const": "86400"
                }
              },
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "computePositions",
        "summary": "Positions and speeds of bodies at up to 100 instants",
        "description": "The rows the engine's positions() returns at each instant: tropical ecliptic longitude and latitude of date, speed in degrees per day, and the sign. Each instant carries the ΔT it was computed with. Documentation: https://zodiacs.org/developers/compute/#positions",
        "tags": [
          "compute"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PositionsRequest"
              },
              "examples": {
                "two": {
                  "summary": "Three bodies at two instants",
                  "value": {
                    "instants": [
                      "2026-09-29T12:00:00Z",
                      "2026-12-31T00:00:00-05:00"
                    ],
                    "bodies": [
                      "Sun",
                      "Moon",
                      "Mercury"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The result, the receipt, the backend and what to cite.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "No response is stored by a cache."
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PositionsResponse"
                },
                "examples": {
                  "two": {
                    "summary": "Three bodies at two instants",
                    "value": {
                      "schema": "zodiacs.compute-api.positions.v1",
                      "result": {
                        "instants": [
                          {
                            "instant": "2026-09-29T12:00:00.000Z",
                            "bodies": [
                              {
                                "body": "Sun",
                                "lon": 186.3650989852253,
                                "lat": 0.000040745528335972984,
                                "speed": 0.981717214017408,
                                "retrograde": false,
                                "sign": "libra",
                                "degree": 6.365098985225359
                              },
                              {
                                "body": "Moon",
                                "lon": 42.542105382281534,
                                "lat": 4.950806474193532,
                                "speed": 14.176528919762177,
                                "retrograde": false,
                                "sign": "taurus",
                                "degree": 12.542105382281534
                              },
                              {
                                "body": "Mercury",
                                "lon": 208.66911994338005,
                                "lat": -1.5664060143340448,
                                "speed": 1.3549265762264895,
                                "retrograde": false,
                                "sign": "libra",
                                "degree": 28.66911994338011
                              }
                            ],
                            "deltaT": {
                              "seconds": 69.20533325195312,
                              "sigma": 0.0012697,
                              "model": "iers-utc/1",
                              "table": "2026-09-24",
                              "tableDigest": "064d98b4a531053a",
                              "segment": "predicted"
                            },
                            "timeScale": {
                              "input": "utc",
                              "basis": "iers",
                              "ut1MinusUtc": {
                                "seconds": -0.02133333333333809,
                                "sigma": 0.0012697,
                                "source": "predicted"
                              },
                              "leapSeconds": {
                                "taiMinusUtc": 37,
                                "listed": true
                              }
                            },
                            "flags": []
                          },
                          {
                            "instant": "2026-12-31T05:00:00.000Z",
                            "bodies": [
                              {
                                "body": "Sun",
                                "lon": 279.513447355753,
                                "lat": 0.00005713042741092159,
                                "speed": 1.0191402134296368,
                                "retrograde": false,
                                "sign": "capricorn",
                                "degree": 9.513447355752987
                              },
                              {
                                "body": "Moon",
                                "lon": 194.49969423093685,
                                "lat": -4.135221345445718,
                                "speed": 12.904043076190419,
                                "retrograde": false,
                                "sign": "libra",
                                "degree": 14.499694230936825
                              },
                              {
                                "body": "Mercury",
                                "lon": 278.6336322079457,
                                "lat": -1.6656442594625183,
                                "speed": 1.5992637505064522,
                                "retrograde": false,
                                "sign": "capricorn",
                                "degree": 8.633632207945766
                              }
                            ],
                            "deltaT": {
                              "seconds": 69.30520825195312,
                              "sigma": 0.009847975000000002,
                              "model": "iers-utc/1",
                              "table": "2026-09-24",
                              "tableDigest": "064d98b4a531053a",
                              "segment": "predicted"
                            },
                            "timeScale": {
                              "input": "utc",
                              "basis": "iers",
                              "ut1MinusUtc": {
                                "seconds": -0.12120833333332826,
                                "sigma": 0.009847975000000002,
                                "source": "predicted"
                              },
                              "leapSeconds": {
                                "taiMinusUtc": 37,
                                "listed": true
                              }
                            },
                            "flags": []
                          }
                        ]
                      },
                      "receipt": {
                        "schema": "zodiacs.compute-receipt.v1",
                        "endpoint": "positions",
                        "engine": {
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17",
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          }
                        },
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "referenceSpan": {
                          "from": "1800-01-01T00:00:00.000Z",
                          "to": "2200-01-01T00:00:00.000Z"
                        },
                        "deltaT": [
                          {
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a"
                          },
                          {
                            "model": "zodiacs-deltat/1",
                            "table": "2026-09-24",
                            "tableDigest": "6371988c510a1c6c"
                          }
                        ]
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#positions",
                        "receipt": "sha256:166b22120fffe135225114f2274f56b0e39f7883c59a7ac4b294e1b3b62cb7de",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The body is not JSON, or a field is missing, unknown or invalid.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid-request": {
                    "summary": "A latitude at a pole",
                    "value": {
                      "error": {
                        "code": "invalid-request",
                        "message": "Must be a number greater than -90 and less than 90; the engine does not compute angles at the poles.",
                        "pointer": "/latitude"
                      }
                    }
                  },
                  "invalid-json": {
                    "summary": "A body that is not JSON",
                    "value": {
                      "error": {
                        "code": "invalid-json",
                        "message": "The body is not valid JSON in UTF-8."
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The request reached the compute function by a path that is not one of the seven endpoints. The seven paths never answer it.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not-found": {
                    "summary": "The function reached without an endpoint name",
                    "value": {
                      "error": {
                        "code": "not-found",
                        "message": "No compute endpoint is served at this address."
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Only POST, and OPTIONS for a CORS preflight.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Allow": {
                "required": true,
                "description": "The methods the endpoint takes.",
                "schema": {
                  "const": "POST, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "method-not-allowed": {
                    "summary": "A GET",
                    "value": {
                      "error": {
                        "code": "method-not-allowed",
                        "message": "This endpoint accepts POST with a JSON body, and OPTIONS."
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The body is over 16384 bytes.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "payload-too-large": {
                    "summary": "A body declared larger than 16384 bytes",
                    "value": {
                      "error": {
                        "code": "payload-too-large",
                        "message": "The body is larger than 16384 bytes.",
                        "limit": "body.bytes",
                        "max": 16384
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "The body is not sent as application/json.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unsupported-media-type": {
                    "summary": "A body sent as text/plain",
                    "value": {
                      "error": {
                        "code": "unsupported-media-type",
                        "message": "Send the body as application/json in UTF-8, without a content encoding."
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "The request is over one of the endpoint's compute budgets, which the error names.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "budget-exhausted": {
                    "summary": "An events window longer than 92 days",
                    "value": {
                      "error": {
                        "code": "budget-exhausted",
                        "message": "An events window is at most 92 days long.",
                        "limit": "events.windowDays",
                        "max": 92
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Over a per-address rate limit; Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: the length of the rate limit's window.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    60
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "rate-limited": {
                    "summary": "Over the per-address rate limit",
                    "value": {
                      "error": {
                        "code": "rate-limited",
                        "message": "Too many requests from this address. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 60
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "The engine could not complete the calculation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "calculation-failed": {
                    "summary": "The engine could not complete the calculation",
                    "value": {
                      "error": {
                        "code": "calculation-failed",
                        "message": "The engine could not complete this calculation."
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The compute endpoints are switched off, or their rate limit is not in place or could not be checked: they answer only while it is. Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: 300 when the rate limit could not be checked, 3600 when the API is switched off.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    300,
                    3600
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "disabled": {
                    "summary": "The switch is off",
                    "value": {
                      "error": {
                        "code": "disabled",
                        "message": "The compute API is switched off. Try again later.",
                        "retryAfterSeconds": 3600
                      }
                    }
                  },
                  "rate-limit-unavailable": {
                    "summary": "The rate limit is not in place, or could not be checked",
                    "value": {
                      "error": {
                        "code": "rate-limit-unavailable",
                        "message": "The compute API answers only while its rate limit is in place, and the limit could not be checked. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 300
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/houses": {
      "options": {
        "operationId": "preflightHouses",
        "summary": "CORS preflight",
        "description": "Answered before anything else is checked, with no body, so that a page on another site can POST to the endpoint.",
        "tags": [
          "compute"
        ],
        "responses": {
          "204": {
            "description": "The methods and headers a cross-origin POST may use.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "POST, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "const": "Content-Type"
                }
              },
              "Access-Control-Max-Age": {
                "schema": {
                  "const": "86400"
                }
              },
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "computeHouses",
        "summary": "Angles and house cusps for an instant, a place and a system",
        "description": "The angles and the twelve cusps of natalChart for one instant, place and house system. Inside the polar circle Placidus and Koch fall back to whole sign, and the flags and the receipt say so. Documentation: https://zodiacs.org/developers/compute/#houses",
        "tags": [
          "compute"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PlaceInstantRequest"
              },
              "examples": {
                "koch": {
                  "summary": "Koch cusps at Sydney",
                  "value": {
                    "utc": "2026-06-21T12:00:00Z",
                    "latitude": -33.8688,
                    "longitude": 151.2093,
                    "houseSystem": "koch"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The result, the receipt, the backend and what to cite.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "No response is stored by a cache."
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HousesResponse"
                },
                "examples": {
                  "koch": {
                    "summary": "Koch cusps at Sydney",
                    "value": {
                      "schema": "zodiacs.compute-api.houses.v1",
                      "result": {
                        "instant": "2026-06-21T12:00:00.000Z",
                        "local": null,
                        "angles": {
                          "asc": 335.5388722769363,
                          "mc": 242.95820528978106,
                          "dsc": 155.53887227693622,
                          "ic": 62.95820528978106
                        },
                        "houses": {
                          "system": "koch",
                          "cusps": [
                            335.5388722769362,
                            4.913502731650965,
                            34.14218077714588,
                            62.95820528978106,
                            97.20367206467239,
                            126.66880166130079,
                            155.53887227693622,
                            184.91350273165096,
                            214.14218077714588,
                            242.95820528978106,
                            277.20367206467245,
                            306.6688016613008
                          ]
                        },
                        "flags": [],
                        "deltaT": {
                          "seconds": 69.1725,
                          "sigma": 0.000817,
                          "model": "iers-utc/1",
                          "table": "2026-09-24",
                          "tableDigest": "064d98b4a531053a",
                          "segment": "observed"
                        },
                        "timeScale": {
                          "input": "utc",
                          "basis": "iers",
                          "ut1MinusUtc": {
                            "seconds": 0.011499999999998067,
                            "sigma": 0.000817,
                            "source": "observed"
                          },
                          "leapSeconds": {
                            "taiMinusUtc": 37,
                            "listed": true
                          }
                        }
                      },
                      "receipt": {
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coordinates": {
                          "latitude": -33.8688,
                          "longitude": 151.2093
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "engine": {
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          },
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17"
                        },
                        "houses": {
                          "absenceReason": null,
                          "actual": "koch",
                          "requested": "koch"
                        },
                        "inputFlags": [],
                        "instant": "2026-06-21T12:00:00.000Z",
                        "localResolution": null,
                        "provenance": null,
                        "reference": "supplied-instant",
                        "resultFlags": [],
                        "schema": "zodiacs.calculation-receipt.draft-v1",
                        "sourceInstant": "2026-06-21T12:00:00Z",
                        "timeKnown": true,
                        "timeScale": "utc"
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#houses",
                        "receipt": "sha256:833554492d71a5d51f0f3ebdd083e4863d8cba1a9b610f88b6d1a8427b597796",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The body is not JSON, or a field is missing, unknown or invalid.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid-request": {
                    "summary": "A latitude at a pole",
                    "value": {
                      "error": {
                        "code": "invalid-request",
                        "message": "Must be a number greater than -90 and less than 90; the engine does not compute angles at the poles.",
                        "pointer": "/latitude"
                      }
                    }
                  },
                  "invalid-json": {
                    "summary": "A body that is not JSON",
                    "value": {
                      "error": {
                        "code": "invalid-json",
                        "message": "The body is not valid JSON in UTF-8."
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The request reached the compute function by a path that is not one of the seven endpoints. The seven paths never answer it.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not-found": {
                    "summary": "The function reached without an endpoint name",
                    "value": {
                      "error": {
                        "code": "not-found",
                        "message": "No compute endpoint is served at this address."
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Only POST, and OPTIONS for a CORS preflight.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Allow": {
                "required": true,
                "description": "The methods the endpoint takes.",
                "schema": {
                  "const": "POST, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "method-not-allowed": {
                    "summary": "A GET",
                    "value": {
                      "error": {
                        "code": "method-not-allowed",
                        "message": "This endpoint accepts POST with a JSON body, and OPTIONS."
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The body is over 16384 bytes.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "payload-too-large": {
                    "summary": "A body declared larger than 16384 bytes",
                    "value": {
                      "error": {
                        "code": "payload-too-large",
                        "message": "The body is larger than 16384 bytes.",
                        "limit": "body.bytes",
                        "max": 16384
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "The body is not sent as application/json.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unsupported-media-type": {
                    "summary": "A body sent as text/plain",
                    "value": {
                      "error": {
                        "code": "unsupported-media-type",
                        "message": "Send the body as application/json in UTF-8, without a content encoding."
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Over a per-address rate limit; Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: the length of the rate limit's window.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    60
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "rate-limited": {
                    "summary": "Over the per-address rate limit",
                    "value": {
                      "error": {
                        "code": "rate-limited",
                        "message": "Too many requests from this address. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 60
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "The engine could not complete the calculation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "calculation-failed": {
                    "summary": "The engine could not complete the calculation",
                    "value": {
                      "error": {
                        "code": "calculation-failed",
                        "message": "The engine could not complete this calculation."
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The compute endpoints are switched off, or their rate limit is not in place or could not be checked: they answer only while it is. Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: 300 when the rate limit could not be checked, 3600 when the API is switched off.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    300,
                    3600
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "disabled": {
                    "summary": "The switch is off",
                    "value": {
                      "error": {
                        "code": "disabled",
                        "message": "The compute API is switched off. Try again later.",
                        "retryAfterSeconds": 3600
                      }
                    }
                  },
                  "rate-limit-unavailable": {
                    "summary": "The rate limit is not in place, or could not be checked",
                    "value": {
                      "error": {
                        "code": "rate-limit-unavailable",
                        "message": "The compute API answers only while its rate limit is in place, and the limit could not be checked. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 300
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/events": {
      "options": {
        "operationId": "preflightEvents",
        "summary": "CORS preflight",
        "description": "Answered before anything else is checked, with no body, so that a page on another site can POST to the endpoint.",
        "tags": [
          "compute"
        ],
        "responses": {
          "204": {
            "description": "The methods and headers a cross-origin POST may use.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "POST, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "const": "Content-Type"
                }
              },
              "Access-Control-Max-Age": {
                "schema": {
                  "const": "86400"
                }
              },
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "computeEvents",
        "summary": "Sign ingresses, stations and lunations in a window",
        "description": "Sign ingresses of the requested bodies, their stations, and new and full moons, found by the engine's crossing search. Each crossing is bisected to within its search step divided by 2^24. Completeness is tested, not proven: sampling can miss a pair of crossings around a station that falls between two samples. Documentation: https://zodiacs.org/developers/compute/#events",
        "tags": [
          "compute"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EventsRequest"
              },
              "examples": {
                "october": {
                  "summary": "A month of ingresses, stations and lunations for three bodies",
                  "value": {
                    "from": "2026-10-01T00:00:00Z",
                    "to": "2026-11-01T00:00:00Z",
                    "bodies": [
                      "Sun",
                      "Mercury",
                      "Venus"
                    ],
                    "kinds": [
                      "ingress",
                      "station",
                      "lunation"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The result, the receipt, the backend and what to cite.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "No response is stored by a cache."
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventsResponse"
                },
                "examples": {
                  "october": {
                    "summary": "A month of ingresses, stations and lunations for three bodies",
                    "value": {
                      "schema": "zodiacs.compute-api.events.v1",
                      "result": {
                        "from": "2026-10-01T00:00:00.000Z",
                        "to": "2026-11-01T00:00:00.000Z",
                        "events": [
                          {
                            "kind": "station",
                            "body": "Venus",
                            "at": "2026-10-03T07:10:37.413Z",
                            "type": "retrograde",
                            "lon": 218.4866929646145,
                            "sign": "scorpio",
                            "degree": 8.486692964614463
                          },
                          {
                            "kind": "lunation",
                            "type": "new",
                            "at": "2026-10-10T15:50:02.099Z",
                            "lon": 197.36011327273553,
                            "sign": "libra",
                            "degree": 17.36011327273559
                          },
                          {
                            "kind": "ingress",
                            "body": "Sun",
                            "at": "2026-10-23T09:38:28.735Z",
                            "sign": "scorpio",
                            "retrograde": false
                          },
                          {
                            "kind": "station",
                            "body": "Mercury",
                            "at": "2026-10-24T07:15:23.404Z",
                            "type": "retrograde",
                            "lon": 230.97959569296665,
                            "sign": "scorpio",
                            "degree": 20.979595692966654
                          },
                          {
                            "kind": "ingress",
                            "body": "Venus",
                            "at": "2026-10-25T08:57:01.352Z",
                            "sign": "libra",
                            "retrograde": true
                          },
                          {
                            "kind": "lunation",
                            "type": "full",
                            "at": "2026-10-26T04:11:44.973Z",
                            "lon": 32.76151378202928,
                            "sign": "taurus",
                            "degree": 2.761513782029283
                          }
                        ]
                      },
                      "receipt": {
                        "schema": "zodiacs.compute-receipt.v1",
                        "endpoint": "events",
                        "engine": {
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17",
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          }
                        },
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "referenceSpan": {
                          "from": "1800-01-01T00:00:00.000Z",
                          "to": "2200-01-01T00:00:00.000Z"
                        },
                        "deltaT": [
                          {
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a"
                          },
                          {
                            "model": "zodiacs-deltat/1",
                            "table": "2026-09-24",
                            "tableDigest": "6371988c510a1c6c"
                          }
                        ],
                        "search": {
                          "solver": "engine-longitude-crossings",
                          "stepDays": {
                            "default": 5,
                            "moon": 1,
                            "elongation": 1
                          },
                          "bisections": 24,
                          "samples": 514,
                          "maxSamples": 12000,
                          "window": "start-exclusive-end-inclusive",
                          "completeness": "tested-not-proven"
                        }
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#events",
                        "receipt": "sha256:583f5cf91cd142c7cdd653e3568d272da0988b125e8ead7178aae7a63dc963f4",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The body is not JSON, or a field is missing, unknown or invalid.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid-request": {
                    "summary": "A latitude at a pole",
                    "value": {
                      "error": {
                        "code": "invalid-request",
                        "message": "Must be a number greater than -90 and less than 90; the engine does not compute angles at the poles.",
                        "pointer": "/latitude"
                      }
                    }
                  },
                  "invalid-json": {
                    "summary": "A body that is not JSON",
                    "value": {
                      "error": {
                        "code": "invalid-json",
                        "message": "The body is not valid JSON in UTF-8."
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The request reached the compute function by a path that is not one of the seven endpoints. The seven paths never answer it.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not-found": {
                    "summary": "The function reached without an endpoint name",
                    "value": {
                      "error": {
                        "code": "not-found",
                        "message": "No compute endpoint is served at this address."
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Only POST, and OPTIONS for a CORS preflight.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Allow": {
                "required": true,
                "description": "The methods the endpoint takes.",
                "schema": {
                  "const": "POST, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "method-not-allowed": {
                    "summary": "A GET",
                    "value": {
                      "error": {
                        "code": "method-not-allowed",
                        "message": "This endpoint accepts POST with a JSON body, and OPTIONS."
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The body is over 16384 bytes.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "payload-too-large": {
                    "summary": "A body declared larger than 16384 bytes",
                    "value": {
                      "error": {
                        "code": "payload-too-large",
                        "message": "The body is larger than 16384 bytes.",
                        "limit": "body.bytes",
                        "max": 16384
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "The body is not sent as application/json.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unsupported-media-type": {
                    "summary": "A body sent as text/plain",
                    "value": {
                      "error": {
                        "code": "unsupported-media-type",
                        "message": "Send the body as application/json in UTF-8, without a content encoding."
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "The request is over one of the endpoint's compute budgets, which the error names.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "budget-exhausted": {
                    "summary": "An events window longer than 92 days",
                    "value": {
                      "error": {
                        "code": "budget-exhausted",
                        "message": "An events window is at most 92 days long.",
                        "limit": "events.windowDays",
                        "max": 92
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Over a per-address rate limit; Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: the length of the rate limit's window.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    60
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "rate-limited": {
                    "summary": "Over the per-address rate limit",
                    "value": {
                      "error": {
                        "code": "rate-limited",
                        "message": "Too many requests from this address. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 60
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "The engine could not complete the calculation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "calculation-failed": {
                    "summary": "The engine could not complete the calculation",
                    "value": {
                      "error": {
                        "code": "calculation-failed",
                        "message": "The engine could not complete this calculation."
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The compute endpoints are switched off, or their rate limit is not in place or could not be checked: they answer only while it is. Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: 300 when the rate limit could not be checked, 3600 when the API is switched off.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    300,
                    3600
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "disabled": {
                    "summary": "The switch is off",
                    "value": {
                      "error": {
                        "code": "disabled",
                        "message": "The compute API is switched off. Try again later.",
                        "retryAfterSeconds": 3600
                      }
                    }
                  },
                  "rate-limit-unavailable": {
                    "summary": "The rate limit is not in place, or could not be checked",
                    "value": {
                      "error": {
                        "code": "rate-limit-unavailable",
                        "message": "The compute API answers only while its rate limit is in place, and the limit could not be checked. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 300
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/time": {
      "options": {
        "operationId": "preflightTime",
        "summary": "CORS preflight",
        "description": "Answered before anything else is checked, with no body, so that a page on another site can POST to the endpoint.",
        "tags": [
          "compute"
        ],
        "responses": {
          "204": {
            "description": "The methods and headers a cross-origin POST may use.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "POST, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "const": "Content-Type"
                }
              },
              "Access-Control-Max-Age": {
                "schema": {
                  "const": "86400"
                }
              },
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "computeTime",
        "summary": "A local civil time as UTC and TT, with ΔT and flags",
        "description": "The site's own local-time resolver: a repeated wall time takes the earlier instant (dst-fold), a skipped one moves forward by the gap (dst-gap). With a longitude, a time before the place adopted a legal time uses the place's own mean time (lmt), and a date up to 1970-01-01 in a zone the pinned tzdb release keeps takes that release's offsets, backzone included (zoneHistory pinned). Otherwise offsets come from the server's time zone data (zoneHistory runtime), and a date up to 1970-01-01 read that way has zoneUncertain true. Documentation: https://zodiacs.org/developers/compute/#time",
        "tags": [
          "compute"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TimeRequest"
              },
              "examples": {
                "pinned": {
                  "summary": "A wall time before 1970 with the birthplace longitude, read on the pinned zone history",
                  "value": {
                    "local": {
                      "date": "1947-07-01",
                      "time": "12:00",
                      "zone": "Europe/Stockholm"
                    },
                    "longitude": 18.07
                  }
                },
                "gap": {
                  "summary": "A wall time the spring clock change skipped",
                  "value": {
                    "local": {
                      "date": "2026-03-29",
                      "time": "02:30",
                      "zone": "Europe/Paris"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The result, the receipt, the backend and what to cite.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "No response is stored by a cache."
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeResponse"
                },
                "examples": {
                  "pinned": {
                    "summary": "A wall time before 1970 with the birthplace longitude, read on the pinned zone history",
                    "value": {
                      "schema": "zodiacs.compute-api.time.v1",
                      "result": {
                        "utc": "1947-07-01T11:00:00.000Z",
                        "offsetMinutes": 60,
                        "flags": [],
                        "localMeanTime": null,
                        "zoneHistory": "pinned",
                        "zoneUncertain": false,
                        "tt": "1947-07-01T11:00:28.008",
                        "deltaT": {
                          "seconds": 28.008138261464772,
                          "sigma": 0.46,
                          "model": "zodiacs-deltat/1",
                          "table": "2026-09-24",
                          "tableDigest": "6371988c510a1c6c",
                          "segment": "reconstructed"
                        },
                        "timeScale": {
                          "input": "utc",
                          "basis": "delta-t",
                          "ut1MinusUtc": null,
                          "leapSeconds": null
                        }
                      },
                      "receipt": {
                        "schema": "zodiacs.compute-receipt.v1",
                        "endpoint": "time",
                        "engine": {
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17",
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          }
                        },
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "referenceSpan": {
                          "from": "1800-01-01T00:00:00.000Z",
                          "to": "2200-01-01T00:00:00.000Z"
                        },
                        "deltaT": [
                          {
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a"
                          },
                          {
                            "model": "zodiacs-deltat/1",
                            "table": "2026-09-24",
                            "tableDigest": "6371988c510a1c6c"
                          }
                        ],
                        "timeResolution": {
                          "resolver": "src/lib/time/localToUtc.ts",
                          "policy": {
                            "fold": "earlier",
                            "gap": "shift-forward"
                          },
                          "pinnedTzdb": {
                            "release": "2025c",
                            "dataForm": "main+backzone",
                            "appliesBefore": "1970-01-02",
                            "requires": "longitude"
                          },
                          "runtimeTzdb": "2026c"
                        }
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#time",
                        "receipt": "sha256:f23992e1697f119c228fc1fc3263959ce921f6f94ed89bb174aca4e9a0967613",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  },
                  "gap": {
                    "summary": "A wall time the spring clock change skipped",
                    "value": {
                      "schema": "zodiacs.compute-api.time.v1",
                      "result": {
                        "utc": "2026-03-29T01:30:00.000Z",
                        "offsetMinutes": 120,
                        "flags": [
                          "dst-gap"
                        ],
                        "localMeanTime": null,
                        "zoneHistory": "runtime",
                        "zoneUncertain": false,
                        "tt": "2026-03-29T01:31:09.184",
                        "deltaT": {
                          "seconds": 69.13070825195312,
                          "sigma": 0.000817,
                          "model": "iers-utc/1",
                          "table": "2026-09-24",
                          "tableDigest": "064d98b4a531053a",
                          "segment": "observed"
                        },
                        "timeScale": {
                          "input": "utc",
                          "basis": "iers",
                          "ut1MinusUtc": {
                            "seconds": 0.053291666666666515,
                            "sigma": 0.000817,
                            "source": "observed"
                          },
                          "leapSeconds": {
                            "taiMinusUtc": 37,
                            "listed": true
                          }
                        }
                      },
                      "receipt": {
                        "schema": "zodiacs.compute-receipt.v1",
                        "endpoint": "time",
                        "engine": {
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17",
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          }
                        },
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "referenceSpan": {
                          "from": "1800-01-01T00:00:00.000Z",
                          "to": "2200-01-01T00:00:00.000Z"
                        },
                        "deltaT": [
                          {
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a"
                          },
                          {
                            "model": "zodiacs-deltat/1",
                            "table": "2026-09-24",
                            "tableDigest": "6371988c510a1c6c"
                          }
                        ],
                        "timeResolution": {
                          "resolver": "src/lib/time/localToUtc.ts",
                          "policy": {
                            "fold": "earlier",
                            "gap": "shift-forward"
                          },
                          "pinnedTzdb": {
                            "release": "2025c",
                            "dataForm": "main+backzone",
                            "appliesBefore": "1970-01-02",
                            "requires": "longitude"
                          },
                          "runtimeTzdb": "2026c"
                        }
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#time",
                        "receipt": "sha256:f23992e1697f119c228fc1fc3263959ce921f6f94ed89bb174aca4e9a0967613",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The body is not JSON, or a field is missing, unknown or invalid.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid-request": {
                    "summary": "A latitude at a pole",
                    "value": {
                      "error": {
                        "code": "invalid-request",
                        "message": "Must be a number greater than -90 and less than 90; the engine does not compute angles at the poles.",
                        "pointer": "/latitude"
                      }
                    }
                  },
                  "invalid-json": {
                    "summary": "A body that is not JSON",
                    "value": {
                      "error": {
                        "code": "invalid-json",
                        "message": "The body is not valid JSON in UTF-8."
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The request reached the compute function by a path that is not one of the seven endpoints. The seven paths never answer it.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not-found": {
                    "summary": "The function reached without an endpoint name",
                    "value": {
                      "error": {
                        "code": "not-found",
                        "message": "No compute endpoint is served at this address."
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Only POST, and OPTIONS for a CORS preflight.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Allow": {
                "required": true,
                "description": "The methods the endpoint takes.",
                "schema": {
                  "const": "POST, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "method-not-allowed": {
                    "summary": "A GET",
                    "value": {
                      "error": {
                        "code": "method-not-allowed",
                        "message": "This endpoint accepts POST with a JSON body, and OPTIONS."
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The body is over 16384 bytes.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "payload-too-large": {
                    "summary": "A body declared larger than 16384 bytes",
                    "value": {
                      "error": {
                        "code": "payload-too-large",
                        "message": "The body is larger than 16384 bytes.",
                        "limit": "body.bytes",
                        "max": 16384
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "The body is not sent as application/json.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unsupported-media-type": {
                    "summary": "A body sent as text/plain",
                    "value": {
                      "error": {
                        "code": "unsupported-media-type",
                        "message": "Send the body as application/json in UTF-8, without a content encoding."
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Over a per-address rate limit; Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: the length of the rate limit's window.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    60
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "rate-limited": {
                    "summary": "Over the per-address rate limit",
                    "value": {
                      "error": {
                        "code": "rate-limited",
                        "message": "Too many requests from this address. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 60
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "The engine could not complete the calculation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "calculation-failed": {
                    "summary": "The engine could not complete the calculation",
                    "value": {
                      "error": {
                        "code": "calculation-failed",
                        "message": "The engine could not complete this calculation."
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The compute endpoints are switched off, or their rate limit is not in place or could not be checked: they answer only while it is. Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: 300 when the rate limit could not be checked, 3600 when the API is switched off.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    300,
                    3600
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "disabled": {
                    "summary": "The switch is off",
                    "value": {
                      "error": {
                        "code": "disabled",
                        "message": "The compute API is switched off. Try again later.",
                        "retryAfterSeconds": 3600
                      }
                    }
                  },
                  "rate-limit-unavailable": {
                    "summary": "The rate limit is not in place, or could not be checked",
                    "value": {
                      "error": {
                        "code": "rate-limit-unavailable",
                        "message": "The compute API answers only while its rate limit is in place, and the limit could not be checked. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 300
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/sky-fact": {
      "options": {
        "operationId": "preflightSkyFact",
        "summary": "CORS preflight",
        "description": "Answered before anything else is checked, with no body, so that a page on another site can POST to the endpoint.",
        "tags": [
          "compute"
        ],
        "responses": {
          "204": {
            "description": "The methods and headers a cross-origin POST may use.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "POST, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "const": "Content-Type"
                }
              },
              "Access-Control-Max-Age": {
                "schema": {
                  "const": "86400"
                }
              },
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "computeSkyFact",
        "summary": "Whether a stated fact about the sky holds: true, false or depends",
        "description": "A structured fact, never interpretive text, answered true, false or depends, with the computed values that decide it. A fact about a date is depends when the answer turns on the time of day or, with no zone given, on the zone. Documentation: https://zodiacs.org/developers/compute/#sky-fact",
        "tags": [
          "compute"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkyFactRequest"
              },
              "examples": {
                "retrograde": {
                  "summary": "Is Mercury retrograde on a date in a zone? It stations that day.",
                  "value": {
                    "kind": "retrograde",
                    "body": "Mercury",
                    "date": "2026-10-24",
                    "zone": "America/New_York"
                  }
                },
                "phase": {
                  "summary": "Is there a full moon on a date, in every zone?",
                  "value": {
                    "kind": "phase",
                    "phase": "full",
                    "date": "2026-10-26"
                  }
                },
                "sign": {
                  "summary": "Is the Moon in Aries at an instant?",
                  "value": {
                    "kind": "sign",
                    "body": "Moon",
                    "sign": "aries",
                    "instant": "2026-09-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The result, the receipt, the backend and what to cite.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "No response is stored by a cache."
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkyFactResponse"
                },
                "examples": {
                  "retrograde": {
                    "summary": "Is Mercury retrograde on a date in a zone? It stations that day.",
                    "value": {
                      "schema": "zodiacs.compute-api.sky-fact.v1",
                      "result": {
                        "answer": "depends",
                        "basis": "local-day",
                        "fact": {
                          "kind": "retrograde",
                          "body": "Mercury",
                          "instant": null,
                          "date": "2026-10-24",
                          "zone": "America/New_York"
                        },
                        "instant": null,
                        "window": {
                          "from": "2026-10-24T04:00:00.000Z",
                          "to": "2026-10-25T04:00:00.000Z"
                        },
                        "zone": {
                          "start": {
                            "utc": "2026-10-24T04:00:00.000Z",
                            "offsetMinutes": -240,
                            "flags": [],
                            "localMeanTime": null,
                            "zoneHistory": "runtime",
                            "zoneUncertain": false
                          },
                          "end": {
                            "utc": "2026-10-25T04:00:00.000Z",
                            "offsetMinutes": -240,
                            "flags": [],
                            "localMeanTime": null,
                            "zoneHistory": "runtime",
                            "zoneUncertain": false
                          }
                        },
                        "facts": {
                          "atStart": {
                            "lon": 230.97838063267932,
                            "sign": "scorpio",
                            "degree": 20.97838063267932,
                            "speed": 0.017881744440728653,
                            "retrograde": false
                          },
                          "atEnd": {
                            "lon": 230.92918581450553,
                            "sign": "scorpio",
                            "degree": 20.92918581450556,
                            "speed": -0.11772560490896922,
                            "retrograde": true
                          },
                          "stations": [
                            {
                              "at": "2026-10-24T07:15:23.391Z",
                              "type": "retrograde"
                            }
                          ],
                          "flags": []
                        }
                      },
                      "receipt": {
                        "schema": "zodiacs.compute-receipt.v1",
                        "endpoint": "sky-fact",
                        "engine": {
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17",
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          }
                        },
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "referenceSpan": {
                          "from": "1800-01-01T00:00:00.000Z",
                          "to": "2200-01-01T00:00:00.000Z"
                        },
                        "deltaT": [
                          {
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a"
                          },
                          {
                            "model": "zodiacs-deltat/1",
                            "table": "2026-09-24",
                            "tableDigest": "6371988c510a1c6c"
                          }
                        ],
                        "timeResolution": {
                          "resolver": "src/lib/time/localToUtc.ts",
                          "policy": {
                            "fold": "earlier",
                            "gap": "shift-forward"
                          },
                          "pinnedTzdb": {
                            "release": "2025c",
                            "dataForm": "main+backzone",
                            "appliesBefore": "1970-01-02",
                            "requires": "longitude"
                          },
                          "runtimeTzdb": "2026c"
                        },
                        "search": {
                          "solver": "engine-longitude-crossings",
                          "stepDays": {
                            "default": 5,
                            "moon": 1,
                            "elongation": 1
                          },
                          "bisections": 24,
                          "samples": 26,
                          "maxSamples": 1000,
                          "window": "start-exclusive-end-inclusive",
                          "completeness": "tested-not-proven"
                        }
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#sky-fact",
                        "receipt": "sha256:c4b8f0e87894ba98a398f10a3862ecefbae614f2efad1a87d21a8a964a3f820d",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  },
                  "phase": {
                    "summary": "Is there a full moon on a date, in every zone?",
                    "value": {
                      "schema": "zodiacs.compute-api.sky-fact.v1",
                      "result": {
                        "answer": "depends",
                        "basis": "any-zone-day",
                        "fact": {
                          "kind": "phase",
                          "phase": "full",
                          "date": "2026-10-26",
                          "zone": null
                        },
                        "instant": null,
                        "window": {
                          "from": "2026-10-25T10:00:00.000Z",
                          "to": "2026-10-27T12:00:00.000Z"
                        },
                        "zone": null,
                        "facts": {
                          "lunations": [
                            {
                              "at": "2026-10-26T04:11:44.971Z",
                              "lon": 32.76151344913791,
                              "sign": "taurus",
                              "degree": 2.761513449137908
                            }
                          ],
                          "flags": []
                        }
                      },
                      "receipt": {
                        "schema": "zodiacs.compute-receipt.v1",
                        "endpoint": "sky-fact",
                        "engine": {
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17",
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          }
                        },
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "referenceSpan": {
                          "from": "1800-01-01T00:00:00.000Z",
                          "to": "2200-01-01T00:00:00.000Z"
                        },
                        "deltaT": [
                          {
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a"
                          },
                          {
                            "model": "zodiacs-deltat/1",
                            "table": "2026-09-24",
                            "tableDigest": "6371988c510a1c6c"
                          }
                        ],
                        "search": {
                          "solver": "engine-longitude-crossings",
                          "stepDays": {
                            "default": 5,
                            "moon": 1,
                            "elongation": 1
                          },
                          "bisections": 24,
                          "samples": 28,
                          "maxSamples": 1000,
                          "window": "start-exclusive-end-inclusive",
                          "completeness": "tested-not-proven"
                        }
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#sky-fact",
                        "receipt": "sha256:861398138e8de184ca1220812d4b61cc5001e1379be8a53fbcea6d95782c783d",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  },
                  "sign": {
                    "summary": "Is the Moon in Aries at an instant?",
                    "value": {
                      "schema": "zodiacs.compute-api.sky-fact.v1",
                      "result": {
                        "answer": "false",
                        "basis": "instant",
                        "fact": {
                          "kind": "sign",
                          "body": "Moon",
                          "sign": "aries",
                          "instant": "2026-09-29T12:00:00.000Z",
                          "date": null,
                          "zone": null
                        },
                        "instant": "2026-09-29T12:00:00.000Z",
                        "window": null,
                        "zone": null,
                        "facts": {
                          "lon": 42.542105382281534,
                          "sign": "taurus",
                          "degree": 12.542105382281534,
                          "speed": 14.176528919762177,
                          "retrograde": false,
                          "deltaT": {
                            "seconds": 69.20533325195312,
                            "sigma": 0.0012697,
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a",
                            "segment": "predicted"
                          },
                          "timeScale": {
                            "input": "utc",
                            "basis": "iers",
                            "ut1MinusUtc": {
                              "seconds": -0.02133333333333809,
                              "sigma": 0.0012697,
                              "source": "predicted"
                            },
                            "leapSeconds": {
                              "taiMinusUtc": 37,
                              "listed": true
                            }
                          },
                          "boundaryMarginArcsec": 45151.57937621352,
                          "flags": []
                        }
                      },
                      "receipt": {
                        "schema": "zodiacs.compute-receipt.v1",
                        "endpoint": "sky-fact",
                        "engine": {
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17",
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          }
                        },
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "referenceSpan": {
                          "from": "1800-01-01T00:00:00.000Z",
                          "to": "2200-01-01T00:00:00.000Z"
                        },
                        "deltaT": [
                          {
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a"
                          },
                          {
                            "model": "zodiacs-deltat/1",
                            "table": "2026-09-24",
                            "tableDigest": "6371988c510a1c6c"
                          }
                        ]
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#sky-fact",
                        "receipt": "sha256:0e266d089ab43f31d907b6c0fe2a1ff9479a0e483add84a7da384c3748465d2e",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The body is not JSON, or a field is missing, unknown or invalid.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid-request": {
                    "summary": "A latitude at a pole",
                    "value": {
                      "error": {
                        "code": "invalid-request",
                        "message": "Must be a number greater than -90 and less than 90; the engine does not compute angles at the poles.",
                        "pointer": "/latitude"
                      }
                    }
                  },
                  "invalid-json": {
                    "summary": "A body that is not JSON",
                    "value": {
                      "error": {
                        "code": "invalid-json",
                        "message": "The body is not valid JSON in UTF-8."
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The request reached the compute function by a path that is not one of the seven endpoints. The seven paths never answer it.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not-found": {
                    "summary": "The function reached without an endpoint name",
                    "value": {
                      "error": {
                        "code": "not-found",
                        "message": "No compute endpoint is served at this address."
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Only POST, and OPTIONS for a CORS preflight.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Allow": {
                "required": true,
                "description": "The methods the endpoint takes.",
                "schema": {
                  "const": "POST, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "method-not-allowed": {
                    "summary": "A GET",
                    "value": {
                      "error": {
                        "code": "method-not-allowed",
                        "message": "This endpoint accepts POST with a JSON body, and OPTIONS."
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The body is over 16384 bytes.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "payload-too-large": {
                    "summary": "A body declared larger than 16384 bytes",
                    "value": {
                      "error": {
                        "code": "payload-too-large",
                        "message": "The body is larger than 16384 bytes.",
                        "limit": "body.bytes",
                        "max": 16384
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "The body is not sent as application/json.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unsupported-media-type": {
                    "summary": "A body sent as text/plain",
                    "value": {
                      "error": {
                        "code": "unsupported-media-type",
                        "message": "Send the body as application/json in UTF-8, without a content encoding."
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "The request is over one of the endpoint's compute budgets, which the error names.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "budget-exhausted": {
                    "summary": "An events window longer than 92 days",
                    "value": {
                      "error": {
                        "code": "budget-exhausted",
                        "message": "An events window is at most 92 days long.",
                        "limit": "events.windowDays",
                        "max": 92
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Over a per-address rate limit; Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: the length of the rate limit's window.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    60
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "rate-limited": {
                    "summary": "Over the per-address rate limit",
                    "value": {
                      "error": {
                        "code": "rate-limited",
                        "message": "Too many requests from this address. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 60
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "The engine could not complete the calculation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "calculation-failed": {
                    "summary": "The engine could not complete the calculation",
                    "value": {
                      "error": {
                        "code": "calculation-failed",
                        "message": "The engine could not complete this calculation."
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The compute endpoints are switched off, or their rate limit is not in place or could not be checked: they answer only while it is. Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: 300 when the rate limit could not be checked, 3600 when the API is switched off.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    300,
                    3600
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "disabled": {
                    "summary": "The switch is off",
                    "value": {
                      "error": {
                        "code": "disabled",
                        "message": "The compute API is switched off. Try again later.",
                        "retryAfterSeconds": 3600
                      }
                    }
                  },
                  "rate-limit-unavailable": {
                    "summary": "The rate limit is not in place, or could not be checked",
                    "value": {
                      "error": {
                        "code": "rate-limit-unavailable",
                        "message": "The compute API answers only while its rate limit is in place, and the limit could not be checked. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 300
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/elections": {
      "options": {
        "operationId": "preflightElections",
        "summary": "CORS preflight",
        "description": "Answered before anything else is checked, with no body, so that a page on another site can POST to the endpoint.",
        "tags": [
          "compute"
        ],
        "responses": {
          "204": {
            "description": "The methods and headers a cross-origin POST may use.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "const": "POST, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "const": "Content-Type"
                }
              },
              "Access-Control-Max-Age": {
                "schema": {
                  "const": "86400"
                }
              },
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "computeElections",
        "summary": "The windows in which every condition holds: the Moon's phase, void of course, a sign, retrograde, a body angular",
        "description": "An election search: every stretch of the window in which all the conditions hold. Sign changes, stations and the Moon's new and full phases come from the engine's crossing search; void periods from the Moon's sign changes and its last exact aspect before each; house changes from natalChart, sampled every 60 minutes inside the stretches the other conditions leave, more finely where a body passes more than one house between samples. Every boundary is within a second. Completeness is tested, not proven: on 100 random requests it found the same windows as a scan of every 10 seconds, every end within 5.4 seconds. Documentation: https://zodiacs.org/developers/compute/#elections",
        "tags": [
          "compute"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ElectionsRequest"
              },
              "examples": {
                "london": {
                  "summary": "Three days in London with the Moon waxing and not void of course, Mercury direct and Jupiter in an angular house",
                  "value": {
                    "from": "2026-12-09T00:00:00Z",
                    "to": "2026-12-12T00:00:00Z",
                    "conditions": [
                      {
                        "kind": "phase",
                        "phase": "waxing"
                      },
                      {
                        "kind": "void-of-course",
                        "not": true
                      },
                      {
                        "kind": "retrograde",
                        "body": "Mercury",
                        "not": true
                      },
                      {
                        "kind": "angular",
                        "body": "Jupiter"
                      }
                    ],
                    "place": {
                      "latitude": 51.5072,
                      "longitude": -0.1276,
                      "houseSystem": "placidus"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The result, the receipt, the backend and what to cite.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "No response is stored by a cache."
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ElectionsResponse"
                },
                "examples": {
                  "london": {
                    "summary": "Three days in London with the Moon waxing and not void of course, Mercury direct and Jupiter in an angular house",
                    "value": {
                      "schema": "zodiacs.compute-api.elections.v1",
                      "result": {
                        "from": "2026-12-09T00:00:00.000Z",
                        "to": "2026-12-12T00:00:00.000Z",
                        "conditions": [
                          {
                            "kind": "phase",
                            "phase": "waxing",
                            "not": false
                          },
                          {
                            "kind": "void-of-course",
                            "not": true
                          },
                          {
                            "kind": "retrograde",
                            "body": "Mercury",
                            "not": true
                          },
                          {
                            "kind": "angular",
                            "body": "Jupiter",
                            "not": false
                          }
                        ],
                        "place": {
                          "latitude": 51.5072,
                          "longitude": -0.1276,
                          "houseSystem": "placidus"
                        },
                        "windows": [
                          {
                            "from": "2026-12-09T02:24:20.752Z",
                            "to": "2026-12-09T04:45:34.147Z"
                          },
                          {
                            "from": "2026-12-09T09:28:00.566Z",
                            "to": "2026-12-09T11:49:13.506Z"
                          },
                          {
                            "from": "2026-12-09T15:05:29.540Z",
                            "to": "2026-12-09T16:43:37.532Z"
                          },
                          {
                            "from": "2026-12-09T19:59:53.735Z",
                            "to": "2026-12-09T21:06:08.514Z"
                          },
                          {
                            "from": "2026-12-10T03:08:42.945Z",
                            "to": "2026-12-10T04:41:40.604Z"
                          },
                          {
                            "from": "2026-12-10T09:24:06.211Z",
                            "to": "2026-12-10T11:45:18.589Z"
                          },
                          {
                            "from": "2026-12-10T15:01:35.394Z",
                            "to": "2026-12-10T16:39:43.613Z"
                          }
                        ],
                        "flags": []
                      },
                      "receipt": {
                        "schema": "zodiacs.compute-receipt.v1",
                        "endpoint": "elections",
                        "engine": {
                          "name": "@zodiacs/engine",
                          "version": "0.1.1-rc.17",
                          "ephemeris": {
                            "name": "astronomy-engine",
                            "version": "2.1.19"
                          }
                        },
                        "conventions": {
                          "angles": "gast-and-true-obliquity",
                          "aspects": "major-aspects;sun-moon-eight-planets;no-nodes;applying-instantaneous-orb-rate",
                          "calendar": "proleptic-gregorian",
                          "deltaT": "tt-minus-ut1;value-in-result",
                          "localTime": "tzdb-shards-before-1970;host-intl-from-1970;flags-from-transition-record",
                          "longitudeUnit": "degrees-[0,360)",
                          "moonNodes": "instantaneous-geocentric-moon-orbit-plane",
                          "moonPosition": "astronomy-engine-geo-moon;no-light-time;no-aberration",
                          "nutation": "iau2000b;equation-of-equinoxes-with-two-complementary-terms",
                          "planetPositions": "aberrated-geocentric-ecliptic-of-date;no-deflection",
                          "speed": "degrees-per-day;central-difference-plus-minus-0.001-day;nodes-plus-minus-0.25-day",
                          "timeScale": "tt-from-leap-seconds-and-ut1-from-iers-1972-to-table-end;delta-t-model-otherwise;in-result",
                          "zodiac": "tropical"
                        },
                        "coverage": {
                          "angleExclusions": "exact-geographic-poles-and-ecliptic-horizon-coincidence",
                          "assessment": "finite-reference-cases-only",
                          "broadDateRange": "not-certified",
                          "inputSyntax": "not-an-astronomical-accuracy-guarantee"
                        },
                        "referenceSpan": {
                          "from": "1800-01-01T00:00:00.000Z",
                          "to": "2200-01-01T00:00:00.000Z"
                        },
                        "deltaT": [
                          {
                            "model": "iers-utc/1",
                            "table": "2026-09-24",
                            "tableDigest": "064d98b4a531053a"
                          },
                          {
                            "model": "zodiacs-deltat/1",
                            "table": "2026-09-24",
                            "tableDigest": "6371988c510a1c6c"
                          }
                        ],
                        "electionSearch": {
                          "solver": "engine-longitude-crossings-and-sampled-houses",
                          "stepDays": {
                            "default": 5,
                            "moon": 1,
                            "elongation": 1
                          },
                          "voidOfCourse": {
                            "convention": "last-exact-ptolemaic-aspect-to-sign-exit",
                            "bodies": "modern",
                            "scanHours": 3
                          },
                          "houseSampleMinutes": 60,
                          "boundarySeconds": 1,
                          "resolutionSeconds": 2,
                          "fullCalculationCost": 25,
                          "samples": 3689,
                          "maxSamples": 6000,
                          "window": "start-inclusive-end-exclusive",
                          "completeness": "tested-not-proven"
                        }
                      },
                      "backend": {
                        "name": "@zodiacs/engine",
                        "version": "0.1.1-rc.17",
                        "ephemeris": {
                          "name": "astronomy-engine",
                          "version": "2.1.19"
                        }
                      },
                      "cite": {
                        "url": "https://zodiacs.org/developers/compute/#elections",
                        "receipt": "sha256:dea73cfc821cd8b9969862b6e4a6504c894045d24b06fba4b2e1cee969330dcc",
                        "engine": "@zodiacs/engine",
                        "version": "0.1.1-rc.17"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The body is not JSON, or a field is missing, unknown or invalid.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "invalid-request": {
                    "summary": "A latitude at a pole",
                    "value": {
                      "error": {
                        "code": "invalid-request",
                        "message": "Must be a number greater than -90 and less than 90; the engine does not compute angles at the poles.",
                        "pointer": "/latitude"
                      }
                    }
                  },
                  "invalid-json": {
                    "summary": "A body that is not JSON",
                    "value": {
                      "error": {
                        "code": "invalid-json",
                        "message": "The body is not valid JSON in UTF-8."
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "The request reached the compute function by a path that is not one of the seven endpoints. The seven paths never answer it.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "not-found": {
                    "summary": "The function reached without an endpoint name",
                    "value": {
                      "error": {
                        "code": "not-found",
                        "message": "No compute endpoint is served at this address."
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "Only POST, and OPTIONS for a CORS preflight.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Allow": {
                "required": true,
                "description": "The methods the endpoint takes.",
                "schema": {
                  "const": "POST, OPTIONS"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "method-not-allowed": {
                    "summary": "A GET",
                    "value": {
                      "error": {
                        "code": "method-not-allowed",
                        "message": "This endpoint accepts POST with a JSON body, and OPTIONS."
                      }
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "The body is over 16384 bytes.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "payload-too-large": {
                    "summary": "A body declared larger than 16384 bytes",
                    "value": {
                      "error": {
                        "code": "payload-too-large",
                        "message": "The body is larger than 16384 bytes.",
                        "limit": "body.bytes",
                        "max": 16384
                      }
                    }
                  }
                }
              }
            }
          },
          "415": {
            "description": "The body is not sent as application/json.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unsupported-media-type": {
                    "summary": "A body sent as text/plain",
                    "value": {
                      "error": {
                        "code": "unsupported-media-type",
                        "message": "Send the body as application/json in UTF-8, without a content encoding."
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "The request is over one of the endpoint's compute budgets, which the error names.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "budget-exhausted": {
                    "summary": "An events window longer than 92 days",
                    "value": {
                      "error": {
                        "code": "budget-exhausted",
                        "message": "An events window is at most 92 days long.",
                        "limit": "events.windowDays",
                        "max": 92
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Over a per-address rate limit; Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: the length of the rate limit's window.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    60
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "rate-limited": {
                    "summary": "Over the per-address rate limit",
                    "value": {
                      "error": {
                        "code": "rate-limited",
                        "message": "Too many requests from this address. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 60
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "The engine could not complete the calculation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "calculation-failed": {
                    "summary": "The engine could not complete the calculation",
                    "value": {
                      "error": {
                        "code": "calculation-failed",
                        "message": "The engine could not complete this calculation."
                      }
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The compute endpoints are switched off, or their rate limit is not in place or could not be checked: they answer only while it is. Retry-After gives the seconds to wait.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                }
              },
              "Access-Control-Allow-Origin": {
                "schema": {
                  "const": "*"
                }
              },
              "Retry-After": {
                "required": true,
                "description": "Seconds to wait before trying again: 300 when the rate limit could not be checked, 3600 when the API is switched off.",
                "schema": {
                  "type": "integer",
                  "enum": [
                    300,
                    3600
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "disabled": {
                    "summary": "The switch is off",
                    "value": {
                      "error": {
                        "code": "disabled",
                        "message": "The compute API is switched off. Try again later.",
                        "retryAfterSeconds": 3600
                      }
                    }
                  },
                  "rate-limit-unavailable": {
                    "summary": "The rate limit is not in place, or could not be checked",
                    "value": {
                      "error": {
                        "code": "rate-limit-unavailable",
                        "message": "The compute API answers only while its rate limit is in place, and the limit could not be checked. Try again after the interval in Retry-After.",
                        "retryAfterSeconds": 300
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "index": {
        "title": "Sky data API index",
        "description": "Every endpoint and document the API publishes, with coverage.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "api",
          "summary",
          "coverage",
          "endpoints",
          "documents"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "api": {
            "type": "string",
            "format": "uri"
          },
          "summary": {
            "type": "string"
          },
          "versioning": {
            "type": "string"
          },
          "coverage": {
            "type": "object",
            "required": [
              "dailyDate",
              "years",
              "dataVintage"
            ],
            "properties": {
              "dailyDate": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
              },
              "years": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "integer"
                  },
                  "to": {
                    "type": "integer"
                  }
                }
              },
              "dataVintage": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "path",
                "description",
                "updates",
                "schema"
              ],
              "properties": {
                "path": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "updates": {
                  "type": "string"
                },
                "schema": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "documents": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "path",
                "description",
                "contentType"
              ],
              "properties": {
                "path": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "contentType": {
                  "type": "string"
                }
              }
            }
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "today": {
        "title": "Today's sky",
        "description": "Positions, moon phase, active retrogrades, next lunations, and exact events for one UTC date.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "date",
          "snapshotAt",
          "summary",
          "bodies",
          "moon",
          "retrogrades",
          "events"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "date": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          },
          "snapshotAt": {
            "type": "string",
            "format": "date-time"
          },
          "summary": {
            "type": "string"
          },
          "positions": {
            "type": "string"
          },
          "bodies": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "required": [
                "body",
                "lon",
                "sign",
                "degree",
                "retrograde",
                "signName",
                "position"
              ],
              "properties": {
                "body": {
                  "type": "string"
                },
                "lon": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 360
                },
                "sign": {
                  "type": "string",
                  "pattern": "^[a-z]+$"
                },
                "signName": {
                  "type": "string"
                },
                "glyph": {
                  "type": "string"
                },
                "degree": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 30
                },
                "retrograde": {
                  "type": "boolean"
                },
                "position": {
                  "type": "string"
                }
              }
            }
          },
          "moon": {
            "type": "object",
            "required": [
              "phase",
              "illumination",
              "illuminationPercent",
              "nextFullMoon",
              "nextNewMoon"
            ],
            "properties": {
              "phase": {
                "type": "string"
              },
              "illumination": {
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              "illuminationPercent": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "nextFullMoon": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "type",
                      "at",
                      "label"
                    ],
                    "properties": {
                      "type": {
                        "enum": [
                          "full",
                          "new"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "sign": {
                        "type": "string",
                        "pattern": "^[a-z]+$"
                      },
                      "signName": {
                        "type": "string"
                      },
                      "degree": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 30
                      },
                      "name": {
                        "type": "string"
                      },
                      "label": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "when": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "nextNewMoon": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "type",
                      "at",
                      "label"
                    ],
                    "properties": {
                      "type": {
                        "enum": [
                          "full",
                          "new"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "sign": {
                        "type": "string",
                        "pattern": "^[a-z]+$"
                      },
                      "signName": {
                        "type": "string"
                      },
                      "degree": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 30
                      },
                      "name": {
                        "type": "string"
                      },
                      "label": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "when": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "retrogrades": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "planet",
                "from",
                "to",
                "preShadowStart",
                "postShadowEnd",
                "clippedStart",
                "clippedEnd",
                "stationRetrograde",
                "stationDirect",
                "stationRetrogradeSign",
                "stationDirectSign",
                "durationDays",
                "label"
              ],
              "properties": {
                "planet": {
                  "type": "string"
                },
                "from": {
                  "type": "string",
                  "format": "date-time"
                },
                "to": {
                  "type": "string",
                  "format": "date-time"
                },
                "preShadowStart": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "postShadowEnd": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "clippedStart": {
                  "type": "boolean"
                },
                "clippedEnd": {
                  "type": "boolean"
                },
                "stationRetrograde": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "stationDirect": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "stationRetrogradeSign": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "stationDirectSign": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "durationDays": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "label": {
                  "type": "string"
                }
              }
            }
          },
          "eventsCoverage": {
            "type": "string"
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "kind",
                "at",
                "label"
              ],
              "properties": {
                "kind": {
                  "type": "string"
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "label": {
                  "type": "string"
                }
              }
            }
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "links": {
            "type": "object"
          }
        }
      },
      "upcoming": {
        "title": "Upcoming sky events",
        "description": "Lunations, ingresses, stations, eclipses, and exact aspects over a rolling window, plus the next occurrence of each kind.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "from",
          "to",
          "windowDays",
          "summary",
          "counts",
          "nextByKind",
          "events"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "windowDays": {
            "type": "integer"
          },
          "summary": {
            "type": "string"
          },
          "counts": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "nextByKind": {
            "type": "object",
            "required": [
              "nextNewMoon",
              "nextFullMoon",
              "nextSolarEclipse",
              "nextLunarEclipse",
              "nextIngress",
              "nextSunIngress",
              "nextStation",
              "mercuryRetrograde"
            ],
            "properties": {
              "nextNewMoon": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "kind",
                      "at",
                      "when",
                      "daysAway",
                      "label"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "lunation",
                          "ingress",
                          "station",
                          "eclipse",
                          "aspect"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "when": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "label": {
                        "type": "string"
                      },
                      "eclipseKind": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "nextFullMoon": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "kind",
                      "at",
                      "when",
                      "daysAway",
                      "label"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "lunation",
                          "ingress",
                          "station",
                          "eclipse",
                          "aspect"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "when": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "label": {
                        "type": "string"
                      },
                      "eclipseKind": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "nextSolarEclipse": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "kind",
                      "at",
                      "when",
                      "daysAway",
                      "label"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "lunation",
                          "ingress",
                          "station",
                          "eclipse",
                          "aspect"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "when": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "label": {
                        "type": "string"
                      },
                      "eclipseKind": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "nextLunarEclipse": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "kind",
                      "at",
                      "when",
                      "daysAway",
                      "label"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "lunation",
                          "ingress",
                          "station",
                          "eclipse",
                          "aspect"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "when": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "label": {
                        "type": "string"
                      },
                      "eclipseKind": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "nextIngress": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "kind",
                      "at",
                      "when",
                      "daysAway",
                      "label"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "lunation",
                          "ingress",
                          "station",
                          "eclipse",
                          "aspect"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "when": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "label": {
                        "type": "string"
                      },
                      "eclipseKind": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "nextSunIngress": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "kind",
                      "at",
                      "when",
                      "daysAway",
                      "label"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "lunation",
                          "ingress",
                          "station",
                          "eclipse",
                          "aspect"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "when": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "label": {
                        "type": "string"
                      },
                      "eclipseKind": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "nextStation": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "kind",
                      "at",
                      "when",
                      "daysAway",
                      "label"
                    ],
                    "properties": {
                      "kind": {
                        "enum": [
                          "lunation",
                          "ingress",
                          "station",
                          "eclipse",
                          "aspect"
                        ]
                      },
                      "at": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "when": {
                        "type": "string"
                      },
                      "daysAway": {
                        "type": "number",
                        "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                      },
                      "label": {
                        "type": "string"
                      },
                      "eclipseKind": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "mercuryRetrograde": {
                "type": "object",
                "required": [
                  "current",
                  "next"
                ],
                "properties": {
                  "current": {
                    "anyOf": [
                      {
                        "type": "object",
                        "required": [
                          "planet",
                          "from",
                          "to",
                          "preShadowStart",
                          "postShadowEnd",
                          "clippedStart",
                          "clippedEnd",
                          "stationRetrograde",
                          "stationDirect",
                          "stationRetrogradeSign",
                          "stationDirectSign",
                          "durationDays",
                          "label"
                        ],
                        "properties": {
                          "planet": {
                            "type": "string"
                          },
                          "from": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "to": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "preShadowStart": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "date-time"
                          },
                          "postShadowEnd": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "date-time"
                          },
                          "clippedStart": {
                            "type": "boolean"
                          },
                          "clippedEnd": {
                            "type": "boolean"
                          },
                          "stationRetrograde": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "date-time"
                          },
                          "stationDirect": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "date-time"
                          },
                          "stationRetrogradeSign": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "stationDirectSign": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "durationDays": {
                            "type": [
                              "number",
                              "null"
                            ]
                          },
                          "label": {
                            "type": "string"
                          }
                        }
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "next": {
                    "anyOf": [
                      {
                        "type": "object",
                        "required": [
                          "planet",
                          "from",
                          "to",
                          "preShadowStart",
                          "postShadowEnd",
                          "clippedStart",
                          "clippedEnd",
                          "stationRetrograde",
                          "stationDirect",
                          "stationRetrogradeSign",
                          "stationDirectSign",
                          "durationDays",
                          "label"
                        ],
                        "properties": {
                          "planet": {
                            "type": "string"
                          },
                          "from": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "to": {
                            "type": "string",
                            "format": "date-time"
                          },
                          "preShadowStart": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "date-time"
                          },
                          "postShadowEnd": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "date-time"
                          },
                          "clippedStart": {
                            "type": "boolean"
                          },
                          "clippedEnd": {
                            "type": "boolean"
                          },
                          "stationRetrograde": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "date-time"
                          },
                          "stationDirect": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "date-time"
                          },
                          "stationRetrogradeSign": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "stationDirectSign": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "durationDays": {
                            "type": [
                              "number",
                              "null"
                            ]
                          },
                          "label": {
                            "type": "string"
                          }
                        }
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                }
              }
            }
          },
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "kind",
                "at",
                "when",
                "daysAway",
                "label"
              ],
              "properties": {
                "kind": {
                  "enum": [
                    "lunation",
                    "ingress",
                    "station",
                    "eclipse",
                    "aspect"
                  ]
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "when": {
                  "type": "string"
                },
                "daysAway": {
                  "type": "number",
                  "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                },
                "label": {
                  "type": "string"
                },
                "eclipseKind": {
                  "type": "string"
                }
              }
            }
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "links": {
            "type": "object"
          }
        }
      },
      "retrogrades": {
        "title": "Retrograde windows for a year",
        "description": "Windows intersecting the year, station to station, with shadow boundaries and clipping flags.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "year",
          "coverage",
          "summary",
          "retrogrades"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "year": {
            "type": "integer"
          },
          "coverage": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "summary": {
            "type": "string"
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "retrogrades": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "planet",
                "from",
                "to",
                "preShadowStart",
                "postShadowEnd",
                "clippedStart",
                "clippedEnd",
                "stationRetrograde",
                "stationDirect",
                "stationRetrogradeSign",
                "stationDirectSign",
                "durationDays",
                "label"
              ],
              "properties": {
                "planet": {
                  "type": "string"
                },
                "from": {
                  "type": "string",
                  "format": "date-time"
                },
                "to": {
                  "type": "string",
                  "format": "date-time"
                },
                "preShadowStart": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "postShadowEnd": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "clippedStart": {
                  "type": "boolean"
                },
                "clippedEnd": {
                  "type": "boolean"
                },
                "stationRetrograde": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "stationDirect": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "stationRetrogradeSign": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "stationDirectSign": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "durationDays": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "label": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "stations": {
        "title": "Stations for a year",
        "description": "Every instant a planet turns retrograde or direct during the year.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "year",
          "coverage",
          "summary",
          "stations"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "year": {
            "type": "integer"
          },
          "coverage": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "summary": {
            "type": "string"
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "stations": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "planet",
                "at",
                "type",
                "sign",
                "degree",
                "signName",
                "label"
              ],
              "properties": {
                "planet": {
                  "type": "string"
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "type": {
                  "enum": [
                    "direct",
                    "retrograde"
                  ]
                },
                "sign": {
                  "type": "string",
                  "pattern": "^[a-z]+$"
                },
                "signName": {
                  "type": "string"
                },
                "degree": {
                  "type": "number"
                },
                "label": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "ingresses": {
        "title": "Sign ingresses for a year",
        "description": "Every sign boundary crossing during the year.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "year",
          "coverage",
          "summary",
          "ingresses"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "year": {
            "type": "integer"
          },
          "coverage": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "summary": {
            "type": "string"
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "ingresses": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "planet",
                "at",
                "sign",
                "retrograde",
                "signName",
                "label"
              ],
              "properties": {
                "planet": {
                  "type": "string"
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "sign": {
                  "type": "string",
                  "pattern": "^[a-z]+$"
                },
                "signName": {
                  "type": "string"
                },
                "retrograde": {
                  "type": "boolean"
                },
                "label": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "moon-phases": {
        "title": "Moon phases for a year",
        "description": "Exact new and full moon instants with signs and traditional names.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "year",
          "coverage",
          "summary",
          "lunations"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "year": {
            "type": "integer"
          },
          "coverage": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "summary": {
            "type": "string"
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "lunations": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "type",
                "at",
                "label"
              ],
              "properties": {
                "type": {
                  "enum": [
                    "full",
                    "new"
                  ]
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "sign": {
                  "type": "string",
                  "pattern": "^[a-z]+$"
                },
                "signName": {
                  "type": "string"
                },
                "degree": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 30
                },
                "name": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "daysAway": {
                  "type": "number",
                  "description": "Present only in a payload read from a snapshot: the days from that snapshot (snapshotAt in today, from in upcoming) to at, rounded to the nearest tenth of a day. Every listed event is later than the snapshot, so 0 means it is less than 72 minutes ahead."
                },
                "when": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "eclipses": {
        "title": "Eclipses for a year",
        "description": "Solar and lunar eclipses by instant of greatest eclipse.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "year",
          "coverage",
          "summary",
          "eclipses"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "year": {
            "type": "integer"
          },
          "coverage": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "summary": {
            "type": "string"
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "eclipses": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "type",
                "kind",
                "peak",
                "sign",
                "lon",
                "degree",
                "signName",
                "label"
              ],
              "properties": {
                "type": {
                  "enum": [
                    "solar",
                    "lunar"
                  ]
                },
                "kind": {
                  "type": "string"
                },
                "peak": {
                  "type": "string",
                  "format": "date-time"
                },
                "sign": {
                  "type": "string",
                  "pattern": "^[a-z]+$"
                },
                "signName": {
                  "type": "string"
                },
                "lon": {
                  "type": "number"
                },
                "degree": {
                  "type": "number"
                },
                "obscuration": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 1
                },
                "totalMinutes": {
                  "type": "number"
                },
                "label": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "aspects": {
        "title": "Exact aspects for a year",
        "description": "Exact planetary aspects during the year.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "year",
          "coverage",
          "summary",
          "aspects"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "year": {
            "type": "integer"
          },
          "coverage": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "summary": {
            "type": "string"
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "aspects": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "a",
                "b",
                "type",
                "orb",
                "at",
                "aSign",
                "aDegree",
                "bSign",
                "bDegree",
                "label"
              ],
              "properties": {
                "a": {
                  "type": "string"
                },
                "b": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "orb": {
                  "type": "number"
                },
                "at": {
                  "type": "string",
                  "format": "date-time"
                },
                "aSign": {
                  "type": "string",
                  "pattern": "^[a-z]+$"
                },
                "aSignName": {
                  "type": "string"
                },
                "aDegree": {
                  "type": "number"
                },
                "bSign": {
                  "type": "string",
                  "pattern": "^[a-z]+$"
                },
                "bSignName": {
                  "type": "string"
                },
                "bDegree": {
                  "type": "number"
                },
                "label": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "planet": {
        "title": "One body",
        "description": "Current position, retrograde status and windows, and the next ingress and station for one body.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "planet",
          "slug",
          "date",
          "snapshotAt",
          "summary",
          "now",
          "retrograde",
          "nextIngress",
          "nextStation"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "planet": {
            "type": "string"
          },
          "slug": {
            "enum": [
              "sun",
              "moon",
              "mercury",
              "venus",
              "mars",
              "jupiter",
              "saturn",
              "uranus",
              "neptune",
              "pluto"
            ]
          },
          "date": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          },
          "snapshotAt": {
            "type": "string",
            "format": "date-time"
          },
          "summary": {
            "type": "string"
          },
          "now": {
            "type": "object",
            "required": [
              "body",
              "lon",
              "sign",
              "degree",
              "retrograde",
              "signName",
              "position"
            ],
            "properties": {
              "body": {
                "type": "string"
              },
              "lon": {
                "type": "number",
                "minimum": 0,
                "maximum": 360
              },
              "sign": {
                "type": "string",
                "pattern": "^[a-z]+$"
              },
              "signName": {
                "type": "string"
              },
              "glyph": {
                "type": "string"
              },
              "degree": {
                "type": "number",
                "minimum": 0,
                "maximum": 30
              },
              "retrograde": {
                "type": "boolean"
              },
              "position": {
                "type": "string"
              }
            }
          },
          "retrograde": {
            "type": "object",
            "required": [
              "applicable",
              "active",
              "current",
              "next",
              "windows"
            ],
            "properties": {
              "applicable": {
                "type": "boolean"
              },
              "active": {
                "type": "boolean"
              },
              "current": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "planet",
                      "from",
                      "to",
                      "preShadowStart",
                      "postShadowEnd",
                      "clippedStart",
                      "clippedEnd",
                      "stationRetrograde",
                      "stationDirect",
                      "stationRetrogradeSign",
                      "stationDirectSign",
                      "durationDays",
                      "label"
                    ],
                    "properties": {
                      "planet": {
                        "type": "string"
                      },
                      "from": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "to": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "preShadowStart": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "postShadowEnd": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "clippedStart": {
                        "type": "boolean"
                      },
                      "clippedEnd": {
                        "type": "boolean"
                      },
                      "stationRetrograde": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "stationDirect": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "stationRetrogradeSign": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "stationDirectSign": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "durationDays": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "label": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "next": {
                "anyOf": [
                  {
                    "type": "object",
                    "required": [
                      "planet",
                      "from",
                      "to",
                      "preShadowStart",
                      "postShadowEnd",
                      "clippedStart",
                      "clippedEnd",
                      "stationRetrograde",
                      "stationDirect",
                      "stationRetrogradeSign",
                      "stationDirectSign",
                      "durationDays",
                      "label"
                    ],
                    "properties": {
                      "planet": {
                        "type": "string"
                      },
                      "from": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "to": {
                        "type": "string",
                        "format": "date-time"
                      },
                      "preShadowStart": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "postShadowEnd": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "clippedStart": {
                        "type": "boolean"
                      },
                      "clippedEnd": {
                        "type": "boolean"
                      },
                      "stationRetrograde": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "stationDirect": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "format": "date-time"
                      },
                      "stationRetrogradeSign": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "stationDirectSign": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "durationDays": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "label": {
                        "type": "string"
                      }
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "windows": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "planet",
                    "from",
                    "to",
                    "preShadowStart",
                    "postShadowEnd",
                    "clippedStart",
                    "clippedEnd",
                    "stationRetrograde",
                    "stationDirect",
                    "stationRetrogradeSign",
                    "stationDirectSign",
                    "durationDays",
                    "label"
                  ],
                  "properties": {
                    "planet": {
                      "type": "string"
                    },
                    "from": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "to": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "preShadowStart": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "postShadowEnd": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "clippedStart": {
                      "type": "boolean"
                    },
                    "clippedEnd": {
                      "type": "boolean"
                    },
                    "stationRetrograde": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "stationDirect": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time"
                    },
                    "stationRetrogradeSign": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "stationDirectSign": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "durationDays": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "label": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "nextIngress": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "planet",
                  "at",
                  "sign",
                  "retrograde",
                  "signName",
                  "label"
                ],
                "properties": {
                  "planet": {
                    "type": "string"
                  },
                  "at": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "sign": {
                    "type": "string",
                    "pattern": "^[a-z]+$"
                  },
                  "signName": {
                    "type": "string"
                  },
                  "retrograde": {
                    "type": "boolean"
                  },
                  "label": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "nextStation": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "planet",
                  "at",
                  "type",
                  "sign",
                  "degree",
                  "signName",
                  "label"
                ],
                "properties": {
                  "planet": {
                    "type": "string"
                  },
                  "at": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "type": {
                    "enum": [
                      "direct",
                      "retrograde"
                    ]
                  },
                  "sign": {
                    "type": "string",
                    "pattern": "^[a-z]+$"
                  },
                  "signName": {
                    "type": "string"
                  },
                  "degree": {
                    "type": "number"
                  },
                  "label": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "links": {
            "type": "object"
          }
        }
      },
      "signs": {
        "title": "The twelve signs",
        "description": "Sign metadata, computed Sun seasons, and current occupants.",
        "type": "object",
        "required": [
          "schema",
          "source",
          "docs",
          "license",
          "licenseUrl",
          "attribution",
          "generatedAt",
          "date",
          "snapshotAt",
          "summary",
          "signs"
        ],
        "properties": {
          "$schema": {
            "type": "string",
            "format": "uri"
          },
          "schema": {
            "type": "string",
            "pattern": "^zodiacs\\.sky-api\\.[a-z-]+\\.v1$"
          },
          "source": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          },
          "license": {
            "const": "CC BY 4.0"
          },
          "licenseUrl": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "date": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          },
          "snapshotAt": {
            "type": "string",
            "format": "date-time"
          },
          "summary": {
            "type": "string"
          },
          "signs": {
            "type": "array",
            "minItems": 12,
            "maxItems": 12,
            "items": {
              "type": "object",
              "required": [
                "slug",
                "name",
                "glyph",
                "element",
                "modality",
                "ruler",
                "dates",
                "longitudeRange",
                "sunSeason",
                "occupantsNow",
                "summary"
              ],
              "properties": {
                "slug": {
                  "type": "string",
                  "pattern": "^[a-z]+$"
                },
                "name": {
                  "type": "string"
                },
                "glyph": {
                  "type": "string"
                },
                "element": {
                  "enum": [
                    "fire",
                    "earth",
                    "air",
                    "water"
                  ]
                },
                "modality": {
                  "enum": [
                    "cardinal",
                    "fixed",
                    "mutable"
                  ]
                },
                "ruler": {
                  "type": "string"
                },
                "classicRuler": {
                  "type": "string"
                },
                "polarity": {
                  "type": "string"
                },
                "house": {
                  "type": "integer"
                },
                "dates": {
                  "type": "string"
                },
                "essence": {
                  "type": "string"
                },
                "longitudeRange": {
                  "type": "object",
                  "required": [
                    "from",
                    "to"
                  ],
                  "properties": {
                    "from": {
                      "type": "number"
                    },
                    "to": {
                      "type": "number"
                    }
                  }
                },
                "sunSeason": {
                  "anyOf": [
                    {
                      "type": "object",
                      "required": [
                        "year",
                        "from",
                        "to",
                        "label"
                      ],
                      "properties": {
                        "year": {
                          "type": "integer"
                        },
                        "from": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "to": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "format": "date-time"
                        },
                        "label": {
                          "type": "string"
                        }
                      }
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "occupantsNow": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "summary": {
                  "type": "string"
                }
              }
            }
          },
          "about": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "links": {
            "type": "object"
          }
        }
      },
      "Instant": {
        "type": "string",
        "maxLength": 29,
        "pattern": "^(?:18|19|20|21)\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d{1,3})?)?(?:Z|[+-](?:(?:0\\d|1[0-3]):[0-5]\\d|14:00))$",
        "description": "An instant in ISO 8601 with Z or a numeric offset, from 1800-01-01T00:00:00Z to 2199-12-31T23:59:59.999Z once the offset is applied.",
        "examples": [
          "2000-01-01T12:00:00Z",
          "1990-06-15T14:30:00+02:00"
        ]
      },
      "LocalTime": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "date",
          "time",
          "zone"
        ],
        "description": "A wall-clock date and time in an IANA time zone, read as the site's birth chart calculator reads one.",
        "properties": {
          "date": {
            "type": "string",
            "pattern": "^(?:18|19|20|21)\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$",
            "description": "A real proleptic Gregorian date, 1800-01-01 to 2199-12-31."
          },
          "time": {
            "type": "string",
            "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
            "description": "Hours and minutes, 00:00 to 23:59."
          },
          "zone": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z0-9_+-]+){0,3}$",
            "description": "An IANA time zone name, such as Europe/Paris, in any letter case. The answer names it as tzdb spells it."
          }
        }
      },
      "Latitude": {
        "type": "number",
        "exclusiveMinimum": -90,
        "exclusiveMaximum": 90,
        "description": "Degrees north. The poles are refused: the engine does not compute angles there."
      },
      "Longitude": {
        "type": "number",
        "minimum": -180,
        "maximum": 180,
        "description": "Degrees east."
      },
      "HouseSystem": {
        "enum": [
          "whole",
          "placidus",
          "porphyry",
          "equal",
          "equal-mc",
          "vehlow",
          "koch",
          "regiomontanus",
          "campanus",
          "topocentric",
          "alcabitius",
          "morinus",
          "meridian"
        ],
        "description": "One of the engine's thirteen house systems."
      },
      "PlaceInstantRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "latitude",
          "longitude"
        ],
        "oneOf": [
          {
            "required": [
              "utc"
            ]
          },
          {
            "required": [
              "local"
            ]
          }
        ],
        "properties": {
          "utc": {
            "$ref": "#/components/schemas/Instant"
          },
          "local": {
            "$ref": "#/components/schemas/LocalTime"
          },
          "latitude": {
            "$ref": "#/components/schemas/Latitude"
          },
          "longitude": {
            "$ref": "#/components/schemas/Longitude"
          },
          "houseSystem": {
            "$ref": "#/components/schemas/HouseSystem",
            "default": "placidus"
          }
        },
        "description": "Exactly one of utc and local, a place, and a house system (placidus when omitted)."
      },
      "PositionsRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "instants"
        ],
        "properties": {
          "instants": {
            "type": "array",
            "minItems": 1,
            "maxItems": 100,
            "items": {
              "$ref": "#/components/schemas/Instant"
            }
          },
          "bodies": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true,
            "items": {
              "enum": [
                "Sun",
                "Moon",
                "Mercury",
                "Venus",
                "Mars",
                "Jupiter",
                "Saturn",
                "Uranus",
                "Neptune",
                "Pluto",
                "North Node",
                "South Node"
              ]
            },
            "description": "Rows to return; all twelve when omitted."
          }
        }
      },
      "EventsRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "from",
          "to"
        ],
        "description": "A window of at most 92 days, from its start (excluded) to its end (included). The end must be later than the start, which the schema cannot state.",
        "properties": {
          "from": {
            "$ref": "#/components/schemas/Instant"
          },
          "to": {
            "$ref": "#/components/schemas/Instant"
          },
          "bodies": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true,
            "items": {
              "enum": [
                "Sun",
                "Moon",
                "Mercury",
                "Venus",
                "Mars",
                "Jupiter",
                "Saturn",
                "Uranus",
                "Neptune",
                "Pluto"
              ]
            },
            "description": "All ten when omitted."
          },
          "kinds": {
            "type": "array",
            "minItems": 1,
            "uniqueItems": true,
            "items": {
              "enum": [
                "ingress",
                "station",
                "lunation"
              ]
            },
            "description": "All three when omitted."
          }
        }
      },
      "TimeRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "local"
        ],
        "properties": {
          "local": {
            "$ref": "#/components/schemas/LocalTime"
          },
          "longitude": {
            "$ref": "#/components/schemas/Longitude",
            "description": "The place's longitude, degrees east. With it, a time before the place adopted a legal time uses the place's own mean time, and a date up to 1970-01-01 the pinned zone history."
          }
        }
      },
      "ElectionsRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "from",
          "to",
          "conditions"
        ],
        "description": "A window of at most 31 days, from its start (included) to its end (excluded), one to 5 conditions, and a place when a condition is angular. The end must be later than the start, a condition may not repeat, and a place goes with an angular condition and only with one, which the schema cannot state.",
        "properties": {
          "from": {
            "$ref": "#/components/schemas/Instant"
          },
          "to": {
            "$ref": "#/components/schemas/Instant"
          },
          "conditions": {
            "type": "array",
            "minItems": 1,
            "maxItems": 5,
            "items": {
              "$ref": "#/components/schemas/ElectionCondition"
            }
          },
          "place": {
            "$ref": "#/components/schemas/ElectionPlace"
          }
        }
      },
      "ElectionCondition": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/PhaseCondition"
          },
          {
            "$ref": "#/components/schemas/VoidOfCourseCondition"
          },
          {
            "$ref": "#/components/schemas/SignCondition"
          },
          {
            "$ref": "#/components/schemas/RetrogradeCondition"
          },
          {
            "$ref": "#/components/schemas/AngularCondition"
          }
        ],
        "discriminator": {
          "propertyName": "kind",
          "mapping": {
            "phase": "#/components/schemas/PhaseCondition",
            "void-of-course": "#/components/schemas/VoidOfCourseCondition",
            "sign": "#/components/schemas/SignCondition",
            "retrograde": "#/components/schemas/RetrogradeCondition",
            "angular": "#/components/schemas/AngularCondition"
          }
        }
      },
      "PhaseCondition": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind",
          "phase"
        ],
        "description": "The Moon waxing (its elongation from the Sun in [0°, 180°)) or waning ([180°, 360°)).",
        "properties": {
          "kind": {
            "const": "phase"
          },
          "phase": {
            "enum": [
              "waxing",
              "waning"
            ]
          },
          "not": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "VoidOfCourseCondition": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind"
        ],
        "description": "The Moon void of course: from its last exact Ptolemaic aspect in a sign to the Sun or a planet, Mercury to Pluto, to its entry into the next sign, the engine's own rule, after William Lilly. With not, the Moon not void.",
        "properties": {
          "kind": {
            "const": "void-of-course"
          },
          "not": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "SignCondition": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind",
          "body",
          "sign"
        ],
        "description": "A body in a sign of the tropical zodiac.",
        "properties": {
          "kind": {
            "const": "sign"
          },
          "body": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto"
            ]
          },
          "sign": {
            "enum": [
              "aries",
              "taurus",
              "gemini",
              "cancer",
              "leo",
              "virgo",
              "libra",
              "scorpio",
              "sagittarius",
              "capricorn",
              "aquarius",
              "pisces"
            ]
          },
          "not": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "RetrogradeCondition": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind",
          "body"
        ],
        "description": "A planet retrograde: its longitude speed below zero. With not, direct.",
        "properties": {
          "kind": {
            "const": "retrograde"
          },
          "body": {
            "enum": [
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto"
            ]
          },
          "not": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "AngularCondition": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind",
          "body"
        ],
        "description": "A body in the 1st, 4th, 7th or 10th house at the request's place, as the engine's natalChart and houseOf place it in the place's house system.",
        "properties": {
          "kind": {
            "const": "angular"
          },
          "body": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto"
            ]
          },
          "not": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "ElectionPlace": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "latitude",
          "longitude"
        ],
        "properties": {
          "latitude": {
            "type": "number",
            "minimum": -60,
            "maximum": 60,
            "description": "Degrees north, within 60° of the equator."
          },
          "longitude": {
            "$ref": "#/components/schemas/Longitude"
          },
          "houseSystem": {
            "$ref": "#/components/schemas/HouseSystem",
            "default": "placidus"
          }
        }
      },
      "SkyFactRequest": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/SignFact"
          },
          {
            "$ref": "#/components/schemas/RetrogradeFact"
          },
          {
            "$ref": "#/components/schemas/IngressFact"
          },
          {
            "$ref": "#/components/schemas/PhaseFact"
          }
        ],
        "discriminator": {
          "propertyName": "kind",
          "mapping": {
            "sign": "#/components/schemas/SignFact",
            "retrograde": "#/components/schemas/RetrogradeFact",
            "ingress": "#/components/schemas/IngressFact",
            "phase": "#/components/schemas/PhaseFact"
          }
        }
      },
      "SignFact": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind",
          "body",
          "sign"
        ],
        "oneOf": [
          {
            "required": [
              "instant"
            ],
            "not": {
              "anyOf": [
                {
                  "required": [
                    "date"
                  ]
                },
                {
                  "required": [
                    "zone"
                  ]
                }
              ]
            }
          },
          {
            "required": [
              "date"
            ],
            "not": {
              "required": [
                "instant"
              ]
            }
          }
        ],
        "properties": {
          "kind": {
            "const": "sign"
          },
          "body": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto"
            ]
          },
          "sign": {
            "enum": [
              "aries",
              "taurus",
              "gemini",
              "cancer",
              "leo",
              "virgo",
              "libra",
              "scorpio",
              "sagittarius",
              "capricorn",
              "aquarius",
              "pisces"
            ]
          },
          "instant": {
            "$ref": "#/components/schemas/Instant"
          },
          "date": {
            "type": "string",
            "pattern": "^(?:18|19|20|21)\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
          },
          "zone": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z0-9_+-]+){0,3}$",
            "description": "An IANA time zone name, such as Europe/Paris, in any letter case. The answer names it as tzdb spells it."
          }
        }
      },
      "RetrogradeFact": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind",
          "body"
        ],
        "oneOf": [
          {
            "required": [
              "instant"
            ],
            "not": {
              "anyOf": [
                {
                  "required": [
                    "date"
                  ]
                },
                {
                  "required": [
                    "zone"
                  ]
                }
              ]
            }
          },
          {
            "required": [
              "date"
            ],
            "not": {
              "required": [
                "instant"
              ]
            }
          }
        ],
        "properties": {
          "kind": {
            "const": "retrograde"
          },
          "body": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto"
            ]
          },
          "instant": {
            "$ref": "#/components/schemas/Instant"
          },
          "date": {
            "type": "string",
            "pattern": "^(?:18|19|20|21)\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
          },
          "zone": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z0-9_+-]+){0,3}$",
            "description": "An IANA time zone name, such as Europe/Paris, in any letter case. The answer names it as tzdb spells it."
          }
        }
      },
      "IngressFact": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind",
          "body",
          "sign",
          "date"
        ],
        "properties": {
          "kind": {
            "const": "ingress"
          },
          "body": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto"
            ]
          },
          "sign": {
            "enum": [
              "aries",
              "taurus",
              "gemini",
              "cancer",
              "leo",
              "virgo",
              "libra",
              "scorpio",
              "sagittarius",
              "capricorn",
              "aquarius",
              "pisces"
            ]
          },
          "date": {
            "type": "string",
            "pattern": "^(?:18|19|20|21)\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
          },
          "zone": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z0-9_+-]+){0,3}$",
            "description": "An IANA time zone name, such as Europe/Paris, in any letter case. The answer names it as tzdb spells it."
          }
        }
      },
      "PhaseFact": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "kind",
          "phase",
          "date"
        ],
        "properties": {
          "kind": {
            "const": "phase"
          },
          "phase": {
            "enum": [
              "new",
              "first-quarter",
              "full",
              "last-quarter"
            ]
          },
          "date": {
            "type": "string",
            "pattern": "^(?:18|19|20|21)\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
          },
          "zone": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z0-9_+-]+){0,3}$",
            "description": "An IANA time zone name, such as Europe/Paris, in any letter case. The answer names it as tzdb spells it."
          }
        }
      },
      "BodyPosition": {
        "type": "object",
        "required": [
          "body",
          "lon",
          "lat",
          "speed",
          "retrograde",
          "sign",
          "degree"
        ],
        "properties": {
          "body": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto",
              "North Node",
              "South Node"
            ]
          },
          "lon": {
            "type": "number",
            "minimum": 0,
            "exclusiveMaximum": 360,
            "description": "Tropical ecliptic longitude of date, degrees."
          },
          "lat": {
            "type": "number",
            "description": "Ecliptic latitude, degrees; zero for the nodes."
          },
          "speed": {
            "type": "number",
            "description": "Degrees per day; negative is retrograde."
          },
          "retrograde": {
            "type": "boolean"
          },
          "sign": {
            "enum": [
              "aries",
              "taurus",
              "gemini",
              "cancer",
              "leo",
              "virgo",
              "libra",
              "scorpio",
              "sagittarius",
              "capricorn",
              "aquarius",
              "pisces"
            ]
          },
          "degree": {
            "type": "number",
            "minimum": 0,
            "exclusiveMaximum": 30
          }
        }
      },
      "Angles": {
        "type": "object",
        "required": [
          "asc",
          "mc",
          "dsc",
          "ic"
        ],
        "properties": {
          "asc": {
            "type": "number"
          },
          "mc": {
            "type": "number"
          },
          "dsc": {
            "type": "number"
          },
          "ic": {
            "type": "number"
          }
        }
      },
      "Houses": {
        "type": "object",
        "required": [
          "system",
          "cusps"
        ],
        "properties": {
          "system": {
            "$ref": "#/components/schemas/HouseSystem"
          },
          "cusps": {
            "type": "array",
            "minItems": 12,
            "maxItems": 12,
            "items": {
              "type": "number"
            }
          }
        },
        "description": "The system the engine used, which can differ from the one requested (see flags and the receipt), and twelve cusps, the first house first."
      },
      "Aspect": {
        "type": "object",
        "required": [
          "a",
          "b",
          "type",
          "orb",
          "applying"
        ],
        "properties": {
          "a": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto",
              "North Node",
              "South Node"
            ]
          },
          "b": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto",
              "North Node",
              "South Node"
            ]
          },
          "type": {
            "enum": [
              "conjunction",
              "sextile",
              "square",
              "trine",
              "opposition"
            ]
          },
          "orb": {
            "type": "number"
          },
          "applying": {
            "type": "boolean"
          }
        }
      },
      "ChartFlag": {
        "enum": [
          "dst-gap",
          "dst-fold",
          "lmt",
          "no-time",
          "polar-fallback",
          "outside-reference-span"
        ]
      },
      "DeltaT": {
        "type": "object",
        "required": [
          "seconds",
          "sigma",
          "model",
          "table",
          "tableDigest",
          "segment"
        ],
        "description": "ΔT = TT − UT1 in seconds, with its 1-sigma band and where it came from, as the engine reports it for a chart at the instant: iers-utc/1 from 1972 to the end of the engine's UT1 table, its model zodiacs-deltat/1 otherwise.",
        "properties": {
          "seconds": {
            "type": "number"
          },
          "sigma": {
            "type": "number"
          },
          "model": {
            "enum": [
              "iers-utc/1",
              "zodiacs-deltat/1"
            ]
          },
          "table": {
            "type": "string"
          },
          "tableDigest": {
            "type": "string"
          },
          "segment": {
            "enum": [
              "long-term",
              "reconstructed",
              "observed",
              "predicted",
              "extrapolated"
            ]
          }
        }
      },
      "TimeScale": {
        "type": "object",
        "required": [
          "input",
          "basis",
          "ut1MinusUtc",
          "leapSeconds"
        ],
        "properties": {
          "input": {
            "const": "utc"
          },
          "basis": {
            "enum": [
              "iers",
              "delta-t"
            ]
          },
          "ut1MinusUtc": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "seconds",
                  "sigma",
                  "source"
                ],
                "properties": {
                  "seconds": {
                    "type": "number"
                  },
                  "sigma": {
                    "type": "number"
                  },
                  "source": {
                    "enum": [
                      "observed",
                      "predicted",
                      "fallback"
                    ]
                  }
                },
                "description": "UT1 − UTC in seconds as the engine used it, with its 1-sigma band and its source: observed or predicted by IERS, or fallback after the table ends; null before 1972."
              },
              {
                "type": "null"
              }
            ]
          },
          "leapSeconds": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "taiMinusUtc",
                  "listed"
                ],
                "properties": {
                  "taiMinusUtc": {
                    "type": "number"
                  },
                  "listed": {
                    "type": "boolean"
                  }
                },
                "description": "TAI − UTC in seconds from the IERS leap-second list; listed is false after the list expires and its last value is carried."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "description": "How the engine read the instant, as a chart reports it. basis iers, from 1972 to the end of its UT1 table: TT is UTC plus the leap seconds and 32.184 s, and UT1 is UTC plus IERS UT1 − UTC. basis delta-t, otherwise: the instant is read as UT1, and TT is UT1 plus the ΔT model."
      },
      "LocalResolution": {
        "type": "object",
        "required": [
          "offsetMinutes",
          "flags",
          "localMeanTime",
          "zoneHistory",
          "zoneUncertain"
        ],
        "description": "How a local time was read: the offset applied, the resolver's flags, the birthplace's own mean time if it was used, and which zone history gave the offset.",
        "properties": {
          "offsetMinutes": {
            "type": "number",
            "description": "Minutes east of UTC; fractional before standard time."
          },
          "flags": {
            "type": "array",
            "items": {
              "enum": [
                "dst-gap",
                "dst-fold",
                "lmt"
              ]
            }
          },
          "localMeanTime": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "longitude",
                  "zoneOffsetMinutes"
                ],
                "properties": {
                  "longitude": {
                    "type": "number"
                  },
                  "zoneOffsetMinutes": {
                    "type": "number"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "zoneHistory": {
            "enum": [
              "pinned",
              "runtime"
            ]
          },
          "zoneUncertain": {
            "type": "boolean"
          }
        }
      },
      "CalculationReceipt": {
        "type": "object",
        "description": "The engine's own receipt for a chart, as createNatalEnvelope writes it.",
        "required": [
          "schema",
          "instant",
          "timeKnown",
          "reference",
          "localResolution",
          "coordinates",
          "houses",
          "inputFlags",
          "resultFlags",
          "engine",
          "provenance",
          "conventions",
          "coverage"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.calculation-receipt.draft-v1"
          },
          "instant": {
            "type": "string",
            "format": "date-time"
          },
          "sourceInstant": {
            "type": [
              "string",
              "null"
            ]
          },
          "timeKnown": {
            "type": "boolean"
          },
          "reference": {
            "enum": [
              "supplied-instant",
              "utc-noon",
              "local-noon"
            ]
          },
          "localResolution": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ]
          },
          "coordinates": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "latitude",
                  "longitude"
                ],
                "properties": {
                  "latitude": {
                    "type": "number"
                  },
                  "longitude": {
                    "type": "number"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "houses": {
            "type": "object",
            "required": [
              "requested",
              "actual",
              "absenceReason"
            ]
          },
          "inputFlags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChartFlag"
            }
          },
          "resultFlags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChartFlag"
            }
          },
          "engine": {
            "$ref": "#/components/schemas/Backend"
          },
          "provenance": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ]
          },
          "conventions": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "coverage": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "ComputeReceipt": {
        "type": "object",
        "description": "The receipt for a calculation the engine writes no receipt for: the engine, its conventions and coverage as its own receipts state them, and what this request used.",
        "required": [
          "schema",
          "endpoint",
          "engine",
          "conventions",
          "coverage",
          "referenceSpan",
          "deltaT"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.compute-receipt.v1"
          },
          "endpoint": {
            "enum": [
              "chart",
              "positions",
              "houses",
              "events",
              "time",
              "sky-fact",
              "elections"
            ]
          },
          "engine": {
            "$ref": "#/components/schemas/Backend"
          },
          "conventions": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "coverage": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "referenceSpan": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "deltaT": {
            "type": "array",
            "description": "The two sources of ΔT the engine's time basis uses: IERS from 1972 to the end of its UT1 table, then its model. A result that gives an instant's ΔT names which applied.",
            "prefixItems": [
              {
                "type": "object",
                "required": [
                  "model",
                  "table",
                  "tableDigest"
                ],
                "properties": {
                  "model": {
                    "const": "iers-utc/1"
                  },
                  "table": {
                    "type": "string"
                  },
                  "tableDigest": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "object",
                "required": [
                  "model",
                  "table",
                  "tableDigest"
                ],
                "properties": {
                  "model": {
                    "const": "zodiacs-deltat/1"
                  },
                  "table": {
                    "type": "string"
                  },
                  "tableDigest": {
                    "type": "string"
                  }
                }
              }
            ],
            "minItems": 2,
            "maxItems": 2
          },
          "timeResolution": {
            "type": "object",
            "required": [
              "resolver",
              "policy",
              "pinnedTzdb",
              "runtimeTzdb"
            ],
            "properties": {
              "resolver": {
                "type": "string"
              },
              "policy": {
                "type": "object",
                "properties": {
                  "fold": {
                    "const": "earlier"
                  },
                  "gap": {
                    "const": "shift-forward"
                  }
                }
              },
              "pinnedTzdb": {
                "type": "object"
              },
              "runtimeTzdb": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "search": {
            "type": "object",
            "required": [
              "solver",
              "stepDays",
              "bisections",
              "samples",
              "maxSamples",
              "window",
              "completeness"
            ],
            "properties": {
              "solver": {
                "const": "engine-longitude-crossings"
              },
              "stepDays": {
                "type": "object",
                "additionalProperties": {
                  "type": "number"
                }
              },
              "bisections": {
                "type": "integer"
              },
              "samples": {
                "type": "integer",
                "minimum": 0
              },
              "maxSamples": {
                "type": "integer"
              },
              "window": {
                "const": "start-exclusive-end-inclusive"
              },
              "completeness": {
                "const": "tested-not-proven"
              }
            }
          },
          "electionSearch": {
            "type": "object",
            "description": "How an election search ran: the crossing search's steps for sign changes, stations and phases; the void-of-course rule and the step of its scan for the Moon's last aspect; the house sampling; the evaluations made, where a crossing step counts once and a full calculation, all the positions at an instant or a natalChart for a house, counts as fullCalculationCost. Every window's ends are within a second, so a gap shorter than resolutionSeconds between two windows is closed and a window shorter than it is not listed: two boundaries that close may be one instant found twice.",
            "required": [
              "solver",
              "stepDays",
              "voidOfCourse",
              "houseSampleMinutes",
              "boundarySeconds",
              "resolutionSeconds",
              "fullCalculationCost",
              "samples",
              "maxSamples",
              "window",
              "completeness"
            ],
            "properties": {
              "solver": {
                "const": "engine-longitude-crossings-and-sampled-houses"
              },
              "stepDays": {
                "type": "object",
                "additionalProperties": {
                  "type": "number"
                }
              },
              "voidOfCourse": {
                "type": "object",
                "required": [
                  "convention",
                  "bodies",
                  "scanHours"
                ],
                "properties": {
                  "convention": {
                    "const": "last-exact-ptolemaic-aspect-to-sign-exit"
                  },
                  "bodies": {
                    "const": "modern"
                  },
                  "scanHours": {
                    "type": "number"
                  }
                }
              },
              "houseSampleMinutes": {
                "const": 60
              },
              "boundarySeconds": {
                "const": 1
              },
              "resolutionSeconds": {
                "const": 2
              },
              "fullCalculationCost": {
                "const": 25
              },
              "samples": {
                "type": "integer",
                "minimum": 0
              },
              "maxSamples": {
                "type": "integer"
              },
              "window": {
                "const": "start-inclusive-end-exclusive"
              },
              "completeness": {
                "const": "tested-not-proven"
              }
            }
          }
        }
      },
      "Backend": {
        "type": "object",
        "required": [
          "name",
          "version",
          "ephemeris"
        ],
        "properties": {
          "name": {
            "const": "@zodiacs/engine"
          },
          "version": {
            "type": "string"
          },
          "ephemeris": {
            "type": "object",
            "required": [
              "name",
              "version"
            ],
            "properties": {
              "name": {
                "const": "astronomy-engine"
              },
              "version": {
                "type": "string"
              }
            }
          }
        }
      },
      "Cite": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "url",
          "receipt",
          "engine",
          "version"
        ],
        "description": "What to quote: the documentation of this endpoint, a digest that identifies the receipt in this response (SHA-256 over its RFC 8785 canonical JSON), and the engine and its version. For chart and houses the receipt holds the instant and the coordinates, so the digest identifies the birth details from either side: with the date and the place, trying times finds the time, and with the date and the time, trying places from a list of towns finds the place. Quote it only where the birth details may be known.",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "receipt": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$"
          },
          "engine": {
            "const": "@zodiacs/engine"
          },
          "version": {
            "type": "string"
          }
        }
      },
      "ChartResult": {
        "type": "object",
        "required": [
          "instant",
          "local",
          "bodies",
          "angles",
          "houses",
          "aspects",
          "flags",
          "deltaT",
          "timeScale"
        ],
        "properties": {
          "instant": {
            "type": "string",
            "format": "date-time"
          },
          "local": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LocalResolution"
              },
              {
                "type": "null"
              }
            ]
          },
          "bodies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BodyPosition"
            }
          },
          "angles": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Angles"
              },
              {
                "type": "null"
              }
            ]
          },
          "houses": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Houses"
              },
              {
                "type": "null"
              }
            ]
          },
          "aspects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Aspect"
            }
          },
          "flags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChartFlag"
            }
          },
          "deltaT": {
            "$ref": "#/components/schemas/DeltaT"
          },
          "timeScale": {
            "$ref": "#/components/schemas/TimeScale"
          }
        }
      },
      "HousesResult": {
        "type": "object",
        "required": [
          "instant",
          "local",
          "angles",
          "houses",
          "flags",
          "deltaT",
          "timeScale"
        ],
        "properties": {
          "instant": {
            "type": "string",
            "format": "date-time"
          },
          "local": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/LocalResolution"
              },
              {
                "type": "null"
              }
            ]
          },
          "angles": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Angles"
              },
              {
                "type": "null"
              }
            ]
          },
          "houses": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Houses"
              },
              {
                "type": "null"
              }
            ]
          },
          "flags": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChartFlag"
            }
          },
          "deltaT": {
            "$ref": "#/components/schemas/DeltaT"
          },
          "timeScale": {
            "$ref": "#/components/schemas/TimeScale"
          }
        }
      },
      "PositionsResult": {
        "type": "object",
        "required": [
          "instants"
        ],
        "properties": {
          "instants": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "instant",
                "bodies",
                "deltaT",
                "timeScale",
                "flags"
              ],
              "properties": {
                "instant": {
                  "type": "string",
                  "format": "date-time"
                },
                "bodies": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BodyPosition"
                  }
                },
                "deltaT": {
                  "$ref": "#/components/schemas/DeltaT"
                },
                "timeScale": {
                  "$ref": "#/components/schemas/TimeScale"
                },
                "flags": {
                  "type": "array",
                  "items": {
                    "const": "outside-reference-span"
                  }
                }
              }
            }
          }
        }
      },
      "ElectionsResult": {
        "type": "object",
        "required": [
          "from",
          "to",
          "conditions",
          "place",
          "windows",
          "flags"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "conditions": {
            "type": "array",
            "description": "The conditions as validated, each with its not.",
            "items": {
              "type": "object",
              "required": [
                "kind",
                "not"
              ],
              "properties": {
                "kind": {
                  "enum": [
                    "phase",
                    "void-of-course",
                    "sign",
                    "retrograde",
                    "angular"
                  ]
                },
                "phase": {
                  "enum": [
                    "waxing",
                    "waning"
                  ]
                },
                "body": {
                  "enum": [
                    "Sun",
                    "Moon",
                    "Mercury",
                    "Venus",
                    "Mars",
                    "Jupiter",
                    "Saturn",
                    "Uranus",
                    "Neptune",
                    "Pluto"
                  ]
                },
                "sign": {
                  "enum": [
                    "aries",
                    "taurus",
                    "gemini",
                    "cancer",
                    "leo",
                    "virgo",
                    "libra",
                    "scorpio",
                    "sagittarius",
                    "capricorn",
                    "aquarius",
                    "pisces"
                  ]
                },
                "not": {
                  "type": "boolean"
                }
              }
            }
          },
          "place": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "latitude",
                  "longitude",
                  "houseSystem"
                ],
                "properties": {
                  "latitude": {
                    "type": "number"
                  },
                  "longitude": {
                    "type": "number"
                  },
                  "houseSystem": {
                    "$ref": "#/components/schemas/HouseSystem"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "windows": {
            "type": "array",
            "description": "Every stretch of the window in which all the conditions hold, in time order, each from its start (included) to its end (excluded), within a second. A window that begins at the request's from or ends at its to may run on beyond it.",
            "items": {
              "type": "object",
              "required": [
                "from",
                "to"
              ],
              "properties": {
                "from": {
                  "type": "string",
                  "format": "date-time"
                },
                "to": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          },
          "flags": {
            "type": "array",
            "items": {
              "const": "outside-reference-span"
            },
            "maxItems": 1,
            "description": "outside-reference-span when what the search reads reaches past the instant span: the window, and with a void-of-course condition the 4 days before it and the 3 after it, where it finds the Moon's sign changes."
          }
        }
      },
      "EventsResult": {
        "type": "object",
        "required": [
          "from",
          "to",
          "events"
        ],
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "events": {
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "required": [
                    "kind",
                    "body",
                    "at",
                    "sign",
                    "retrograde"
                  ],
                  "properties": {
                    "kind": {
                      "const": "ingress"
                    },
                    "body": {
                      "enum": [
                        "Sun",
                        "Moon",
                        "Mercury",
                        "Venus",
                        "Mars",
                        "Jupiter",
                        "Saturn",
                        "Uranus",
                        "Neptune",
                        "Pluto"
                      ]
                    },
                    "at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "sign": {
                      "enum": [
                        "aries",
                        "taurus",
                        "gemini",
                        "cancer",
                        "leo",
                        "virgo",
                        "libra",
                        "scorpio",
                        "sagittarius",
                        "capricorn",
                        "aquarius",
                        "pisces"
                      ]
                    },
                    "retrograde": {
                      "type": "boolean"
                    }
                  }
                },
                {
                  "type": "object",
                  "required": [
                    "kind",
                    "body",
                    "at",
                    "type",
                    "lon",
                    "sign",
                    "degree"
                  ],
                  "properties": {
                    "kind": {
                      "const": "station"
                    },
                    "body": {
                      "enum": [
                        "Sun",
                        "Moon",
                        "Mercury",
                        "Venus",
                        "Mars",
                        "Jupiter",
                        "Saturn",
                        "Uranus",
                        "Neptune",
                        "Pluto"
                      ]
                    },
                    "at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "type": {
                      "enum": [
                        "retrograde",
                        "direct"
                      ]
                    },
                    "lon": {
                      "type": "number"
                    },
                    "sign": {
                      "enum": [
                        "aries",
                        "taurus",
                        "gemini",
                        "cancer",
                        "leo",
                        "virgo",
                        "libra",
                        "scorpio",
                        "sagittarius",
                        "capricorn",
                        "aquarius",
                        "pisces"
                      ]
                    },
                    "degree": {
                      "type": "number"
                    }
                  }
                },
                {
                  "type": "object",
                  "required": [
                    "kind",
                    "type",
                    "at",
                    "lon",
                    "sign",
                    "degree"
                  ],
                  "properties": {
                    "kind": {
                      "const": "lunation"
                    },
                    "type": {
                      "enum": [
                        "new",
                        "full"
                      ]
                    },
                    "at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "lon": {
                      "type": "number"
                    },
                    "sign": {
                      "enum": [
                        "aries",
                        "taurus",
                        "gemini",
                        "cancer",
                        "leo",
                        "virgo",
                        "libra",
                        "scorpio",
                        "sagittarius",
                        "capricorn",
                        "aquarius",
                        "pisces"
                      ]
                    },
                    "degree": {
                      "type": "number"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "TimeResult": {
        "type": "object",
        "required": [
          "utc",
          "offsetMinutes",
          "flags",
          "localMeanTime",
          "zoneHistory",
          "zoneUncertain",
          "tt",
          "deltaT",
          "timeScale"
        ],
        "properties": {
          "utc": {
            "type": "string",
            "format": "date-time"
          },
          "offsetMinutes": {
            "type": "number"
          },
          "flags": {
            "type": "array",
            "items": {
              "enum": [
                "dst-gap",
                "dst-fold",
                "lmt",
                "outside-reference-span"
              ]
            },
            "description": "The resolver's flags, and outside-reference-span when a local time at the ends of the accepted dates falls outside the instant span."
          },
          "localMeanTime": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "longitude",
                  "zoneOffsetMinutes"
                ],
                "properties": {
                  "longitude": {
                    "type": "number"
                  },
                  "zoneOffsetMinutes": {
                    "type": "number"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "zoneHistory": {
            "enum": [
              "pinned",
              "runtime"
            ]
          },
          "zoneUncertain": {
            "type": "boolean"
          },
          "tt": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$",
            "description": "Terrestrial Time to the millisecond, as the engine reads the instant (timeScale says how), with no zone designator because it is not UTC."
          },
          "deltaT": {
            "$ref": "#/components/schemas/DeltaT"
          },
          "timeScale": {
            "$ref": "#/components/schemas/TimeScale"
          }
        }
      },
      "BodyState": {
        "type": "object",
        "required": [
          "lon",
          "sign",
          "degree",
          "speed",
          "retrograde"
        ],
        "properties": {
          "lon": {
            "type": "number"
          },
          "sign": {
            "enum": [
              "aries",
              "taurus",
              "gemini",
              "cancer",
              "leo",
              "virgo",
              "libra",
              "scorpio",
              "sagittarius",
              "capricorn",
              "aquarius",
              "pisces"
            ]
          },
          "degree": {
            "type": "number"
          },
          "speed": {
            "type": "number"
          },
          "retrograde": {
            "type": "boolean"
          }
        },
        "description": "A body's longitude, sign, degree, speed and direction at one instant."
      },
      "ZoneEdge": {
        "allOf": [
          {
            "$ref": "#/components/schemas/LocalResolution"
          },
          {
            "type": "object",
            "required": [
              "utc"
            ],
            "properties": {
              "utc": {
                "type": "string",
                "format": "date-time"
              }
            }
          }
        ],
        "description": "A midnight of the day in its zone: the instant, and how the local time was read."
      },
      "SkyFactEcho": {
        "type": "object",
        "required": [
          "kind",
          "date",
          "zone"
        ],
        "properties": {
          "kind": {
            "enum": [
              "sign",
              "retrograde",
              "ingress",
              "phase"
            ]
          },
          "body": {
            "enum": [
              "Sun",
              "Moon",
              "Mercury",
              "Venus",
              "Mars",
              "Jupiter",
              "Saturn",
              "Uranus",
              "Neptune",
              "Pluto"
            ]
          },
          "sign": {
            "enum": [
              "aries",
              "taurus",
              "gemini",
              "cancer",
              "leo",
              "virgo",
              "libra",
              "scorpio",
              "sagittarius",
              "capricorn",
              "aquarius",
              "pisces"
            ]
          },
          "phase": {
            "enum": [
              "new",
              "first-quarter",
              "full",
              "last-quarter"
            ]
          },
          "instant": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "date": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^(?:18|19|20|21)\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$"
              },
              {
                "type": "null"
              }
            ]
          },
          "zone": {
            "anyOf": [
              {
                "type": "string",
                "description": "The zone as tzdb spells it."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "description": "The fact as the server read it, with the zone as tzdb spells it."
      },
      "SkyFactResult": {
        "type": "object",
        "required": [
          "answer",
          "basis",
          "fact",
          "instant",
          "window",
          "zone",
          "facts"
        ],
        "properties": {
          "answer": {
            "enum": [
              "true",
              "false",
              "depends"
            ]
          },
          "basis": {
            "enum": [
              "instant",
              "local-day",
              "any-zone-day"
            ]
          },
          "fact": {
            "$ref": "#/components/schemas/SkyFactEcho"
          },
          "instant": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "window": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "from",
                  "to"
                ],
                "properties": {
                  "from": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "to": {
                    "type": "string",
                    "format": "date-time"
                  }
                },
                "description": "The day read: from its start (included) to its end (excluded)."
              },
              {
                "type": "null"
              }
            ]
          },
          "zone": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "start",
                  "end"
                ],
                "properties": {
                  "start": {
                    "$ref": "#/components/schemas/ZoneEdge"
                  },
                  "end": {
                    "$ref": "#/components/schemas/ZoneEdge"
                  }
                },
                "description": "The two midnights of a day read in a zone."
              },
              {
                "type": "null"
              }
            ]
          },
          "facts": {
            "description": "The computed values that decide the answer. At an instant: the body's state there. On a day: the state at its start and end with the sign changes or stations between, or the ingresses or lunations in it. flags holds outside-reference-span when the instant or the day reaches past the instant span.",
            "oneOf": [
              {
                "type": "object",
                "required": [
                  "lon",
                  "sign",
                  "degree",
                  "speed",
                  "retrograde",
                  "deltaT",
                  "timeScale",
                  "flags"
                ],
                "properties": {
                  "lon": {
                    "type": "number"
                  },
                  "sign": {
                    "enum": [
                      "aries",
                      "taurus",
                      "gemini",
                      "cancer",
                      "leo",
                      "virgo",
                      "libra",
                      "scorpio",
                      "sagittarius",
                      "capricorn",
                      "aquarius",
                      "pisces"
                    ]
                  },
                  "degree": {
                    "type": "number"
                  },
                  "speed": {
                    "type": "number"
                  },
                  "retrograde": {
                    "type": "boolean"
                  },
                  "deltaT": {
                    "$ref": "#/components/schemas/DeltaT"
                  },
                  "timeScale": {
                    "$ref": "#/components/schemas/TimeScale"
                  },
                  "boundaryMarginArcsec": {
                    "type": "number",
                    "minimum": 0,
                    "description": "For a sign fact: the distance to the nearer sign boundary."
                  },
                  "flags": {
                    "type": "array",
                    "items": {
                      "const": "outside-reference-span"
                    },
                    "maxItems": 1
                  }
                },
                "description": "At an instant."
              },
              {
                "type": "object",
                "required": [
                  "atStart",
                  "atEnd",
                  "changes",
                  "flags"
                ],
                "properties": {
                  "atStart": {
                    "$ref": "#/components/schemas/BodyState"
                  },
                  "atEnd": {
                    "$ref": "#/components/schemas/BodyState"
                  },
                  "flags": {
                    "type": "array",
                    "items": {
                      "const": "outside-reference-span"
                    },
                    "maxItems": 1
                  },
                  "changes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "at",
                        "into",
                        "retrograde"
                      ],
                      "properties": {
                        "at": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "into": {
                          "enum": [
                            "aries",
                            "taurus",
                            "gemini",
                            "cancer",
                            "leo",
                            "virgo",
                            "libra",
                            "scorpio",
                            "sagittarius",
                            "capricorn",
                            "aquarius",
                            "pisces"
                          ]
                        },
                        "retrograde": {
                          "type": "boolean"
                        }
                      }
                    }
                  }
                },
                "description": "A sign on a day: the sign changes in the day."
              },
              {
                "type": "object",
                "required": [
                  "atStart",
                  "atEnd",
                  "stations",
                  "flags"
                ],
                "properties": {
                  "atStart": {
                    "$ref": "#/components/schemas/BodyState"
                  },
                  "atEnd": {
                    "$ref": "#/components/schemas/BodyState"
                  },
                  "flags": {
                    "type": "array",
                    "items": {
                      "const": "outside-reference-span"
                    },
                    "maxItems": 1
                  },
                  "stations": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "at",
                        "type"
                      ],
                      "properties": {
                        "at": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "type": {
                          "enum": [
                            "retrograde",
                            "direct"
                          ]
                        }
                      }
                    }
                  }
                },
                "description": "Retrograde on a day: the stations in the day."
              },
              {
                "type": "object",
                "required": [
                  "ingresses",
                  "flags"
                ],
                "properties": {
                  "ingresses": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "at",
                        "retrograde"
                      ],
                      "properties": {
                        "at": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "retrograde": {
                          "type": "boolean"
                        }
                      }
                    }
                  },
                  "flags": {
                    "type": "array",
                    "items": {
                      "const": "outside-reference-span"
                    },
                    "maxItems": 1
                  }
                },
                "description": "An ingress on a day."
              },
              {
                "type": "object",
                "required": [
                  "lunations",
                  "flags"
                ],
                "properties": {
                  "lunations": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "at",
                        "lon",
                        "sign",
                        "degree"
                      ],
                      "properties": {
                        "at": {
                          "type": "string",
                          "format": "date-time"
                        },
                        "lon": {
                          "type": "number"
                        },
                        "sign": {
                          "enum": [
                            "aries",
                            "taurus",
                            "gemini",
                            "cancer",
                            "leo",
                            "virgo",
                            "libra",
                            "scorpio",
                            "sagittarius",
                            "capricorn",
                            "aquarius",
                            "pisces"
                          ]
                        },
                        "degree": {
                          "type": "number"
                        }
                      }
                    }
                  },
                  "flags": {
                    "type": "array",
                    "items": {
                      "const": "outside-reference-span"
                    },
                    "maxItems": 1
                  }
                },
                "description": "A phase on a day."
              }
            ]
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "enum": [
                  "not-found",
                  "method-not-allowed",
                  "disabled",
                  "rate-limited",
                  "rate-limit-unavailable",
                  "unsupported-media-type",
                  "payload-too-large",
                  "invalid-json",
                  "invalid-request",
                  "budget-exhausted",
                  "calculation-failed"
                ]
              },
              "message": {
                "type": "string"
              },
              "pointer": {
                "type": "string",
                "description": "JSON Pointer to the refused field; an empty string is the body itself."
              },
              "limit": {
                "type": "string"
              },
              "max": {
                "type": "integer"
              },
              "retryAfterSeconds": {
                "type": "integer"
              }
            }
          }
        }
      },
      "ChartResponse": {
        "type": "object",
        "required": [
          "schema",
          "result",
          "receipt",
          "backend",
          "cite"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.compute-api.chart.v1"
          },
          "result": {
            "$ref": "#/components/schemas/ChartResult"
          },
          "receipt": {
            "$ref": "#/components/schemas/CalculationReceipt"
          },
          "backend": {
            "$ref": "#/components/schemas/Backend"
          },
          "cite": {
            "$ref": "#/components/schemas/Cite"
          }
        }
      },
      "PositionsResponse": {
        "type": "object",
        "required": [
          "schema",
          "result",
          "receipt",
          "backend",
          "cite"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.compute-api.positions.v1"
          },
          "result": {
            "$ref": "#/components/schemas/PositionsResult"
          },
          "receipt": {
            "$ref": "#/components/schemas/ComputeReceipt"
          },
          "backend": {
            "$ref": "#/components/schemas/Backend"
          },
          "cite": {
            "$ref": "#/components/schemas/Cite"
          }
        }
      },
      "HousesResponse": {
        "type": "object",
        "required": [
          "schema",
          "result",
          "receipt",
          "backend",
          "cite"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.compute-api.houses.v1"
          },
          "result": {
            "$ref": "#/components/schemas/HousesResult"
          },
          "receipt": {
            "$ref": "#/components/schemas/CalculationReceipt"
          },
          "backend": {
            "$ref": "#/components/schemas/Backend"
          },
          "cite": {
            "$ref": "#/components/schemas/Cite"
          }
        }
      },
      "EventsResponse": {
        "type": "object",
        "required": [
          "schema",
          "result",
          "receipt",
          "backend",
          "cite"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.compute-api.events.v1"
          },
          "result": {
            "$ref": "#/components/schemas/EventsResult"
          },
          "receipt": {
            "$ref": "#/components/schemas/ComputeReceipt"
          },
          "backend": {
            "$ref": "#/components/schemas/Backend"
          },
          "cite": {
            "$ref": "#/components/schemas/Cite"
          }
        }
      },
      "TimeResponse": {
        "type": "object",
        "required": [
          "schema",
          "result",
          "receipt",
          "backend",
          "cite"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.compute-api.time.v1"
          },
          "result": {
            "$ref": "#/components/schemas/TimeResult"
          },
          "receipt": {
            "$ref": "#/components/schemas/ComputeReceipt"
          },
          "backend": {
            "$ref": "#/components/schemas/Backend"
          },
          "cite": {
            "$ref": "#/components/schemas/Cite"
          }
        }
      },
      "SkyFactResponse": {
        "type": "object",
        "required": [
          "schema",
          "result",
          "receipt",
          "backend",
          "cite"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.compute-api.sky-fact.v1"
          },
          "result": {
            "$ref": "#/components/schemas/SkyFactResult"
          },
          "receipt": {
            "$ref": "#/components/schemas/ComputeReceipt"
          },
          "backend": {
            "$ref": "#/components/schemas/Backend"
          },
          "cite": {
            "$ref": "#/components/schemas/Cite"
          }
        }
      },
      "ElectionsResponse": {
        "type": "object",
        "required": [
          "schema",
          "result",
          "receipt",
          "backend",
          "cite"
        ],
        "properties": {
          "schema": {
            "const": "zodiacs.compute-api.elections.v1"
          },
          "result": {
            "$ref": "#/components/schemas/ElectionsResult"
          },
          "receipt": {
            "$ref": "#/components/schemas/ComputeReceipt"
          },
          "backend": {
            "$ref": "#/components/schemas/Backend"
          },
          "cite": {
            "$ref": "#/components/schemas/Cite"
          }
        }
      }
    }
  }
}
