{
  "openapi" : "3.0.3",
  "components" : {
    "schemas" : {
      "AsrMethod" : {
        "enum" : [ "OneShadowLength", "TwoShadowLength" ],
        "type" : "string"
      },
      "AstroTimes" : {
        "required" : [ "morningNineteen", "morningFifteen", "morningTwelve", "morningNinety", "morningHundretTwenty", "eveningFifteen", "eveningSixteen", "eveningTwelve", "eveningNinety", "eveningHundretTwenty" ],
        "type" : "object",
        "properties" : {
          "morningNineteen" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/ZonedEventTime"
            } ],
            "nullable" : true
          },
          "morningFifteen" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/ZonedEventTime"
            } ],
            "nullable" : true
          },
          "morningTwelve" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/ZonedEventTime"
            } ],
            "nullable" : true
          },
          "morningNinety" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "morningHundretTwenty" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "eveningFifteen" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/ZonedEventTime"
            } ],
            "nullable" : true
          },
          "eveningSixteen" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/ZonedEventTime"
            } ],
            "nullable" : true
          },
          "eveningTwelve" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/ZonedEventTime"
            } ],
            "nullable" : true
          },
          "eveningNinety" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "eveningHundretTwenty" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          }
        }
      },
      "CalculationMethod" : {
        "enum" : [ "AqrabAlBiladAlNisb", "Polar", "Bosnia", "Mwl2007", "Mwl2009", "Ijtihad2022", "Ijtihad2025", "Diyanet", "Unity2023", "Ditib2023", "DumRT", "DumRF", "DumCR", "UmmAlQura", "EgyptGeneralObservatory", "Astronomical", "NientyMinutes", "Fifteen", "Twelve", "Dag2023", "Hanafi", "Jakim", "KementerianAgama", "Traditional", "Fusul", "Custom" ],
        "type" : "string"
      },
      "CalculationOverrides" : {
        "description" : "Optional overrides applied on top of the chosen `method`. Every field is optional; omitted/null fields keep the value defined by the method. Use `POST /prayer/methodOverrides` to see the resulting effective parameters. To build a method from scratch use method `Custom` and set the fields you need.",
        "type" : "object",
        "properties" : {
          "dateAdjustment" : {
            "format" : "int32",
            "description" : "Days added to the Hijri date (e.g. -1 or +1) to follow a local moon sighting.",
            "type" : "integer",
            "nullable" : true
          },
          "fajrAngle" : {
            "format" : "double",
            "description" : "Sun depression angle in degrees below the horizon for Fajr (e.g. 18.0). Larger = earlier Fajr.",
            "type" : "number",
            "nullable" : true
          },
          "ishaaAngle" : {
            "format" : "double",
            "description" : "Sun depression angle in degrees below the horizon for Ishaa (e.g. 17.0). Larger = later Ishaa.",
            "type" : "number",
            "nullable" : true
          },
          "istiwaZawalMethod" : {
            "description" : "How Istiwa (forbidden time at zenith) and Zawal (start of Dhuhr) are derived from solar noon: Mathematical (exact solar noon), AzimuthCorrection (1/3 degree azimuth correction, classical default), MillimeterCorrection (1 mm shadow increase), ArcMinute (1 arcminute altitude drop from culmination), Ottoman (adds difference between apparent and mathematical sunset).",
            "allOf" : [ {
              "$ref" : "#/components/schemas/IstiwaZawalMethod"
            } ],
            "nullable" : true
          },
          "fajrMethod" : {
            "description" : "Fallback strategy for Fajr when the angle cannot be reached (high latitudes) or special handling: YearAverage (year-average night percentage), AstronomicalMidnight (lower meridian passage), FixedMinutes (see `fajrMinutes`, minutes before shuruk), Proportion45 (twilight share of the night at 45 degrees latitude), FixedLatitude45 (compute twilight as if at 45 degrees latitude), DITIB (DITIB 2023 spring/autumn interpolation).",
            "allOf" : [ {
              "$ref" : "#/components/schemas/FajrMethod"
            } ],
            "nullable" : true
          },
          "ishaaMethod" : {
            "description" : "Fallback strategy for Ishaa when the angle cannot be reached or special handling: YearAverage, Fusul (sunset/sunrise duration ratio), FixedMinutes (see `ishaaMinutes`, minutes after maghrib), Proportion45, FixedLatitude45, DITIB, UmmAlQura (90 or 120 minutes after maghrib depending on Ramadan).",
            "allOf" : [ {
              "$ref" : "#/components/schemas/IshaaMethod"
            } ],
            "nullable" : true
          },
          "shurukMethod" : {
            "description" : "Which point of the bounding box is used for sunrise: Earliest (strictest, earliest possible sunrise) or Latest (lenient, latest possible sunrise). Only relevant with a bounding box.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/ShurukMethod"
            } ],
            "nullable" : true
          },
          "shurukTamkinOptions" : {
            "description" : "Horizon corrections applied to sunrise.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/RiseSetTamkinOverrides"
            } ],
            "nullable" : true
          },
          "maghribTamkinOptions" : {
            "description" : "Horizon corrections applied to sunset (maghrib).",
            "allOf" : [ {
              "$ref" : "#/components/schemas/RiseSetTamkinOverrides"
            } ],
            "nullable" : true
          },
          "fajrTamkinOptions" : {
            "description" : "Horizon corrections applied to the Fajr twilight.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/TwilightTamkinOverrides"
            } ],
            "nullable" : true
          },
          "ishaaTamkinOptions" : {
            "description" : "Horizon corrections applied to the Ishaa twilight.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/TwilightTamkinOverrides"
            } ],
            "nullable" : true
          },
          "hanafi" : {
            "description" : "Deprecated, use `asrMethod`. true = two shadow lengths.",
            "type" : "boolean",
            "nullable" : true,
            "deprecated" : true
          },
          "asrMethod" : {
            "description" : "OneShadowLength (shadow = object length, Shafi'i/Maliki/Hanbali) or TwoShadowLength (Hanafi).",
            "allOf" : [ {
              "$ref" : "#/components/schemas/AsrMethod"
            } ],
            "nullable" : true
          },
          "endIshaaMethod" : {
            "description" : "When Ishaa ends: Fajr (standard), HalfNight (Islamic midnight) or ThirdNight (first third of the night).",
            "allOf" : [ {
              "$ref" : "#/components/schemas/EndIshaaMethod"
            } ],
            "nullable" : true
          },
          "fajrMinutes" : {
            "format" : "int32",
            "description" : "Minutes before sunrise for Fajr when `fajrMethod` is FixedMinutes.",
            "type" : "integer",
            "nullable" : true
          },
          "ishaaMinutes" : {
            "format" : "int32",
            "description" : "Minutes after sunset for Ishaa when `ishaaMethod` is FixedMinutes.",
            "type" : "integer",
            "nullable" : true
          },
          "methodSecurity" : {
            "description" : "Safety margins (minutes) added to each prayer time.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/MethodSecurityOverrides"
            } ],
            "nullable" : true
          },
          "roundingFajr" : {
            "description" : "Rounding of the Fajr time to full minutes: Up, Down or None.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Rounding"
            } ],
            "nullable" : true
          },
          "roundingShuruk" : {
            "description" : "Rounding of the Shuruk time to full minutes: Up, Down or None.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Rounding"
            } ],
            "nullable" : true
          },
          "roundingDhuhr" : {
            "description" : "Rounding of the Dhuhr time to full minutes: Up, Down or None.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Rounding"
            } ],
            "nullable" : true
          },
          "roundingAsr" : {
            "description" : "Rounding of the Asr time to full minutes: Up, Down or None.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Rounding"
            } ],
            "nullable" : true
          },
          "roundingMaghrib" : {
            "description" : "Rounding of the Maghrib time to full minutes: Up, Down or None.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Rounding"
            } ],
            "nullable" : true
          },
          "roundingIshaa" : {
            "description" : "Rounding of the Ishaa time to full minutes: Up, Down or None.",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Rounding"
            } ],
            "nullable" : true
          }
        }
      },
      "CalculationParameters" : {
        "description" : "Effective (resolved) calculation parameters of a method including overrides. Field names match `CalculationOverrides`, so values can be copied into `overrides` and modified.",
        "required" : [ "method", "fajrAngle", "ishaaAngle", "istiwaZawalMethod", "fajrMethod", "ishaaMethod", "shurukMethod", "shurukTamkinOptions", "maghribTamkinOptions", "fajrTamkinOptions", "ishaaTamkinOptions", "asrMethod", "endIshaaMethod", "fajrMinutes", "ishaaMinutes", "methodSecurity", "roundingFajr", "roundingShuruk", "roundingDhuhr", "roundingAsr", "roundingMaghrib", "roundingIshaa" ],
        "type" : "object",
        "properties" : {
          "method" : {
            "$ref" : "#/components/schemas/CalculationMethod"
          },
          "dateAdjustment" : {
            "format" : "int32",
            "type" : "integer"
          },
          "fajrAngle" : {
            "format" : "double",
            "type" : "number"
          },
          "ishaaAngle" : {
            "format" : "double",
            "type" : "number"
          },
          "istiwaZawalMethod" : {
            "$ref" : "#/components/schemas/IstiwaZawalMethod"
          },
          "fajrMethod" : {
            "$ref" : "#/components/schemas/FajrMethod"
          },
          "ishaaMethod" : {
            "$ref" : "#/components/schemas/IshaaMethod"
          },
          "shurukMethod" : {
            "$ref" : "#/components/schemas/ShurukMethod"
          },
          "shurukTamkinOptions" : {
            "$ref" : "#/components/schemas/RiseSetTamkinOptions"
          },
          "maghribTamkinOptions" : {
            "$ref" : "#/components/schemas/RiseSetTamkinOptions"
          },
          "fajrTamkinOptions" : {
            "$ref" : "#/components/schemas/TwilightTamkinOptions"
          },
          "ishaaTamkinOptions" : {
            "$ref" : "#/components/schemas/TwilightTamkinOptions"
          },
          "asrMethod" : {
            "$ref" : "#/components/schemas/AsrMethod"
          },
          "endIshaaMethod" : {
            "$ref" : "#/components/schemas/EndIshaaMethod"
          },
          "fajrMinutes" : {
            "format" : "int32",
            "type" : "integer"
          },
          "ishaaMinutes" : {
            "format" : "int32",
            "type" : "integer"
          },
          "methodSecurity" : {
            "$ref" : "#/components/schemas/MethodSecurity"
          },
          "roundingFajr" : {
            "$ref" : "#/components/schemas/Rounding"
          },
          "roundingShuruk" : {
            "$ref" : "#/components/schemas/Rounding"
          },
          "roundingDhuhr" : {
            "$ref" : "#/components/schemas/Rounding"
          },
          "roundingAsr" : {
            "$ref" : "#/components/schemas/Rounding"
          },
          "roundingMaghrib" : {
            "$ref" : "#/components/schemas/Rounding"
          },
          "roundingIshaa" : {
            "$ref" : "#/components/schemas/Rounding"
          },
          "polarFallbackLatitude" : {
            "format" : "double",
            "type" : "number"
          },
          "fallbackFajrMethod" : {
            "$ref" : "#/components/schemas/FajrMethod"
          },
          "fallbackIshaaMethod" : {
            "$ref" : "#/components/schemas/IshaaMethod"
          }
        }
      },
      "Coordinate" : {
        "description" : "Geographic coordinate (latitude/longitude in degrees, elevation in meters).",
        "required" : [ "latitude", "longitude" ],
        "type" : "object",
        "properties" : {
          "latitude" : {
            "format" : "double",
            "description" : "Latitude in degrees.",
            "type" : "number"
          },
          "longitude" : {
            "format" : "double",
            "description" : "Longitude in degrees.",
            "type" : "number"
          },
          "elevation" : {
            "format" : "double",
            "description" : "Elevation in meters above sea level.",
            "type" : "number"
          },
          "accuracy" : {
            "format" : "double",
            "description" : "Horizontal accuracy in meters (optional).",
            "type" : "number"
          },
          "elevationAccuracy" : {
            "format" : "double",
            "description" : "Elevation accuracy in meters (optional).",
            "type" : "number"
          }
        }
      },
      "DayOfWeek" : {
        "enum" : [ "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" ],
        "type" : "string"
      },
      "DayOfWeek1" : {
        "enum" : [ "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" ],
        "type" : "string"
      },
      "Duration" : {
        "format" : "duration",
        "type" : "string",
        "example" : "P1D"
      },
      "EndIshaaMethod" : {
        "enum" : [ "Fajr", "HalfNight", "ThirdNight" ],
        "type" : "string"
      },
      "FajrMethod" : {
        "enum" : [ "YearAverage", "AstronomicalMidnight", "FixedMinutes", "Proportion45", "FixedLatitude45", "DITIB" ],
        "type" : "string"
      },
      "HijriDate" : {
        "required" : [ "year", "month", "day" ],
        "type" : "object",
        "properties" : {
          "year" : {
            "format" : "int32",
            "type" : "integer"
          },
          "month" : {
            "format" : "int32",
            "type" : "integer"
          },
          "day" : {
            "format" : "int32",
            "type" : "integer"
          }
        }
      },
      "Instant" : {
        "required" : [ "epochSeconds", "nanosecondsOfSecond" ],
        "type" : "object",
        "properties" : {
          "epochSeconds" : {
            "format" : "int64",
            "type" : "integer"
          },
          "nanosecondsOfSecond" : {
            "format" : "int32",
            "type" : "integer"
          }
        }
      },
      "Instant1" : {
        "format" : "date-time",
        "type" : "string",
        "example" : "2022-03-10T16:15:50Z"
      },
      "IshaaMethod" : {
        "enum" : [ "YearAverage", "Fusul", "FixedMinutes", "Proportion45", "FixedLatitude45", "DITIB", "UmmAlQura" ],
        "type" : "string"
      },
      "IstiwaZawalMethod" : {
        "enum" : [ "Mathematical", "AzimuthCorrection", "MillimeterCorrection", "ArcMinute", "Ottoman" ],
        "type" : "string"
      },
      "LocalDate" : {
        "required" : [ "value" ],
        "type" : "object",
        "properties" : {
          "value" : {
            "$ref" : "#/components/schemas/LocalDate1"
          },
          "value$kotlinx_datetime" : {
            "$ref" : "#/components/schemas/LocalDate1"
          },
          "year" : {
            "format" : "int32",
            "type" : "integer"
          },
          "monthNumber" : {
            "format" : "int32",
            "type" : "integer"
          },
          "month" : {
            "$ref" : "#/components/schemas/Month"
          },
          "dayOfMonth" : {
            "format" : "int32",
            "type" : "integer"
          },
          "day" : {
            "format" : "int32",
            "type" : "integer"
          },
          "dayOfWeek" : {
            "$ref" : "#/components/schemas/DayOfWeek"
          },
          "dayOfYear" : {
            "format" : "int32",
            "type" : "integer"
          }
        }
      },
      "LocalDate1" : {
        "format" : "date",
        "type" : "string",
        "example" : "2022-03-10"
      },
      "LocalDateTime" : {
        "required" : [ "value" ],
        "type" : "object",
        "properties" : {
          "value" : {
            "$ref" : "#/components/schemas/LocalDateTime1"
          },
          "value$kotlinx_datetime" : {
            "$ref" : "#/components/schemas/LocalDateTime1"
          },
          "year" : {
            "format" : "int32",
            "type" : "integer"
          },
          "monthNumber" : {
            "format" : "int32",
            "type" : "integer"
          },
          "month" : {
            "$ref" : "#/components/schemas/Month"
          },
          "dayOfMonth" : {
            "format" : "int32",
            "type" : "integer"
          },
          "day" : {
            "format" : "int32",
            "type" : "integer"
          },
          "dayOfWeek" : {
            "$ref" : "#/components/schemas/DayOfWeek"
          },
          "dayOfYear" : {
            "format" : "int32",
            "type" : "integer"
          },
          "hour" : {
            "format" : "int32",
            "type" : "integer"
          },
          "minute" : {
            "format" : "int32",
            "type" : "integer"
          },
          "second" : {
            "format" : "int32",
            "type" : "integer"
          },
          "nanosecond" : {
            "format" : "int32",
            "type" : "integer"
          },
          "date" : {
            "$ref" : "#/components/schemas/LocalDate"
          },
          "time" : {
            "$ref" : "#/components/schemas/LocalTime"
          }
        }
      },
      "LocalDateTime1" : {
        "format" : "date-time",
        "type" : "string",
        "example" : "2022-03-10T12:15:50"
      },
      "LocalTime" : {
        "required" : [ "value" ],
        "type" : "object",
        "properties" : {
          "value" : {
            "$ref" : "#/components/schemas/LocalTime1"
          },
          "value$kotlinx_datetime" : {
            "$ref" : "#/components/schemas/LocalTime1"
          },
          "hour" : {
            "format" : "int32",
            "type" : "integer"
          },
          "minute" : {
            "format" : "int32",
            "type" : "integer"
          },
          "second" : {
            "format" : "int32",
            "type" : "integer"
          },
          "nanosecond" : {
            "format" : "int32",
            "type" : "integer"
          }
        }
      },
      "LocalTime1" : {
        "format" : "local-time",
        "type" : "string",
        "externalDocs" : {
          "description" : "As defined by 'partial-time' in RFC3339",
          "url" : "https://www.rfc-editor.org/rfc/rfc3339.html#section-5.6"
        },
        "example" : "13:45:30.123456789"
      },
      "MethodAdjustment" : {
        "type" : "object",
        "properties" : {
          "fajr" : {
            "format" : "int32",
            "type" : "integer"
          },
          "shuruk" : {
            "format" : "int32",
            "type" : "integer"
          },
          "dhuhr" : {
            "format" : "int32",
            "type" : "integer"
          },
          "asr" : {
            "format" : "int32",
            "type" : "integer"
          },
          "maghreb" : {
            "format" : "int32",
            "type" : "integer"
          },
          "ishaa" : {
            "format" : "int32",
            "type" : "integer"
          }
        }
      },
      "MethodSecurity" : {
        "type" : "object",
        "properties" : {
          "fajr" : {
            "format" : "double",
            "type" : "number"
          },
          "shuruk" : {
            "format" : "double",
            "type" : "number"
          },
          "dhuhr" : {
            "format" : "double",
            "type" : "number"
          },
          "asr" : {
            "format" : "double",
            "type" : "number"
          },
          "maghreb" : {
            "format" : "double",
            "type" : "number"
          },
          "ishaa" : {
            "format" : "double",
            "type" : "number"
          }
        }
      },
      "MethodSecurityOverrides" : {
        "description" : "Safety margins in minutes added to the calculated time of each prayer.",
        "type" : "object",
        "properties" : {
          "fajr" : {
            "format" : "double",
            "description" : "Minutes added to Fajr.",
            "type" : "number",
            "nullable" : true
          },
          "shuruk" : {
            "format" : "double",
            "description" : "Minutes added to Shuruk.",
            "type" : "number",
            "nullable" : true
          },
          "dhuhr" : {
            "format" : "double",
            "description" : "Minutes added to Dhuhr.",
            "type" : "number",
            "nullable" : true
          },
          "asr" : {
            "format" : "double",
            "description" : "Minutes added to Asr.",
            "type" : "number",
            "nullable" : true
          },
          "maghreb" : {
            "format" : "double",
            "description" : "Minutes added to Maghrib.",
            "type" : "number",
            "nullable" : true
          },
          "ishaa" : {
            "format" : "double",
            "description" : "Minutes added to Ishaa.",
            "type" : "number",
            "nullable" : true
          }
        }
      },
      "Month" : {
        "enum" : [ "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" ],
        "type" : "string"
      },
      "Month1" : {
        "enum" : [ "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" ],
        "type" : "string"
      },
      "PrayerTimes" : {
        "required" : [ "date", "hijriDate", "hijriDateAfterMaghrib", "astroTimes", "nightLength", "timezone", "fajr", "shuruk", "duha", "istiwa", "dhuhr", "asr", "maghrib", "maghribYesterday", "ishaa", "ishaaYesterday", "fajrCertain", "asrTwoShadowLength", "asrSelected", "asrEnd", "endIshaa", "endIshaaYesterday", "halfNight", "halfNightYesterday", "firstThirdNight", "firstThirdShuruk", "thirdNight", "thirdNightYesterday", "dayBreak", "fajrTomorrow", "sunshine", "fasting", "sleeping", "adjustment", "security", "method", "asrMethod", "lowestCulmination", "lowestCulminationYear", "highestCulmination", "highestCulminationYear", "sunNoonShadowLength", "maghribElevationOffsetSeconds", "combineIshaa" ],
        "type" : "object",
        "properties" : {
          "date" : {
            "$ref" : "#/components/schemas/LocalDate"
          },
          "hijriDate" : {
            "$ref" : "#/components/schemas/HijriDate"
          },
          "hijriDateAfterMaghrib" : {
            "$ref" : "#/components/schemas/HijriDate"
          },
          "astroTimes" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/AstroTimes"
            } ],
            "nullable" : true
          },
          "nightLength" : {
            "format" : "int64",
            "type" : "integer"
          },
          "timezone" : {
            "$ref" : "#/components/schemas/TimeZone"
          },
          "fajr" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "shuruk" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "duha" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "istiwa" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "dhuhr" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "asr" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "maghrib" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "maghribYesterday" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "ishaa" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "ishaaYesterday" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "fajrCertain" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "asrTwoShadowLength" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "asrSelected" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "asrEnd" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "endIshaa" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "endIshaaYesterday" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "halfNight" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "halfNightYesterday" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "firstThirdNight" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "firstThirdShuruk" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "thirdNight" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "thirdNightYesterday" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "dayBreak" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "fajrTomorrow" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "sunshine" : {
            "format" : "int64",
            "type" : "integer"
          },
          "fasting" : {
            "format" : "int64",
            "type" : "integer"
          },
          "sleeping" : {
            "format" : "int64",
            "type" : "integer"
          },
          "adjustment" : {
            "$ref" : "#/components/schemas/MethodAdjustment"
          },
          "security" : {
            "$ref" : "#/components/schemas/MethodSecurity"
          },
          "method" : {
            "$ref" : "#/components/schemas/CalculationMethod"
          },
          "asrMethod" : {
            "$ref" : "#/components/schemas/AsrMethod"
          },
          "lowestCulmination" : {
            "format" : "double",
            "type" : "number"
          },
          "lowestCulminationYear" : {
            "format" : "double",
            "type" : "number"
          },
          "highestCulmination" : {
            "format" : "double",
            "type" : "number"
          },
          "highestCulminationYear" : {
            "format" : "double",
            "type" : "number"
          },
          "sunNoonShadowLength" : {
            "format" : "double",
            "type" : "number"
          },
          "maghribElevationOffsetSeconds" : {
            "format" : "int32",
            "type" : "integer"
          },
          "combineIshaa" : {
            "type" : "boolean"
          }
        }
      },
      "PrayerTimesRequest" : {
        "description" : "Request body for the *Custom endpoints: location, date, calculation method and optional overrides.",
        "required" : [ "latitude", "longitude", "elevation", "timezone", "year", "month", "method" ],
        "type" : "object",
        "properties" : {
          "latitude" : {
            "format" : "double",
            "description" : "Latitude in decimal degrees (-90 to 90).",
            "type" : "number",
            "example" : 52.52
          },
          "longitude" : {
            "format" : "double",
            "description" : "Longitude in decimal degrees (-180 to 180).",
            "type" : "number",
            "example" : 13.4
          },
          "elevation" : {
            "format" : "double",
            "description" : "Elevation in meters above sea level.",
            "type" : "number",
            "example" : 80
          },
          "timezone" : {
            "description" : "IANA timezone id, e.g. Europe/Berlin.",
            "type" : "string",
            "example" : "Europe/Berlin"
          },
          "year" : {
            "format" : "int32",
            "description" : "Gregorian year.",
            "type" : "integer",
            "example" : 2026
          },
          "month" : {
            "format" : "int32",
            "description" : "Gregorian month, 1-12.",
            "type" : "integer",
            "example" : 3
          },
          "day" : {
            "format" : "int32",
            "description" : "Gregorian day of month. Optional, defaults to 1; ignored by the month endpoint.",
            "type" : "integer",
            "example" : 15,
            "nullable" : true
          },
          "method" : {
            "description" : "CalculationMethod enum name, e.g. Mwl2009, Diyanet, UmmAlQura, Fusul, Custom.",
            "type" : "string",
            "example" : "Mwl2009"
          },
          "overrides" : {
            "description" : "Optional overrides of the method's parameters (fajr/ishaa angles, asr method, rounding, security minutes, ...). Omit to use the method defaults.",
            "type" : "object",
            "allOf" : [ {
              "$ref" : "#/components/schemas/CalculationOverrides"
            } ],
            "nullable" : true
          },
          "boundSouthEast" : {
            "description" : "Optional south-east corner of the bounding box (latitude, longitude, elevation).",
            "type" : "object",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Coordinate"
            } ],
            "nullable" : true
          },
          "boundNorthWest" : {
            "description" : "Optional north-west corner of the bounding box (latitude, longitude, elevation).",
            "type" : "object",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Coordinate"
            } ],
            "nullable" : true
          },
          "boundingDistanceKm" : {
            "format" : "double",
            "description" : "Optional radius in km used to derive a bounding box around the location.",
            "type" : "number",
            "nullable" : true
          },
          "maxBoundingElevation" : {
            "format" : "double",
            "description" : "Optional maximum elevation (m) used for the derived bounding box.",
            "type" : "number",
            "nullable" : true
          }
        }
      },
      "PrayerValidity" : {
        "enum" : [ "Valid", "Invalid", "ValidIjtihad", "InvalidIjtihad", "RiskyIjtihad", "Risky", "InvalidInterpolation" ],
        "type" : "string"
      },
      "Refraction" : {
        "enum" : [ "Scientific", "Islamic", "Custom" ],
        "type" : "string"
      },
      "RiseSetTamkinOptions" : {
        "type" : "object",
        "properties" : {
          "useElevation" : {
            "type" : "boolean"
          },
          "useHorizonProfile" : {
            "type" : "boolean"
          },
          "useDipRefraction" : {
            "type" : "boolean"
          },
          "refraction" : {
            "$ref" : "#/components/schemas/Refraction"
          },
          "customRefraction" : {
            "format" : "double",
            "type" : "number"
          },
          "useParallax" : {
            "type" : "boolean"
          },
          "useSunRadius" : {
            "type" : "boolean"
          },
          "useGeometricDip" : {
            "type" : "boolean"
          }
        }
      },
      "RiseSetTamkinOverrides" : {
        "description" : "Overrides for sunrise/sunset (shuruk/maghrib) horizon corrections (tamkin).",
        "type" : "object",
        "properties" : {
          "useElevation" : {
            "description" : "Correct the horizon dip for the observer's elevation.",
            "type" : "boolean",
            "nullable" : true
          },
          "useHorizonProfile" : {
            "description" : "Use the terrain horizon profile (if available) instead of a flat horizon.",
            "type" : "boolean",
            "nullable" : true
          },
          "customDip" : {
            "format" : "double",
            "description" : "Custom horizon dip in degrees.",
            "type" : "number",
            "nullable" : true
          },
          "useDipRefraction" : {
            "description" : "Apply refraction to the horizon dip.",
            "type" : "boolean",
            "nullable" : true
          },
          "refraction" : {
            "description" : "Refraction model: Scientific, Islamic or Custom (see `customRefraction`).",
            "allOf" : [ {
              "$ref" : "#/components/schemas/Refraction"
            } ],
            "nullable" : true
          },
          "customRefraction" : {
            "format" : "double",
            "description" : "Refraction in degrees, used when `refraction` is Custom.",
            "type" : "number",
            "nullable" : true
          },
          "useParallax" : {
            "description" : "Apply solar parallax correction.",
            "type" : "boolean",
            "nullable" : true
          },
          "useSunRadius" : {
            "description" : "Use the upper limb of the sun (apply the sun radius) instead of its center.",
            "type" : "boolean",
            "nullable" : true
          },
          "useGeometricDip" : {
            "description" : "Use the geometric horizon dip formula.",
            "type" : "boolean",
            "nullable" : true
          }
        }
      },
      "Rounding" : {
        "enum" : [ "Up", "Down", "None" ],
        "type" : "string"
      },
      "ShurukMethod" : {
        "enum" : [ "Earliest", "Latest" ],
        "type" : "string"
      },
      "SolarPosition" : {
        "required" : [ "azimuth", "elevation", "hourAngle" ],
        "type" : "object",
        "properties" : {
          "azimuth" : {
            "format" : "double",
            "type" : "number"
          },
          "elevation" : {
            "format" : "double",
            "type" : "number"
          },
          "hourAngle" : {
            "format" : "double",
            "type" : "number"
          }
        }
      },
      "TimeDefinition" : {
        "enum" : [ "UTC", "WALL", "STANDARD" ],
        "type" : "string"
      },
      "TimeZone" : {
        "required" : [ "zoneId" ],
        "type" : "object",
        "properties" : {
          "zoneId" : {
            "$ref" : "#/components/schemas/ZoneId"
          },
          "zoneId$kotlinx_datetime" : {
            "$ref" : "#/components/schemas/ZoneId"
          },
          "id" : {
            "type" : "string"
          }
        }
      },
      "TimelineItem" : {
        "required" : [ "eventTime", "label" ],
        "type" : "object",
        "properties" : {
          "eventTime" : {
            "$ref" : "#/components/schemas/ZonedEventTime"
          },
          "label" : {
            "type" : "string"
          },
          "metadata" : {
            "type" : "object",
            "additionalProperties" : { }
          }
        }
      },
      "TwilightTamkinOptions" : {
        "type" : "object",
        "properties" : {
          "useGeometricDip" : {
            "type" : "boolean"
          },
          "useParallax" : {
            "type" : "boolean"
          },
          "useSolarRadius" : {
            "type" : "boolean"
          },
          "useDipRefraction" : {
            "type" : "boolean"
          }
        }
      },
      "TwilightTamkinOverrides" : {
        "description" : "Overrides for twilight (fajr/ishaa) horizon corrections (tamkin).",
        "type" : "object",
        "properties" : {
          "useGeometricDip" : {
            "description" : "Use the geometric horizon dip formula.",
            "type" : "boolean",
            "nullable" : true
          },
          "useParallax" : {
            "description" : "Apply solar parallax correction.",
            "type" : "boolean",
            "nullable" : true
          },
          "useSolarRadius" : {
            "description" : "Apply the sun radius correction.",
            "type" : "boolean",
            "nullable" : true
          },
          "useDipRefraction" : {
            "description" : "Apply refraction to the horizon dip.",
            "type" : "boolean",
            "nullable" : true
          }
        }
      },
      "ZoneId" : {
        "type" : "object",
        "properties" : {
          "id" : {
            "type" : "string"
          },
          "rules" : {
            "$ref" : "#/components/schemas/ZoneRules"
          }
        }
      },
      "ZoneOffset" : {
        "type" : "object",
        "properties" : {
          "totalSeconds" : {
            "format" : "int32",
            "type" : "integer"
          }
        }
      },
      "ZoneOffsetTransition" : {
        "type" : "object",
        "properties" : {
          "epochSecond" : {
            "format" : "int64",
            "type" : "integer"
          },
          "transition" : {
            "$ref" : "#/components/schemas/LocalDateTime1"
          },
          "offsetBefore" : {
            "$ref" : "#/components/schemas/ZoneOffset"
          },
          "offsetAfter" : {
            "$ref" : "#/components/schemas/ZoneOffset"
          },
          "instant" : {
            "$ref" : "#/components/schemas/Instant1"
          },
          "dateTimeBefore" : {
            "$ref" : "#/components/schemas/LocalDateTime1"
          },
          "dateTimeAfter" : {
            "$ref" : "#/components/schemas/LocalDateTime1"
          },
          "duration" : {
            "$ref" : "#/components/schemas/Duration"
          },
          "durationSeconds" : {
            "format" : "int32",
            "type" : "integer"
          },
          "gap" : {
            "type" : "boolean"
          },
          "overlap" : {
            "type" : "boolean"
          },
          "validOffsets" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ZoneOffset"
            }
          }
        }
      },
      "ZoneOffsetTransitionRule" : {
        "type" : "object",
        "properties" : {
          "month" : {
            "$ref" : "#/components/schemas/Month1"
          },
          "dom" : {
            "format" : "int8",
            "type" : "integer"
          },
          "dow" : {
            "$ref" : "#/components/schemas/DayOfWeek1"
          },
          "time" : {
            "$ref" : "#/components/schemas/LocalTime1"
          },
          "timeEndOfDay" : {
            "type" : "boolean"
          },
          "timeDefinition" : {
            "$ref" : "#/components/schemas/TimeDefinition"
          },
          "standardOffset" : {
            "$ref" : "#/components/schemas/ZoneOffset"
          },
          "offsetBefore" : {
            "$ref" : "#/components/schemas/ZoneOffset"
          },
          "offsetAfter" : {
            "$ref" : "#/components/schemas/ZoneOffset"
          },
          "dayOfMonthIndicator" : {
            "format" : "int32",
            "type" : "integer"
          },
          "dayOfWeek" : {
            "$ref" : "#/components/schemas/DayOfWeek1"
          },
          "localTime" : {
            "$ref" : "#/components/schemas/LocalTime1"
          },
          "midnightEndOfDay" : {
            "type" : "boolean"
          }
        }
      },
      "ZoneRules" : {
        "type" : "object",
        "properties" : {
          "standardTransitions" : {
            "type" : "array",
            "items" : {
              "format" : "int64",
              "type" : "integer"
            }
          },
          "standardOffsets" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ZoneOffset"
            }
          },
          "savingsInstantTransitions" : {
            "type" : "array",
            "items" : {
              "format" : "int64",
              "type" : "integer"
            }
          },
          "savingsLocalTransitions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/LocalDateTime1"
            }
          },
          "wallOffsets" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ZoneOffset"
            }
          },
          "lastRules" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ZoneOffsetTransitionRule"
            }
          },
          "fixedOffset" : {
            "type" : "boolean"
          },
          "transitions" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ZoneOffsetTransition"
            }
          },
          "transitionRules" : {
            "type" : "array",
            "items" : {
              "$ref" : "#/components/schemas/ZoneOffsetTransitionRule"
            }
          }
        }
      },
      "ZonedEventTime" : {
        "required" : [ "local", "instant", "rawInstant", "offset" ],
        "type" : "object",
        "properties" : {
          "local" : {
            "$ref" : "#/components/schemas/LocalDateTime"
          },
          "instant" : {
            "$ref" : "#/components/schemas/Instant"
          },
          "rawInstant" : {
            "$ref" : "#/components/schemas/Instant"
          },
          "offset" : {
            "type" : "string"
          },
          "security" : {
            "format" : "double",
            "type" : "number"
          },
          "adjustment" : {
            "format" : "int32",
            "type" : "integer"
          },
          "alternative" : {
            "type" : "boolean"
          },
          "transition" : {
            "type" : "boolean"
          },
          "validity" : {
            "$ref" : "#/components/schemas/PrayerValidity"
          },
          "enableSecurity" : {
            "type" : "boolean"
          },
          "rawSolarPosition" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/SolarPosition"
            } ],
            "nullable" : true
          },
          "solarPosition" : {
            "allOf" : [ {
              "$ref" : "#/components/schemas/SolarPosition"
            } ],
            "nullable" : true
          }
        }
      }
    }
  },
  "tags" : [ {
    "name" : "Prayer times",
    "description" : "Islamic prayer times (fajr, shuruk, dhuhr, asr, maghrib, ishaa and related events such as duha, istiwa, islamic midnight, last third of the night) calculated for any location on earth using the ipl-kotlin library."
  } ],
  "paths" : {
    "/prayer/methodOverrides" : {
      "post" : {
        "summary" : "Effective calculation parameters of a method",
        "description" : "Returns the resolved calculation parameters (angles, fajr/ishaa/shuruk methods, asr method, tamkin options, security minutes, rounding, ...) that result from the chosen method plus the optional `overrides`. Workflow for agents: call this with a base method to see all parameters, copy the field names into `overrides`, change values, and call the *Custom endpoints with the same body to see the effect on times. To build a method from scratch use method `Custom` and set all needed overrides.",
        "operationId" : "getMethodOverrides",
        "tags" : [ "Prayer times" ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/PrayerTimesRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/CalculationParameters"
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request"
          }
        }
      }
    },
    "/prayer/timeline" : {
      "get" : {
        "summary" : "Chronological timeline of prayer events for a day",
        "description" : "Returns the day's prayer events as an ordered list of timeline items (event time, label and metadata). Use this when you need the sequence of events, e.g. to find the next prayer.",
        "operationId" : "getTimeline",
        "tags" : [ "Prayer times" ],
        "parameters" : [ {
          "description" : "Optional. Elevation (m) at the north-west corner of the bounding box.",
          "name" : "boundNorthWestElevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Latitude of the north-west corner of the bounding box.",
          "name" : "boundNorthWestLat",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Longitude of the north-west corner of the bounding box.",
          "name" : "boundNorthWestLon",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Elevation (m) at the south-east corner of the bounding box.",
          "name" : "boundSouthEastElevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Latitude of the south-east corner of the bounding box.",
          "name" : "boundSouthEastLat",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Longitude of the south-east corner of the bounding box.",
          "name" : "boundSouthEastLon",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Radius in km around the location used to derive a bounding box for high-latitude / elevation-aware calculations. Ignored if explicit bounds are given.",
          "name" : "boundingDistanceKm",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Gregorian day of month, 1-31.",
          "required" : true,
          "name" : "day",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        }, {
          "description" : "Elevation of the location in meters above sea level (negative values are treated as 0 where relevant).",
          "required" : true,
          "name" : "elevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Latitude in decimal degrees (-90 to 90, north positive).",
          "required" : true,
          "name" : "latitude",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Longitude in decimal degrees (-180 to 180, east positive).",
          "required" : true,
          "name" : "longitude",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Calculation method: name of a `CalculationMethod` enum value. One of: AqrabAlBiladAlNisb, Polar, Bosnia, Mwl2007, Mwl2009, Ijtihad2022, Ijtihad2025, Diyanet, Unity2023, Ditib2023, DumRT, DumRF, DumCR, UmmAlQura, EgyptGeneralObservatory, Astronomical, NientyMinutes, Fifteen, Twelve, Dag2023, Hanafi, Jakim, KementerianAgama, Traditional, Fusul, Custom.",
          "required" : true,
          "name" : "method",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Gregorian month, 1-12.",
          "required" : true,
          "name" : "month",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        }, {
          "description" : "IANA timezone id of the location, e.g. `Europe/Berlin` or `Asia/Riyadh`. All returned times are in this timezone.",
          "required" : true,
          "name" : "timezone",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Gregorian year, e.g. 2026.",
          "required" : true,
          "name" : "year",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/TimelineItem"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/prayer/timelineCustom" : {
      "post" : {
        "summary" : "Daily timeline with custom calculation overrides",
        "description" : "Same as `GET /prayer/timeline`, but takes a JSON body with optional `overrides`. `day` defaults to 1.",
        "operationId" : "getTimelineCustom",
        "tags" : [ "Prayer times" ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/PrayerTimesRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/TimelineItem"
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request"
          }
        }
      }
    },
    "/prayer/times" : {
      "get" : {
        "summary" : "Prayer times for a single day",
        "description" : "Returns all prayer times and related events (fajr, shuruk, dhuhr, asr, maghrib, ishaa, ...) for one Gregorian day at the given location, plus the Hijri date, night length and method details. Each event is an object with local time, instant (UTC), offset and validity. Use this for questions like \"when is fajr in Berlin today?\".",
        "operationId" : "getPrayerTimes",
        "tags" : [ "Prayer times" ],
        "parameters" : [ {
          "description" : "Optional. Elevation (m) at the north-west corner of the bounding box.",
          "name" : "boundNorthWestElevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Latitude of the north-west corner of the bounding box.",
          "name" : "boundNorthWestLat",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Longitude of the north-west corner of the bounding box.",
          "name" : "boundNorthWestLon",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Elevation (m) at the south-east corner of the bounding box.",
          "name" : "boundSouthEastElevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Latitude of the south-east corner of the bounding box.",
          "name" : "boundSouthEastLat",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Longitude of the south-east corner of the bounding box.",
          "name" : "boundSouthEastLon",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Radius in km around the location used to derive a bounding box for high-latitude / elevation-aware calculations. Ignored if explicit bounds are given.",
          "name" : "boundingDistanceKm",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Gregorian day of month, 1-31.",
          "required" : true,
          "name" : "day",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        }, {
          "description" : "Elevation of the location in meters above sea level (negative values are treated as 0 where relevant).",
          "required" : true,
          "name" : "elevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Latitude in decimal degrees (-90 to 90, north positive).",
          "required" : true,
          "name" : "latitude",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Longitude in decimal degrees (-180 to 180, east positive).",
          "required" : true,
          "name" : "longitude",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Calculation method: name of a `CalculationMethod` enum value. One of: AqrabAlBiladAlNisb, Polar, Bosnia, Mwl2007, Mwl2009, Ijtihad2022, Ijtihad2025, Diyanet, Unity2023, Ditib2023, DumRT, DumRF, DumCR, UmmAlQura, EgyptGeneralObservatory, Astronomical, NientyMinutes, Fifteen, Twelve, Dag2023, Hanafi, Jakim, KementerianAgama, Traditional, Fusul, Custom.",
          "required" : true,
          "name" : "method",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Gregorian month, 1-12.",
          "required" : true,
          "name" : "month",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        }, {
          "description" : "IANA timezone id of the location, e.g. `Europe/Berlin` or `Asia/Riyadh`. All returned times are in this timezone.",
          "required" : true,
          "name" : "timezone",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Gregorian year, e.g. 2026.",
          "required" : true,
          "name" : "year",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : { }
            }
          }
        }
      }
    },
    "/prayer/timesCustom" : {
      "post" : {
        "summary" : "Prayer times for a single day with custom calculation overrides",
        "description" : "Same as `GET /prayer/times`, but takes a JSON body that can additionally contain `overrides` (fajr/ishaa angles, fajr/ishaa/shuruk methods, asr method, tamkin options, security minutes, rounding, ...). Call it repeatedly with different overrides (or once with the plain method) and compare the results to find time differences caused by parameters. `day` defaults to 1.",
        "operationId" : "getPrayerTimesCustom",
        "tags" : [ "Prayer times" ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/PrayerTimesRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : { }
            }
          },
          "400" : {
            "description" : "Bad Request"
          }
        }
      }
    },
    "/prayer/times_month" : {
      "get" : {
        "summary" : "Prayer times for a whole month",
        "description" : "Returns a list with one prayer-times object per day of the given Gregorian month. Use this for monthly timetables.",
        "operationId" : "getPrayerTimesMonth",
        "tags" : [ "Prayer times" ],
        "parameters" : [ {
          "description" : "Optional. Elevation (m) at the north-west corner of the bounding box.",
          "name" : "boundNorthWestElevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Latitude of the north-west corner of the bounding box.",
          "name" : "boundNorthWestLat",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Longitude of the north-west corner of the bounding box.",
          "name" : "boundNorthWestLon",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Elevation (m) at the south-east corner of the bounding box.",
          "name" : "boundSouthEastElevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Latitude of the south-east corner of the bounding box.",
          "name" : "boundSouthEastLat",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Longitude of the south-east corner of the bounding box.",
          "name" : "boundSouthEastLon",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Radius in km around the location used to derive a bounding box for high-latitude / elevation-aware calculations. Ignored if explicit bounds are given.",
          "name" : "boundingDistanceKm",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Elevation of the location in meters above sea level (negative values are treated as 0 where relevant).",
          "required" : true,
          "name" : "elevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Latitude in decimal degrees (-90 to 90, north positive).",
          "required" : true,
          "name" : "latitude",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Longitude in decimal degrees (-180 to 180, east positive).",
          "required" : true,
          "name" : "longitude",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Calculation method: name of a `CalculationMethod` enum value. One of: AqrabAlBiladAlNisb, Polar, Bosnia, Mwl2007, Mwl2009, Ijtihad2022, Ijtihad2025, Diyanet, Unity2023, Ditib2023, DumRT, DumRF, DumCR, UmmAlQura, EgyptGeneralObservatory, Astronomical, NientyMinutes, Fifteen, Twelve, Dag2023, Hanafi, Jakim, KementerianAgama, Traditional, Fusul, Custom.",
          "required" : true,
          "name" : "method",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Gregorian month, 1-12.",
          "required" : true,
          "name" : "month",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        }, {
          "description" : "IANA timezone id of the location, e.g. `Europe/Berlin` or `Asia/Riyadh`. All returned times are in this timezone.",
          "required" : true,
          "name" : "timezone",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Gregorian year, e.g. 2026.",
          "required" : true,
          "name" : "year",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/PrayerTimes"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/prayer/times_monthCustom" : {
      "post" : {
        "summary" : "Monthly prayer times with custom calculation overrides",
        "description" : "Same as `GET /prayer/times_month`, but takes a JSON body with optional `overrides`. `day` is ignored.",
        "operationId" : "getPrayerTimesMonthCustom",
        "tags" : [ "Prayer times" ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/PrayerTimesRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/PrayerTimes"
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request"
          }
        }
      }
    },
    "/prayer/times_ramadan" : {
      "get" : {
        "summary" : "Prayer times for the Ramadan period",
        "description" : "Returns a list of prayer-times objects covering the Ramadan period, starting from the given date. Useful for suhur / iftar (fajr / maghrib) timetables.",
        "operationId" : "getPrayerTimesRamadan",
        "tags" : [ "Prayer times" ],
        "parameters" : [ {
          "description" : "Optional. Elevation (m) at the north-west corner of the bounding box.",
          "name" : "boundNorthWestElevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Latitude of the north-west corner of the bounding box.",
          "name" : "boundNorthWestLat",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Longitude of the north-west corner of the bounding box.",
          "name" : "boundNorthWestLon",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Elevation (m) at the south-east corner of the bounding box.",
          "name" : "boundSouthEastElevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Latitude of the south-east corner of the bounding box.",
          "name" : "boundSouthEastLat",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Longitude of the south-east corner of the bounding box.",
          "name" : "boundSouthEastLon",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Optional. Radius in km around the location used to derive a bounding box for high-latitude / elevation-aware calculations. Ignored if explicit bounds are given.",
          "name" : "boundingDistanceKm",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number",
            "nullable" : true
          },
          "required" : true
        }, {
          "description" : "Gregorian day of month, 1-31. Used together with year and month as the starting day for the Ramadan period.",
          "required" : true,
          "name" : "day",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        }, {
          "description" : "Elevation of the location in meters above sea level (negative values are treated as 0 where relevant).",
          "required" : true,
          "name" : "elevation",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Latitude in decimal degrees (-90 to 90, north positive).",
          "required" : true,
          "name" : "latitude",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Longitude in decimal degrees (-180 to 180, east positive).",
          "required" : true,
          "name" : "longitude",
          "in" : "query",
          "schema" : {
            "format" : "double",
            "type" : "number"
          }
        }, {
          "description" : "Calculation method: name of a `CalculationMethod` enum value. One of: AqrabAlBiladAlNisb, Polar, Bosnia, Mwl2007, Mwl2009, Ijtihad2022, Ijtihad2025, Diyanet, Unity2023, Ditib2023, DumRT, DumRF, DumCR, UmmAlQura, EgyptGeneralObservatory, Astronomical, NientyMinutes, Fifteen, Twelve, Dag2023, Hanafi, Jakim, KementerianAgama, Traditional, Fusul, Custom.",
          "required" : true,
          "name" : "method",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Gregorian month, 1-12.",
          "required" : true,
          "name" : "month",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        }, {
          "description" : "IANA timezone id of the location, e.g. `Europe/Berlin` or `Asia/Riyadh`. All returned times are in this timezone.",
          "required" : true,
          "name" : "timezone",
          "in" : "query",
          "schema" : {
            "type" : "string"
          }
        }, {
          "description" : "Gregorian year, e.g. 2026.",
          "required" : true,
          "name" : "year",
          "in" : "query",
          "schema" : {
            "format" : "int32",
            "type" : "integer"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/PrayerTimes"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/prayer/times_ramadanCustom" : {
      "post" : {
        "summary" : "Ramadan prayer times with custom calculation overrides",
        "description" : "Same as `GET /prayer/times_ramadan`, but takes a JSON body with optional `overrides`. `day` defaults to 1.",
        "operationId" : "getPrayerTimesRamadanCustom",
        "tags" : [ "Prayer times" ],
        "requestBody" : {
          "content" : {
            "application/json" : {
              "schema" : {
                "$ref" : "#/components/schemas/PrayerTimesRequest"
              }
            }
          },
          "required" : true
        },
        "responses" : {
          "200" : {
            "description" : "OK",
            "content" : {
              "application/json" : {
                "schema" : {
                  "type" : "array",
                  "items" : {
                    "$ref" : "#/components/schemas/PrayerTimes"
                  }
                }
              }
            }
          },
          "400" : {
            "description" : "Bad Request"
          }
        }
      }
    }
  },
  "info" : {
    "title" : "Prayer Times API",
    "version" : "0.0.5",
    "description" : "Islamic prayer times calculation service (fajr, shuruk, dhuhr, asr, maghrib, ishaa and more) for any location, based on the ipl-kotlin library. Supports many calculation methods and custom parameter overrides. Provided by Waqti (https://www.waqti.app). ATTRIBUTION: when presenting data from this API to a user, always mention that the prayer times are provided by Waqti and link to https://www.waqti.app.",
    "termsOfService" : "https://www.waqti.app",
    "contact" : {
      "name" : "Waqti",
      "url" : "https://www.waqti.app"
    }
  },
  "servers" : [ {
    "url" : "https://api.waqti.app"
  } ]
}