{
  "openapi": "3.1.1",
  "info": {
    "title": "Skyfold API",
    "version": "1.0.0",
    "summary": "Deterministic tools for people and AI agents.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://skyfold.usefulweb.app"
    }
  ],
  "paths": {
    "/api/v1/tools": {
      "get": {
        "operationId": "listTools",
        "summary": "Catalog of all tools",
        "responses": {
          "200": {
            "description": "Tool list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/{id}": {
      "get": {
        "operationId": "getTool",
        "summary": "Definition of one tool",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "skyfold-star-map-poster",
                "skyfold-planet-positions",
                "skyfold-eclipse-local",
                "skyfold-satellite-passes",
                "skyfold-sun-shadow",
                "skyfold-cosmic-odometer"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "404": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/skyfold-star-map-poster/calculate": {
      "post": {
        "operationId": "calculateSkyfoldStarMapPoster",
        "summary": "Print the real night sky of any place and moment as an SVG or PDF poster.",
        "description": "Draws the stars to magnitude 6.5, constellation figures, the Moon and planets exactly as they stood above a place at a local date and time, in five print styles and seven paper sizes, as a vector SVG and PDF.\n\nMethodology:\n- Stars: every HYG v4.1 star to magnitude 6.5 (8 920 stars), precessed from J2000 to the date with nutation and annual aberration, then converted to azimuth and altitude with refraction.\n- Projection: zenithal stereographic, zenith in the centre and the horizon as the circle, north up and east on the left as seen when you look up.\n- Constellation figures from d3-celestial (BSD licence); Moon and planets from the Skyfold ephemeris. Dot sizes grow by a factor 1.38 per magnitude.\n- Vector output: the SVG and a one-page PDF at the paper size (standard PDF fonts).\n\nShows the geometric sky without clouds, light pollution or the Milky Way band; proper motions of stars are not applied. Texts outside the Latin-1 character set are replaced in the PDF (use the SVG instead).",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "skyfold_star_map_poster",
        "x-owner-app": "skyfold",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkyfoldStarMapPosterInput"
              },
              "examples": {
                "example1": {
                  "summary": "Paris, 14 June 2019, ivory print",
                  "value": {
                    "location": "48.8566, 2.3522",
                    "timeZone": "Europe/Paris",
                    "date": "2019-06-14",
                    "time": "23:30",
                    "style": "ivory",
                    "size": "a3",
                    "magLimit": 6,
                    "title": "The night we met",
                    "placeLabel": "Paris, France"
                  }
                },
                "example2": {
                  "summary": "Tokyo New Year sky, black and gold",
                  "value": {
                    "location": "35.6762, 139.6503",
                    "timeZone": "Asia/Tokyo",
                    "date": "2027-01-01",
                    "time": "00:00",
                    "style": "black",
                    "size": "square",
                    "magLimit": 5.5,
                    "title": "A new year begins",
                    "placeLabel": "Tokyo",
                    "starNames": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkyfoldStarMapPosterResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/skyfold-planet-positions/calculate": {
      "post": {
        "operationId": "calculateSkyfoldPlanetPositions",
        "summary": "Where the Sun, Moon and planets are, and when they rise and set, for any place and time.",
        "description": "Apparent right ascension, declination, azimuth, altitude, distance, magnitude and phase of the Sun, Moon and seven planets for a place and local time, with rise, transit and set times, twilight and the next Moon phases.\n\nMethodology:\n- Sun and planets: truncated VSOP87D series with light-time iteration, conversion to FK5, nutation (IAU 1980, low-precision terms) and annual aberration (Meeus chapters 25, 32, 33).\n- Moon: the truncated ELP-2000/82 series of Meeus chapter 47 plus nutation; topocentric parallax for altitude and rise/set.\n- Altitudes include standard refraction (Sæmundsson, 10 °C, 1010 hPa). Rise and set use the USNO convention: upper limb on an ideal sea-level horizon with 34′ refraction.\n- Time scales: UTC ≈ UT1; ΔT from observed values 2000–2026 and the Espenak–Meeus polynomials outside.\n\nAccuracy is about an arcsecond or a few arcseconds for the Sun and planets and about 10″ for the Moon against JPL Horizons; rise and set times agree with the U.S. Naval Observatory to the minute in the tests. Local horizon obstructions, weather and unusual refraction are not modelled.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "skyfold_planet_positions",
        "x-owner-app": "skyfold",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkyfoldPlanetPositionsInput"
              },
              "examples": {
                "example1": {
                  "summary": "Utrecht on a November evening",
                  "value": {
                    "location": "52.0907, 5.1214",
                    "elevation": 5,
                    "timeZone": "Europe/Amsterdam",
                    "date": "2026-11-07",
                    "time": "22:00"
                  }
                },
                "example2": {
                  "summary": "Sydney at midnight, southern summer",
                  "value": {
                    "location": "-33.8688, 151.2093",
                    "elevation": 58,
                    "timeZone": "Australia/Sydney",
                    "date": "2027-01-15",
                    "time": "00:00"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkyfoldPlanetPositionsResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/skyfold-eclipse-local/calculate": {
      "post": {
        "operationId": "calculateSkyfoldEclipseLocal",
        "summary": "Solar and lunar eclipses 2020–2040 as seen from your place, with contact times.",
        "description": "For a place, lists every solar and lunar eclipse from 2020 to 2040 with what you will see: partial, annular or total, contact times C1–C4, magnitude, obscuration, duration and the Sun or Moon altitude, computed from NASA Besselian elements.\n\nMethodology:\n- Solar eclipses: NASA/Espenak polynomial Besselian elements (VSOP87/ELP2000-85) with the classical local-circumstances iteration (Explanatory Supplement 1961; Meeus, Elements of Solar Eclipses): maximum where the shadow axis passes closest, contacts where the distance equals the penumbral (C1, C4) or umbral (C2, C3) radius.\n- Magnitude = (L1 − m)/(L1 + L2); obscuration is the covered fraction of the solar disc area from circle overlap.\n- Lunar eclipses: contact times from Espenak’s Five Millennium Catalog (greatest eclipse ± half the phase durations) and the Moon’s altitude from the Skyfold ephemeris.\n- Times are converted from TD to UT with the ΔT used by NASA for each eclipse.\n\nContact times agree with NASA’s published city tables to within a minute; mountains, the lunar limb profile and local weather are not included. Never look at the Sun without certified eclipse glasses, except during totality.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "skyfold_eclipse_local",
        "x-owner-app": "skyfold",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkyfoldEclipseLocalInput"
              },
              "examples": {
                "example1": {
                  "summary": "Burgos, Spain: the 2026–2028 eclipses",
                  "value": {
                    "location": "42.3439, -3.6969",
                    "elevation": 860,
                    "timeZone": "Europe/Madrid",
                    "fromYear": 2026,
                    "toYear": 2028,
                    "kind": "both",
                    "visibleOnly": true
                  }
                },
                "example2": {
                  "summary": "Dallas: the total eclipse of 8 April 2024",
                  "value": {
                    "location": "32.7767, -96.797",
                    "elevation": 140,
                    "timeZone": "America/Chicago",
                    "fromYear": 2024,
                    "toYear": 2024,
                    "kind": "solar",
                    "visibleOnly": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkyfoldEclipseLocalResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/skyfold-satellite-passes/calculate": {
      "post": {
        "operationId": "calculateSkyfoldSatellitePasses",
        "summary": "When the ISS or any satellite flies over you, and whether you can see it, from TLE elements.",
        "description": "Predicts rise, culmination and set of satellites over a place with an SGP4/SDP4 propagator verified against the published Vallado test cases, and marks the naked-eye visible part (satellite in sunlight, sky dark). Paste elements or fetch them from CelesTrak.\n\nMethodology:\n- SGP4/SDP4 after Hoots \u0026 Roehrich (Spacetrack Report #3) as revised by Vallado, Crawford, Hujsak and Kelso (AIAA 2006-6753), WGS-72 constants, AFSPC mode; matches the published verification ephemerides to better than 1 m.\n- TEME positions are rotated to the Earth-fixed frame with Greenwich mean sidereal time; look angles for a WGS84 observer.\n- Passes: elevation sampled every 20–60 s, crossings refined by bisection to 0.5 s, culmination by golden-section search.\n- Visible = satellite at least half sunlit (conical Earth shadow) while the Sun is 6° or more below the observer’s horizon.\n- CelesTrak elements are cached for 2 hours per request, as CelesTrak asks.\n\nTLE predictions degrade with element age (minutes after a week or two); reboosts of the ISS shift passes. Brightness (magnitude) is not predicted.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "skyfold_satellite_passes",
        "x-owner-app": "skyfold",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkyfoldSatellitePassesInput"
              },
              "examples": {
                "example1": {
                  "summary": "ISS over Utrecht (elements of 7 November 2026)",
                  "value": {
                    "location": "52.0907, 5.1214",
                    "timeZone": "Europe/Amsterdam",
                    "date": "2026-11-07",
                    "time": "18:00",
                    "source": "paste",
                    "tle": "ISS (ZARYA)\n1 25544U 98067A   26311.20783432  .00014294  00000+0  26479-3 0  9992\n2 25544  51.6321 312.3516 0007247 357.8301   2.2655 15.49235271593925",
                    "days": 2,
                    "minElevation": 10,
                    "visibleOnly": false
                  }
                },
                "example2": {
                  "summary": "ISS from Madrid, three days",
                  "value": {
                    "location": "40.4168, -3.7038",
                    "timeZone": "Europe/Madrid",
                    "date": "2026-11-08",
                    "time": "00:00",
                    "source": "paste",
                    "tle": "ISS (ZARYA)\n1 25544U 98067A   26311.20783432  .00014294  00000+0  26479-3 0  9992\n2 25544  51.6321 312.3516 0007247 357.8301   2.2655 15.49235271593925",
                    "days": 3,
                    "minElevation": 15,
                    "visibleOnly": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkyfoldSatellitePassesResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/skyfold-sun-shadow/calculate": {
      "post": {
        "operationId": "calculateSkyfoldSunShadow",
        "summary": "Sun angle and the length and direction of a shadow for any height, place and time.",
        "description": "Computes the Sun’s azimuth and altitude, the length and compass direction of the shadow cast by an object of a given height on level ground, the shadow through the day, sunrise, solar noon, sunset and golden hour, plus a day-and-night map.\n\nMethodology:\n- Sun position from VSOP87 with nutation and aberration (Meeus chapter 25), topocentric for the place, with standard refraction for 10 °C and 1010 hPa.\n- Shadow length = height ÷ tan(altitude) on level ground; the shadow points away from the Sun (azimuth + 180°). Below 0.5° altitude the shadow is treated as unbounded.\n- Day-and-night map: sub-solar point from the apparent Sun and sidereal time; boundaries where the Sun is at −0.83°, −6°, −12° and −18°.\n\nAssumes flat, level ground and a thin vertical object; terrain, slopes, neighbouring buildings and atmospheric conditions change real shadows.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "skyfold_sun_shadow",
        "x-owner-app": "skyfold",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkyfoldSunShadowInput"
              },
              "examples": {
                "example1": {
                  "summary": "A 6 m tree in Munich at the March equinox",
                  "value": {
                    "location": "48.1351, 11.582",
                    "elevation": 520,
                    "timeZone": "Europe/Berlin",
                    "date": "2026-03-20",
                    "time": "16:00",
                    "height": 6,
                    "unit": "m",
                    "stepMinutes": "60"
                  }
                },
                "example2": {
                  "summary": "A 30 ft house in Phoenix at the winter solstice",
                  "value": {
                    "location": "33.4484, -112.074",
                    "elevation": 331,
                    "timeZone": "America/Phoenix",
                    "date": "2026-12-21",
                    "time": "12:00",
                    "height": 30,
                    "unit": "ft",
                    "stepMinutes": "30"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkyfoldSunShadowResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tools/skyfold-cosmic-odometer/calculate": {
      "post": {
        "operationId": "calculateSkyfoldCosmicOdometer",
        "summary": "How far you have travelled through space since a date, frame by frame.",
        "description": "From a start date such as your birthday, computes the distance travelled with the Earth’s rotation at your latitude, around the Sun (integrated from VSOP87), around the Milky Way and relative to the cosmic background radiation, with orbits, full Moons and stars whose light left them when you were born.\n\nMethodology:\n- Rotation: circumference of the latitude circle on the WGS84 ellipsoid per sidereal day (86 164.0905 s).\n- Orbit: the Earth’s heliocentric path length, summed from VSOP87 positions every 6 hours (about 940 million km per year).\n- Galaxy: 247 km/s (Reid et al. 2019); cosmic background: 369.82 km/s (Planck 2018). These are separate frames and are not added together.\n- Full Moons: instants of 180° elongation found with the Skyfold Moon theory; light-echo stars: HYG stars brighter than magnitude 6 whose distance in light years is within 3 % of the elapsed years.\n\nGalactic and cosmic speeds carry uncertainties of a few percent; star distances in HYG can be uncertain by 10 % or more for distant stars.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "skyfold_cosmic_odometer",
        "x-owner-app": "skyfold",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkyfoldCosmicOdometerInput"
              },
              "examples": {
                "example1": {
                  "summary": "Since the year 2000, at the equator",
                  "value": {
                    "startDate": "2000-01-01",
                    "startTime": "00:00",
                    "endDate": "2026-11-07",
                    "timeZone": "UTC",
                    "latitude": 0
                  }
                },
                "example2": {
                  "summary": "Born 17 May 1990 in Utrecht",
                  "value": {
                    "startDate": "1990-05-17",
                    "startTime": "08:00",
                    "endDate": "2026-11-07",
                    "timeZone": "Europe/Amsterdam",
                    "latitude": 52.09
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkyfoldCosmicOdometerResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/workflows": {
      "get": {
        "operationId": "listWorkflows",
        "summary": "Multi-tool workflows",
        "responses": {
          "200": {
            "description": "Workflow list.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "SkyfoldStarMapPosterInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "location": {
            "title": "Location (latitude, longitude)",
            "description": "Decimal degrees such as 52.09, 5.12 (north and east positive), or DMS, UTM, MGRS, Maidenhead or a plus code.",
            "type": "string",
            "maxLength": 80,
            "default": "48.8566, 2.3522"
          },
          "elevation": {
            "title": "Elevation above sea level",
            "type": "number",
            "minimum": -500,
            "maximum": 9000,
            "default": 0,
            "x-unit": "m"
          },
          "timeZone": {
            "title": "Time zone",
            "description": "IANA name such as Europe/Berlin or America/New_York, or a fixed offset such as UTC+2.",
            "type": "string",
            "maxLength": 64,
            "default": "Europe/Paris"
          },
          "date": {
            "title": "Local date",
            "type": "string",
            "format": "date",
            "default": "2019-06-14"
          },
          "time": {
            "title": "Local time",
            "type": "string",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "default": "23:30"
          },
          "style": {
            "title": "Style",
            "type": "string",
            "enum": [
              "midnight",
              "ivory",
              "black",
              "blueprint",
              "red"
            ],
            "default": "midnight"
          },
          "size": {
            "title": "Paper size",
            "type": "string",
            "enum": [
              "a4",
              "a3",
              "a2",
              "letter",
              "in12x16",
              "in18x24",
              "square"
            ],
            "default": "a3"
          },
          "magLimit": {
            "title": "Faintest stars (magnitude)",
            "description": "Larger numbers show fainter stars; 6 to 6.5 is the naked-eye limit under a dark sky.",
            "type": "number",
            "minimum": 3,
            "maximum": 6.5,
            "default": 6
          },
          "title": {
            "title": "Title",
            "type": "string",
            "maxLength": 120,
            "default": "The night we met"
          },
          "subtitle": {
            "title": "Subtitle",
            "type": "string",
            "maxLength": 120,
            "default": ""
          },
          "placeLabel": {
            "title": "Place line",
            "type": "string",
            "maxLength": 120,
            "default": "Paris, France"
          },
          "dateLabel": {
            "title": "Date line",
            "description": "Leave blank to print the local date and time.",
            "type": "string",
            "maxLength": 120,
            "default": ""
          },
          "constellations": {
            "title": "Constellation lines",
            "type": "boolean",
            "default": true
          },
          "constellationNames": {
            "title": "Constellation names",
            "type": "boolean",
            "default": true
          },
          "starNames": {
            "title": "Names of the brightest stars",
            "type": "boolean",
            "default": false
          },
          "planets": {
            "title": "Moon and planets",
            "type": "boolean",
            "default": true
          },
          "colorStars": {
            "title": "Star colours from the B−V index",
            "type": "boolean",
            "default": false
          }
        },
        "required": []
      },
      "SkyfoldStarMapPosterResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SkyfoldPlanetPositionsInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "location": {
            "title": "Location (latitude, longitude)",
            "description": "Decimal degrees such as 52.09, 5.12 (north and east positive), or DMS, UTM, MGRS, Maidenhead or a plus code.",
            "type": "string",
            "maxLength": 80,
            "default": "52.0907, 5.1214"
          },
          "elevation": {
            "title": "Elevation above sea level",
            "type": "number",
            "minimum": -500,
            "maximum": 9000,
            "default": 0,
            "x-unit": "m"
          },
          "timeZone": {
            "title": "Time zone",
            "description": "IANA name such as Europe/Berlin or America/New_York, or a fixed offset such as UTC+2.",
            "type": "string",
            "maxLength": 64,
            "default": "Europe/Amsterdam"
          },
          "date": {
            "title": "Local date",
            "type": "string",
            "format": "date",
            "default": "2026-11-07"
          },
          "time": {
            "title": "Local time",
            "type": "string",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "default": "22:00"
          }
        },
        "required": []
      },
      "SkyfoldPlanetPositionsResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SkyfoldEclipseLocalInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "location": {
            "title": "Location (latitude, longitude)",
            "description": "Decimal degrees such as 52.09, 5.12 (north and east positive), or DMS, UTM, MGRS, Maidenhead or a plus code.",
            "type": "string",
            "maxLength": 80,
            "default": "42.3439, -3.6969"
          },
          "elevation": {
            "title": "Elevation above sea level",
            "type": "number",
            "minimum": -500,
            "maximum": 9000,
            "default": 0,
            "x-unit": "m"
          },
          "timeZone": {
            "title": "Time zone",
            "description": "IANA name such as Europe/Berlin or America/New_York, or a fixed offset such as UTC+2.",
            "type": "string",
            "maxLength": 64,
            "default": "Europe/Madrid"
          },
          "fromYear": {
            "title": "From year",
            "type": "integer",
            "minimum": 2020,
            "maximum": 2040,
            "default": 2026
          },
          "toYear": {
            "title": "To year",
            "type": "integer",
            "minimum": 2020,
            "maximum": 2040,
            "default": 2028
          },
          "kind": {
            "title": "Eclipses",
            "type": "string",
            "enum": [
              "both",
              "solar",
              "lunar"
            ],
            "default": "both"
          },
          "visibleOnly": {
            "title": "Only eclipses visible from this place",
            "type": "boolean",
            "default": true
          }
        },
        "required": []
      },
      "SkyfoldEclipseLocalResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SkyfoldSatellitePassesInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "location": {
            "title": "Location (latitude, longitude)",
            "description": "Decimal degrees such as 52.09, 5.12 (north and east positive), or DMS, UTM, MGRS, Maidenhead or a plus code.",
            "type": "string",
            "maxLength": 80,
            "default": "52.0907, 5.1214"
          },
          "elevation": {
            "title": "Elevation above sea level",
            "type": "number",
            "minimum": -500,
            "maximum": 9000,
            "default": 0,
            "x-unit": "m"
          },
          "timeZone": {
            "title": "Time zone",
            "description": "IANA name such as Europe/Berlin or America/New_York, or a fixed offset such as UTC+2.",
            "type": "string",
            "maxLength": 64,
            "default": "Europe/Amsterdam"
          },
          "date": {
            "title": "Local date",
            "type": "string",
            "format": "date",
            "default": "2026-11-07"
          },
          "time": {
            "title": "Local time",
            "type": "string",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "default": "18:00"
          },
          "source": {
            "title": "Elements",
            "type": "string",
            "enum": [
              "paste",
              "celestrak"
            ],
            "default": "paste"
          },
          "tle": {
            "title": "Two-line elements (TLE)",
            "description": "One or more sets: an optional name line, then line 1 and line 2.",
            "type": "string",
            "maxLength": 60000,
            "default": "ISS (ZARYA)\n1 25544U 98067A   26311.20783432  .00014294  00000+0  26479-3 0  9992\n2 25544  51.6321 312.3516 0007247 357.8301   2.2655 15.49235271593925"
          },
          "catalogNumbers": {
            "title": "NORAD catalogue numbers (CelesTrak)",
            "description": "Up to 5 numbers separated by commas, for example 25544 for the ISS. Used when Elements is set to CelesTrak.",
            "type": "string",
            "maxLength": 60,
            "default": "25544"
          },
          "group": {
            "title": "Or a CelesTrak group",
            "type": "string",
            "enum": [
              "",
              "stations",
              "visual",
              "amateur",
              "weather",
              "science"
            ],
            "default": ""
          },
          "days": {
            "title": "Days to search",
            "type": "number",
            "minimum": 0.25,
            "maximum": 7,
            "default": 2
          },
          "minElevation": {
            "title": "Minimum elevation",
            "type": "number",
            "minimum": 0,
            "maximum": 80,
            "default": 10,
            "x-unit": "°"
          },
          "visibleOnly": {
            "title": "Only naked-eye visible passes",
            "type": "boolean",
            "default": false
          }
        },
        "required": []
      },
      "SkyfoldSatellitePassesResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SkyfoldSunShadowInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "location": {
            "title": "Location (latitude, longitude)",
            "description": "Decimal degrees such as 52.09, 5.12 (north and east positive), or DMS, UTM, MGRS, Maidenhead or a plus code.",
            "type": "string",
            "maxLength": 80,
            "default": "48.1351, 11.582"
          },
          "elevation": {
            "title": "Elevation above sea level",
            "type": "number",
            "minimum": -500,
            "maximum": 9000,
            "default": 0,
            "x-unit": "m"
          },
          "timeZone": {
            "title": "Time zone",
            "description": "IANA name such as Europe/Berlin or America/New_York, or a fixed offset such as UTC+2.",
            "type": "string",
            "maxLength": 64,
            "default": "Europe/Berlin"
          },
          "date": {
            "title": "Local date",
            "type": "string",
            "format": "date",
            "default": "2026-03-20"
          },
          "time": {
            "title": "Local time",
            "type": "string",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "default": "16:00"
          },
          "height": {
            "title": "Object height",
            "type": "number",
            "minimum": 0.01,
            "maximum": 1000,
            "default": 6
          },
          "unit": {
            "title": "Unit",
            "type": "string",
            "enum": [
              "m",
              "ft"
            ],
            "default": "m"
          },
          "stepMinutes": {
            "title": "Table step",
            "type": "string",
            "enum": [
              "15",
              "30",
              "60"
            ],
            "default": "60"
          }
        },
        "required": []
      },
      "SkyfoldSunShadowResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "SkyfoldCosmicOdometerInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "startDate": {
            "title": "Start date (for example your birthday)",
            "type": "string",
            "format": "date",
            "default": "2000-01-01"
          },
          "startTime": {
            "title": "Start time",
            "type": "string",
            "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$",
            "default": "12:00"
          },
          "endDate": {
            "title": "End date",
            "description": "Leave blank for today (UTC date).",
            "type": "string",
            "format": "date"
          },
          "timeZone": {
            "title": "Time zone",
            "type": "string",
            "maxLength": 64,
            "default": "UTC"
          },
          "latitude": {
            "title": "Latitude for Earth’s rotation",
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "default": 0,
            "x-unit": "°"
          }
        },
        "required": []
      },
      "SkyfoldCosmicOdometerResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object"
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}