{
  "openapi": "3.1.0",
  "info": {
    "title": "Zodiacs.org sky data API",
    "version": "v1.2026-07-20",
    "summary": "Free, static, read-only sky data: today's sky, upcoming events, planets, signs, and per-year retrogrades, stations, ingresses, moon phases, eclipses, and aspects.",
    "description": "Every response is a static JSON file 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-09-19. Guide for AI agents: https://zodiacs.org/api/v1/llms.txt. Documentation: https://zodiacs.org/developers/.",
    "license": {
      "name": "CC BY 4.0",
      "identifier": "CC-BY-4.0",
      "url": "https://creativecommons.org/licenses/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."
    }
  ],
  "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."
          }
        }
      }
    }
  },
  "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"
                      },
                      "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"
                      },
                      "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"
                      },
                      "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"
                      },
                      "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"
                      },
                      "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"
                      },
                      "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"
                      },
                      "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"
                      },
                      "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"
                      },
                      "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"
                },
                "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"
                },
                "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"
          }
        }
      }
    }
  }
}
