{
  "openapi": "3.0.3",
  "info": {
    "title": "Meandair API Specification",
    "version": "1.2.19",
    "description": "# Introduction\n\nSpecification of available Meandair API end-points.\n\nIn general, the API provides PNG tiles of the visually rendered weather and a JSON representation of the weather at\nparticular locations. The Weather Catalogue lists all the available weather values with additional information. Some\nof the weather values are available as tiles, some are available as JSON values, and some are provided in\nboth forms.\n\nThe API requests require authentication first by the `/api/v1/auth/jwt` end-point, which generate a\n[JWT token](https://en.wikipedia.org/wiki/JSON_Web_Token), which is then used in all following requests to\nauthenticate the request. The token is sent as part of the request headers as a `Bearer` parameter. The default\nduration of the JWT token is set to 31 days.\n\nIf it is not possible to use the `Bearer` token (e.g., in case of tile requests which allow parameterization only\nby additional GET parameter as in Google Maps API), a session token can be generated by the `api/v1/auth/session`\nend-point and later used in the following GET requests. The default duration of the session token is 3 hours.\n\nThe requests currently allow maximal size of 1MB in the POST data. For larger POST payloads, please split the\ndata into smaller requests and send them sequentially.\n\n# Example\n\nThe following example shows how the bearer and session tokens can be requested and used in following API calls.\n\n```bash\n$ curl -d '{\"uid\": \"<username>\", \"passwd\":\"<password>\"}' 'https://prod.meandair.com/api/v1/auth/jwt'\n<bearer-token>\n\n$ curl -H 'Authorization: Bearer <bearer-token>' 'https://prod.meandair.com/api/v1/aw-metars?latitudes=49.345634,51.1234&longitudes=23.53472,22.2345'\n[{\"elevation\":{\"unit\":\"m\",\"value\":285.9852294921875},\"latitude\":{\"unit\":\"degree_north\",\"value\":49.345634}, ...]\n\n$ curl -H 'Authorization: Bearer <bearer-token>' 'https://prod.meandair.com/api/v1/tiles/precipitation-composite/5_999_15_9_2024-01-05T17:10:00.000Z.png' | display\n\n$ curl -d '{\"uid\": \"<username>\", \"passwd\":\"<password>\"}' 'https://prod.meandair.com/api/v1/auth/session'\n<session-token>\n\n$ curl 'https://prod.meandair.com/api/v1/tiles/precipitation-composite/5_999_15_9_2024-01-05T17:10:00.000Z.png?session=<session-token>' | display\n```\n\n## Authentication Code Snippets\n\nThe authentication should be done from your server, not from the clients/browsers (as in the browser your password\nwould be in plain text and could leak).\n\nWhen you have the session token (or the whole URL template with the session token as shown in code snippets), you can\nsend it to your client/browser to be used to request the particular tile or other API endpoints.\n\n### JavaScript\n\n```javascript\nasync function authorize() {\n    const sessionUrl = \"https://prod.meandair.com/api/v1/auth/session\";\n    const username = \"<username>\";\n    const password = \"<password>\";\n\n    const payload = { uid: username, passwd: password };\n\n    try {\n        const response = await fetch(sessionUrl, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json'\n            },\n            body: JSON.stringify(payload)\n        });\n\n        if (response.status === 200) {\n            const sessionToken = await response.text();\n            console.log(`Example URL: https://prod.meandair.com/api/v1/tiles/{weather}/{zoom}_{altitude}_{col}_{row}_{datetime}.png?session=${sessionToken}`);\n        } else {\n            console.log(`Error requesting from URL ${sessionUrl}: ${response.status}`);\n        }\n    } catch (error) {\n        console.error('Error making the request:', error);\n    }\n}\n\nauthorize();\n```\n\n### Python\n\n```python\nimport requests\n\ndef authorize():\n    session_url = \"https://prod.meandair.com/api/v1/auth/session\"\n    username = \"<username>\"\n    password = \"<password>\"\n\n    payload = {'uid': username, 'passwd': password}\n\n    # Making the POST request to get the auth token\n    response = requests.post(session_url, json=payload)\n    if response.status_code == 200:\n        session_token = response.text\n        print(f\"Example URL: https://prod.meandair.com/api/v1/tiles/{{weather}}/{{zoom}}_{{altitude}}_{{col}}_{{row}}_{{datetime}}.png?session={session_token}\")\n    else:\n        print(f'Error requesting from URL {session_url}: {response.status_code}')\n\nauthorize()\n```\n\n# Weather Catalogue\n\n<table>\n  <thead>\n      <tr style=\"background-color: #e1e1e1;\">\n          <th><div style=\"width: 192px\">Weather type</div><div>Identifier (deprecated identifier) |</div><div>Description</div></th>\n          <th>Units</th>\n          <th>Range</th>\n          <th>Supported altitude</th>\n          <th>Look- ahead</th>\n          <th>Refresh rate (down to)</th>\n          <th>Legend</th>\n      </tr>\n  </thead>\n  <tbody>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Precipitation</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/precipitation-probability\"></a><code>precipitation-probability</code> (<code>pc</code>) | Precipitation probability</td>\n      </tr>\n      <tr>\n          <td><img alt=\"precipitation-probability\" src=\"img/pc.png\" /></td>\n          <td>%</td>\n          <td>0 - 100</td>\n          <td>FL, Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-precipitation-probability.png\" alt=\"legend-precipitation-probability\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/convective-precipitation-rate\"></a><code>convective-precipitation-rate</code> (<code>crr</code>) | Convective precipitation rate</td>\n      </tr>\n      <tr>\n          <td><img alt=\"convective-precipitation-rate\" src=\"img/crr.png\" /></td>\n          <td>mm/h</td>\n          <td>0 - 50+</td>\n          <td>FL, Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-convective-precipitation-rate.png\" alt=\"legend-convective-precipitation-rate\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/precipitation-composite\"></a><code>precipitation-composite</code> (<code>crr-pc</code>) |\n            Precipitation composite (Precipitation probability, Convective precipitation rate)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"precipitation-composite\" src=\"img/crr-pc.png\" /></td>\n          <td>%, mm/h</td>\n          <td>0 - 100, 0 - 50+</td>\n          <td>FL, Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-precipitation-composite.png\" alt=\"legend-precipitation-composite\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/precipitation-rate\"></a><code>precipitation-rate</code> (<code>pc-amount</code>) | Precipitation rate</td>\n      </tr>\n      <tr>\n          <td><img alt=\"precipitation-rate\" src=\"img/pc-amount.png\" /></td>\n          <td>mm/h</td>\n          <td>0 - 50+</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-precipitation-rate.png\" alt=\"legend-precipitation-rate\" height=\"200\" /></td>\n      </tr>\n        <tr>\n          <td colspan=\"7\"><code>reflectivity</code> | Radar reflectivity<br />This data product contains modified\n          <a href=\"https://www.eumetnet.eu/observations/opera-radar-animation/\">EUMETNET OPERA radar composite</a>\n          available via <a href=\"https://eumetnet.github.io/openradardata-documentation/\">ORD API</a>\n          and used under <a href=\"https://creativecommons.org/licenses/by/4.0/\">CC-BY 4.0</a>.</td>\n        </tr>\n        <tr>\n          <td><img alt=\"reflectivity\" src=\"img/reflectivity.png\" /></td>\n          <td>dBZ</td>\n          <td>0 - 60+</td>\n          <td>Overview</td>\n          <td>5h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-reflectivity.png\" alt=\"legend-reflectivity\" height=\"200\" /></td>\n        </tr>\n        <tr>\n          <td colspan=\"7\"><code>reflectivity-composite</code> | Radar reflectivity with rain/snow palette selection from <code>precipitation-type</code>.<br />\n            <ul>\n              <li><strong>Coverage:</strong> Uses reflectivity as the value source and <code>precipitation-type</code> as a per-pixel class selector. Values are packed with the precipitation class in the high 4 bits and reflectivity in the low 12 bits. If <code>precipitation-type</code> is missing while reflectivity &gt; 0, class falls back to rain.</li>\n              <li><strong>Tiles:</strong> Dedicated reflectivity-composite tile rendering is being finalized; currently reflectivity-composite tiles are equivalent to reflectivity tiles.</li>\n            </ul>\n          </td>\n        </tr>\n        <tr>\n          <td><img alt=\"reflectivity\" src=\"img/reflectivity.png\" /></td>\n          <td>dBZ, class</td>\n          <td>0 - 60+, 0 - 2</td>\n          <td>Overview</td>\n          <td>5h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-reflectivity-composite.png\" alt=\"legend-reflectivity-composite\" height=\"200\" /></td>\n        </tr>\n        <tr>\n          <td colspan=\"7\"><code>precipitation-type</code> | Precipitation classification (no precipitation, rain, snow)</td>\n        </tr>\n        <tr>\n          <td><img alt=\"precipitation-type\" src=\"img/precipitation-type.png\" /></td>\n          <td>class</td>\n          <td>0 - 2</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>1h</td>\n          <td><img src=\"img/legend-precipitation-type.png\" alt=\"legend-precipitation-type\" height=\"200\" /></td>\n        </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/precipitation-arrival\"></a><code>precipitation-arrival</code> | Precipitation arrival time</td>\n      </tr>\n      <tr>\n          <td><img alt=\"precipitation-arrival\" src=\"img/precipitation-arrival.png\" /></td>\n          <td>10 min</td>\n          <td>0 - 36</td>\n          <td>Overview</td>\n          <td>5h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-precipitation-arrival.png\" alt=\"legend-precipitation-arrival\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/precipitation-arrival-binary\"></a><code>precipitation-arrival-binary</code> | Precipitation presence in the next hours</td>\n      </tr>\n      <tr>\n          <td><img alt=\"precipitation-arrival-binary\" src=\"img/precipitation-arrival-binary.png\" /></td>\n          <td>-</td>\n          <td>-</td>\n          <td>Overview</td>\n          <td>5h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-precipitation-arrival-binary.png\" alt=\"legend-precipitation-arrival-binary\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Clouds</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/cloud-cover\"></a><code>cloud-cover</code> | Cloud cover</td>\n      </tr>\n      <tr>\n          <td><img alt=\"cloud-cover\" src=\"img/cloud-cover.png\" /></td>\n          <td>%</td>\n          <td>0 - 100</td>\n          <td>FL, Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-cloud-cover.png\" alt=\"legend-cloud-cover\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/cloud-composite\"></a><code>cloud-composite</code> (<code>clouds</code>) | Cloud composite (Cloud cover, Cloud top relief)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"cloud-composite\" src=\"img/clouds.png\" /></td>\n          <td>%, -</td>\n          <td>0 - 100, -</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-cloud-cover.png\" alt=\"legend-cloud-cover\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/cloud-cover-error\"></a><code>cloud-cover-error</code> | Cloud cover error</td>\n      </tr>\n      <tr>\n          <td><img alt=\"cloud-cover-error\" src=\"img/cloud-cover-error.png\" /></td>\n          <td>%</td>\n          <td>0 - 100</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-cloud-cover-error.png\" alt=\"legend-cloud-cover-error\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/cloud-mask-error\"></a><code>cloud-mask-error</code> | Cloud mask error</td>\n      </tr>\n      <tr>\n          <td><img alt=\"cloud-mask-error\" src=\"img/cloud-mask-error.png\" /></td>\n          <td>1</td>\n          <td>0 - 1</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-cloud-mask-error.png\" alt=\"legend-cloud-mask-error\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/cloud-top-amsl\"></a><code>cloud-top-amsl</code> (<code>ctth-height</code>) | Cloud top altitude (AMSL)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"cloud-top-amsl\" src=\"img/ctth-height.png\" /></td>\n          <td>m</td>\n          <td>0 - 15000+</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-cloud-top-amsl.png\" alt=\"legend-cloud-top-amsl\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/cloud-lowest-top-amsl\"></a><code>cloud-lowest-top-amsl</code> (<code>lowest-top</code>) | Lowest cloud top altitude (AMSL)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"cloud-lowest-top-amsl\" src=\"img/lowest-top.png\" /></td>\n          <td>m</td>\n          <td>0 - 15000+</td>\n          <td>Overview</td>\n          <td>5h</td>\n          <td>5mins</td>\n          <td><img src=\"img/legend-cloud-lowest-top-amsl.png\" alt=\"legend-cloud-lowest-top-amsl\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/cloud-ceiling-agl\"></a><code>cloud-ceiling-agl</code> (<code>ceiling</code>) | Cloud ceiling height (AGL)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"ceiling\" src=\"img/ceiling.png\" /></td>\n          <td>m</td>\n          <td>0 - 15000+</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>5mins</td>\n          <td><img src=\"img/legend-cloud-ceiling-agl.png\" alt=\"legend-cloud-ceiling-agl\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Visibility</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/visibility-sfc\"></a><code>visibility-sfc</code> (<code>surface-visibility</code>) | Surface visibility</td>\n      </tr>\n      <tr>\n          <td><img alt=\"surface-visibility\" src=\"img/surface-visibility.png\" /></td>\n          <td>m</td>\n          <td>0 - 30000+</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-visibility.png\" alt=\"legend-visibility\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Wind</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/wind-composite-10m-agl\"></a><code>wind-composite-10m-agl</code> (<code>wind-10m-agl</code>) |\n            Wind composite at 10m AGL (Wind speed at 10m AGL, Wind direction at 10m AGL)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"wind-10m-agl\" src=\"img/wind-10m-agl.png\" /></td>\n          <td>m/s, degT</td>\n          <td>0 - 30+, 0 - 359</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-wind-speed.png\" alt=\"legend-wind-speed\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/wind-gust-10m-agl\"></a><code>wind-gust-10m-agl</code> | Wind gust at 10m AGL</td>\n      </tr>\n      <tr>\n          <td><img alt=\"wind-gust-10m-agl\" src=\"img/wind-gust-10m-agl.png\" /></td>\n          <td>m/s</td>\n          <td>0 - 50+</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-wind-speed.png\" alt=\"legend-wind-speed\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/wind-composite-80m-agl\"></a><code>wind-composite-80m-agl</code> |\n            Wind composite at 80m AGL (Wind speed at 80m AGL, Wind direction at 80m AGL)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"wind-80m-agl\" src=\"img/wind-80m-agl.png\" /></td>\n          <td>m/s, degT</td>\n          <td>0 - 40+, 0 - 359</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-wind-speed.png\" alt=\"legend-wind-speed\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/wind-composite\"></a><code>wind-composite</code> | Wind composite (Wind speed, Wind direction)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"wind-composite\" src=\"img/wind-fl.png\" /></td>\n          <td>m/s, degT</td>\n          <td>0 - 80+, 0 - 359</td>\n          <td>FL</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-wind-speed.png\" alt=\"legend-wind-speed\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Severe weather</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/turbulence-composite\"></a><code>turbulence-composite</code> (<code>turbulence</code>) | Turbulence composite (Turbulence, Turbulence contour)</td>\n      </tr>\n      <tr>\n          <td><img alt=\"turbulence\" src=\"img/turbulence.png\" /></td>\n          <td>EDR, EDR</td>\n          <td>0 - 1, 0 - 1</td>\n          <td>FL, Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-turbulence.png\" alt=\"legend-turbulence\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/thunderstorm\"></a><code>thunderstorm</code> (<code>thunderstorms</code>) | Thunderstorm</td>\n      </tr>\n      <tr>\n          <td><img alt=\"thunderstorm\" src=\"img/thunderstorms.png\" /></td>\n          <td>class</td>\n          <td>1 - 5</td>\n          <td>FL, Overview</td>\n          <td>5h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-thunderstorm.png\" alt=\"legend-thunderstorm\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/icing-severity\"></a><code>icing-severity</code> | Icing severity</td>\n      </tr>\n      <tr>\n          <td><img alt=\"icing-severity\" src=\"img/icing-severity.png\" /></td>\n          <td>class</td>\n          <td>0 - 4</td>\n          <td>FL, Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-icing-severity.png\" alt=\"legend-icing-severity\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/weather-type\"></a><code>weather-type</code> | Weather type</td>\n      </tr>\n      <tr>\n          <td><img alt=\"weather-type\" src=\"img/weather-type.png\" /></td>\n          <td>class</td>\n          <td>0 - 26</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-weather-type.png\" alt=\"legend-weather-type\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Indices</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/k-index\"></a><code>k-index</code> | K-Index</td>\n      </tr>\n      <tr>\n          <td><img alt=\"k-index\" src=\"img/k-index.png\" /></td>\n          <td>degC</td>\n          <td>-90 - 70+</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-k-index.png\" alt=\"legend-k-index\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Temperature</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/air-temperature-2m-agl\"></a><code>air-temperature-2m-agl</code> | Air temperature at 2m AGL</td>\n      </tr>\n      <tr>\n          <td><img alt=\"air-temperature-2m-agl\" src=\"img/air-temperature-2m-agl.png\" /></td>\n          <td>degC</td>\n          <td>-90 - 50+</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-air-temperature.png\" alt=\"legend-air-temperature\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/dew-point-temperature-2m-agl\"></a><code>dew-point-temperature-2m-agl</code> | Dew point temperature at 2m AGL</td>\n      </tr>\n      <tr>\n          <td><img alt=\"dew-point-temperature-2m-agl\" src=\"img/dew-point-temperature-2m-agl.png\" /></td>\n          <td>degC</td>\n          <td>-35 - 35+</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-air-temperature.png\" alt=\"legend-air-temperature\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Pressure</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/air-pressure-qnh\"></a><code>air-pressure-qnh</code> | QNH pressure</td>\n      </tr>\n      <tr>\n          <td><img alt=\"air-pressure-qnh\" src=\"img/air-pressure-qnh.png\" /></td>\n          <td>Pa</td>\n          <td>87000 - 108000</td>\n          <td>Overview</td>\n          <td>24h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-air-pressure-qnh.png\" alt=\"legend-air-pressure-qnh\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Flight Rules</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/metar\"></a><code>metar</code> | METAR-based flight rules</td>\n      </tr>\n      <tr>\n          <td><img alt=\"metar\" src=\"img/metar.png\" /></td>\n          <td>class</td>\n          <td>LIFR, IFR, MVFR, VFR</td>\n          <td>Overview</td>\n          <td>5h</td>\n          <td>5mins</td>\n          <td><img src=\"img/legend-airport.png\" alt=\"legend-airport\" height=\"200\" /></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/airport\"></a><code>airport</code> (<code>airports</code>) | Meandair AirportWeather-based flight rules</td>\n      </tr>\n      <tr>\n          <td><img alt=\"airport\" src=\"img/airports.png\" /></td>\n          <td>class</td>\n          <td>LIFR, IFR, MVFR, VFR</td>\n          <td>Overview</td>\n          <td>5h</td>\n          <td>5mins</td>\n          <td><img src=\"img/legend-airport.png\" alt=\"legend-airport\" height=\"200\" /></td>\n      </tr>\n      <tr style=\"background-color: #ededed;\">\n          <td colspan=\"7\"><strong>Solar</strong></td>\n      </tr>\n      <tr>\n          <td colspan=\"7\"><a id=\"section/Weather-Catalogue/global-horizontal-irradiance\"></a><code>global-horizontal-irradiance</code> | Global horizontal irradiance</td>\n      </tr>\n      <tr>\n          <td><img alt=\"global-horizontal-irradiance\" src=\"img/ghi.png\" /></td>\n          <td>W/m2</td>\n          <td>0 - 1000</td>\n          <td>Overview</td>\n          <td>5h</td>\n          <td>10mins</td>\n          <td><img src=\"img/legend-ghi.png\" alt=\"legend-global-horizontal-irradiance\" height=\"200\" /></td>\n      </tr>\n  </tbody>\n</table>\n\n### Refresh rate details\n\n| Region        | Refresh rate |\n|---------------|--------------|\n| Africa        | 15mins       |\n| India         | 15mins       |\n| rest of world | 10mins       |\n\n### Thunderstorm class description (`thunderstorm`)\n\n| Class | Description |\n|-------|-------------|\n| 1     | Unknown     |\n| 2     | Low         |\n| 3     | Moderate    |\n| 4     | High        |\n| 5     | Very high   |\n\n### Icing severity class description (`icing-severity`)\n\n| Class | Description |\n|-------|-------------|\n| 0     | None        |\n| 1     | Trace       |\n| 2     | Light       |\n| 3     | Moderate    |\n| 4     | Severe      |\n\n### Weather type class description (`weather-type`)\n\n| Class | Description            |\n|-------|------------------------|\n| 0     | No significant weather |\n| 1     | Extreme wind           |\n| 2     | Severe thunderstorm    |\n| 3     | Hail                   |\n| 4     | Severe wind            |\n| 5     | Blizzard               |\n| 6     | Thunderstorm           |\n| 7     | Icing                  |\n| 8     | Ice fog                |\n| 9     | Freezing fog           |\n| 10    | Fog                    |\n| 11    | Very windy             |\n| 12    | Haze                   |\n| 13    | Ice pellets            |\n| 14    | Mist                   |\n| 15    | Mixed precipitation    |\n| 16    | Snow showers           |\n| 17    | Rain showers           |\n| 18    | Freezing rain          |\n| 19    | Blowing snow           |\n| 20    | Snow                   |\n| 21    | Rain                   |\n| 22    | Freezing drizzle       |\n| 23    | Drizzle                |\n| 24    | Fire weather           |\n| 25    | Heat advisory          |\n| 26    | Extreme cold           |\n\n### Precipitation type class description (`precipitation-type`)\n\n| Class | Description      |\n|-------|------------------|\n| 0     | No precipitation |\n| 1     | Rain             |\n| 2     | Snow             |\n\n### Flight rules class description (`metar`, `airport`)\n\n| Icon                       | Colour  | Flight rule | Description                  | Visibility | Cloud ceiling height (AGL) |\n|----------------------------|---------|-------------|------------------------------|------------|----------------------------|\n| ![lifr](img/cond-lifr.png) | Magenta | LIFR        | Low Instrument Flight Rules  | < 1.5 km   | < 500 ft                   |\n| ![ifr](img/cond-ifr.png)   | Red     | IFR         | Instrument Flight Rules      | 1.5 - 5 km | 500 - 1000 ft              |\n| ![mvfr](img/cond-mvfr.png) | Blue    | MVFR        | Marginal Visual Flight Rules | 5 - 8 km   | 1000 - 3000 ft             |\n| ![vfr](img/cond-vfr.png)   | Green   | VFR         | Visual Flight Rules          | > 8 km     | > 3000 ft                  |\n"
  },
  "servers": [
    {
      "url": "https://prod.meandair.com"
    },
    {
      "url": "https://staging.meandair.com"
    }
  ],
  "paths": {
    "/api/v1/auth/jwt": {
      "post": {
        "operationId": "authJwtPost",
        "tags": [
          "Authentication"
        ],
        "summary": "Authenticate user and get JWT token.",
        "description": "Request a JWT token as a string that can be used for all other requests in a header \"Bearer <token>\".\n\nRequires authentication by POSTing user id and password.\n",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/auth_request_body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "description": "Wrong credentials."
          }
        }
      }
    },
    "/api/v1/auth/session": {
      "post": {
        "operationId": "authSessionPost",
        "tags": [
          "Authentication"
        ],
        "summary": "Authenticate user and get session token.",
        "description": "Request a session token as a string that can be used for all other requests via an optional query parameter `session`.\n\nRequires authentication by POSTing user id and password.\n",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/auth_request_body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "description": "Wrong credentials."
          }
        }
      }
    },
    "/api/v1/auth": {
      "post": {
        "operationId": "authentication",
        "tags": [
          "Authentication"
        ],
        "summary": "Authenticate user and get JWT token.",
        "deprecated": true,
        "description": "Alias for `/api/v1/auth/jwt` kept for backwards compatibility.\n\nUsing this endpoint is discouraged.\n\n**Deprecated**: Use `/api/v1/auth/jwt` instead.\n",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/auth_request_body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "description": "Wrong credentials."
          }
        }
      }
    },
    "/api/v1/session": {
      "get": {
        "operationId": "session",
        "tags": [
          "Authentication"
        ],
        "summary": "Get a session token via a JWT token.",
        "deprecated": true,
        "description": "Request a session token as a string that can be used for all other requests via an optional query parameter `session`.\n\nRequires a valid JWT token in a header \"Bearer <token>\".\n\nUsing this endpoint is discouraged, as it is mainly there for backwards compatibility.\n\n**Deprecated**: Use `/api/v1/auth/session` instead, which is more convenient since it provides you a session token without having to request a JWT token first.\n",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/tiles/{weather}/{zoom}_{altitude}_{col}_{row}_{datetime}.png": {
      "get": {
        "operationId": "weatherTiles",
        "tags": [
          "Weather Tiles"
        ],
        "summary": "Get the graphical Meandair weather tiles",
        "description": "Retrieves a session token as a string that can be used for all other requests via an optional query parameter `session`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "in": "path",
            "name": "weather",
            "schema": {
              "$ref": "#/components/schemas/tile"
            },
            "required": true,
            "description": "Type of weather layer to show. The Weather Catalogue provides description of the particular types."
          },
          {
            "in": "path",
            "name": "zoom",
            "schema": {
              "type": "integer"
            },
            "required": true,
            "description": "Zoom level. Minimum is `zoom=1` and maximum is `zoom=20`.",
            "example": 5
          },
          {
            "in": "path",
            "name": "altitude",
            "schema": {
              "type": "integer"
            },
            "required": true,
            "description": "Altitude in flight levels (FL), e.g. 'altitude=20' means horizontal cross-cut of the weather at FL20.\nMinimum is `altitude=0` (i.e., FL0) and maximum is `altitude=400` (i.e., FL400).\n\nThe altitude can be of a special value 999 (i.e., 'altitude=999') which codes the concept of the \"Overview\",\ntechnically a top view on the weather \"from above\".\n\nCheck \"Weather Catalogue\" to see which layers support flight levels, the overview or both.\n",
            "examples": {
              "60": {
                "value": 60,
                "description": "Horizontal cross-cut of the weather at the flight level 60."
              },
              "999": {
                "value": 999,
                "description": "Overview of the weather \"from above\"."
              }
            }
          },
          {
            "in": "path",
            "name": "col",
            "schema": {
              "type": "integer"
            },
            "required": true,
            "description": "Column coordinate of the tile (x axis) for the particular zoom level.",
            "example": 14
          },
          {
            "in": "path",
            "name": "row",
            "schema": {
              "type": "integer"
            },
            "required": true,
            "description": "Row coordinate of the tile (y axis) for the particular zoom level.",
            "example": 9
          },
          {
            "in": "path",
            "name": "datetime",
            "schema": {
              "type": "string",
              "format": "absolute ISO8601 time stamp (with milliseconds, Zulu) or relative 'now-plus-<time duration>'"
            },
            "required": true,
            "description": "Date and time of the requested weather (only future or \"now\", ceil-ed to 10 minutes). The data are provided for T+5 hours max.",
            "examples": {
              "absolute": {
                "value": "2023-05-05T17:20:00.000Z",
                "description": "Absolute time as ISO8601 time stamp."
              },
              "relative_m": {
                "value": "now-plus-17m",
                "description": "Time 17 min in the future relative to current now."
              },
              "relative_h": {
                "value": "now-plus-1.5h",
                "description": "Time 1.5 hours in the future relative to current now."
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/coverage": {
      "get": {
        "operationId": "coverage",
        "tags": [
          "Weather Coverages"
        ],
        "summary": "Retrieve a weather coverage",
        "description": "Retrieve the current state of the nowcasted weather as a coverage, that is,\nas a 2D, 3D, or 4D slice of a raster data.\n\nIn case of a 2D coverage, the X and Y coordinates represent longitude and latitude respectively.\nFor 3D coverages, either an additional time coordinate or an additional vertical coordinate is present.\nFor 4D coverages, it is both.\n\nSupported output formats are NetCDF and PNG, where the latter can only be used with 2D coverages.\nIn case of NetCDF, the data type is float32 with NAN serving as fill value.\n\nThe optional query parameters `time` and `vertical` are each to be specified as list of values, both strictly increasing.\nIn case of a single value, the response coverage has a single time or single vertical coordinate point, respectively.\nIn case of multiple values, the response coverage has multiple time or vertical coordinate points corresponding to given values.\nIf the underlying dataset has a time and/or vertical coordinate, respectively, then the query parameter `time` and/or `vertical`\nis mandatory. If an overview is available for the underlying dataset, however, then a missing `vertical` parameter indicates that\nthe overview is requested.\n\nNote that a list of values can be written conveniently using range notation with the following syntax: `(<first, last, step>)`.\nFor example, the query parameter `vertical=10,30,50,70,90,110,130` can be written as `vertical=(10,130,20)`.\nAs another example, the query parameter `time=now-plus-30m,now-plus-40m,now-plus-50m,now-plus-60m,now-plus-70m` can be written as\n`time=(now-plus-30m,now-plus-70m,10m)`. Range notation is especially convenient for long lists, like a time range spanning several\nhours with a step length of, say, 10 minutes.\n\nThe result data can be rounded using the optional query parameter `round_decimals`, which specifies the number of decimal places to\nround to (if negative, it specifies places left of the decimal point). Rounding is specifically useful together with HTTP-compression,\nbecause rounding can improve compression rates significantly.\n\nNote that this endpoint is only suited for downloading coverages of moderate size. For large coverages use the\nendpoints `/api/v1/coverage/prepare` and `/api/v1/coverage/download/{file_name}` instead, where the\nformer triggers the preparation of a coverage, and the latter can be used to download a coverage once it is prepared.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "name": "weather",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/coverage"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/bbox"
            }
          },
          {
            "name": "time",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/list_of_time"
            }
          },
          {
            "name": "vertical",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/list_of_vertical"
            }
          },
          {
            "name": "width",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Width of raster in pixels.",
              "example": 800
            }
          },
          {
            "name": "height",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Height of raster in pixels.",
              "example": 600
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "image/png",
                "application/netcdf"
              ],
              "description": "Format of the response."
            }
          },
          {
            "name": "round_decimals",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "description": "Number of decimal places to round to; if negative, it specifies places left of the decimal point.",
              "example": 3
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/netcdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/coverage/prepare": {
      "get": {
        "operationId": "coveragePrepare",
        "tags": [
          "Weather Coverages"
        ],
        "summary": "Prepare a weather coverage that can be downloaded later",
        "description": "Retrieve the current state of the nowcasted weather as a coverage, that is,\nas a 2D, 3D, or 4D slice of a raster data and store it as a file to be downloaded later\nusing the endpoint `/api/v1/coverage/download/{file_name}`.\n\nThe file name is returned as response body in `plain/text`.\n\nThe prepared filename will be deleted after some time.\n\nThe usage is the same as in case of the endpoint `/api/v1/coverage`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "name": "weather",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/coverage"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/bbox"
            }
          },
          {
            "name": "time",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/list_of_time"
            }
          },
          {
            "name": "vertical",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/list_of_double"
            }
          },
          {
            "name": "width",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Width of raster in pixels.",
              "example": 800
            }
          },
          {
            "name": "height",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "description": "Height of raster in pixels.",
              "example": 600
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "image/png",
                "application/netcdf"
              ],
              "description": "Format of the response."
            }
          },
          {
            "name": "round_decimals",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "description": "Number of decimal places to round to; if negative, it specifies places left of the decimal point.",
              "example": 3
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/coverage/download/{file_name}": {
      "get": {
        "operationId": "coverageDownload",
        "tags": [
          "Weather Coverages"
        ],
        "summary": "Download a weather coverage that has been prepared before",
        "description": "Download a weather coverage that has been prepared earlier using the endpoint `/api/v1/coverage/prepare`.\n\nThe typical usage is to invoke the endpoint `/api/v1/coverage/prepare` to trigger the preparation of\na coverage. Then, the endpoint `/api/v1/coverage/download/{file_name}` should be invoked periodically (say, once every minute)\nto check whether the coverage is readily prepared. This results in 404 if the preparation is still ongoing.\nIf the coverage is ready, however, the download starts immediately.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "name": "file_name",
            "in": "path",
            "schema": {
              "type": "string"
            },
            "required": false
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "application/netcdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/coverage/contour": {
      "get": {
        "operationId": "coverageContours",
        "tags": [
          "Weather Coverages"
        ],
        "summary": "Retrieve contour lines for a weather coverage",
        "description": "Retrieve contour lines for the current state of the nowcasted weather as a vector data set.\n\nSo far the only supported output format is GeoJSON.\n\nThe `time` and the `vertical` coordinate are optional query parameters that are each specified as list of values.\nIf the query specifies a time and/or a vertical coordinate, respectively, time and/or vertical coordinate are\nreported as properties of the retrieved contour lines.\n\nThe `threshold` query parameter determines for which values contour lines are rendered.\nNote that the time needed for rendering and the size of the response increase with the number of thresholds given.\n\nThe `detail` query parameter determines the level of detail when contour lines are rendered,\nwhere a smaller value means higher detail.\nNote that higher detail means that the time needed for rendering and the size of the response increase.\n\nThe `format` query parameter determines the output format. So far only `application/geo+json` is supported.\nHowever, the `+` symbol is problematic in URLs. So, for convenience, we accept `application/geojson`\nas an alternative to the official mime type `application/geo+json`.\n\nThe `use_polygon` query parameter determines whether the contours are returned as polygons (closed \"rings\"\nof points) or as line strings (sequences of points that are not necessarily closed).\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "name": "weather",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/coverage"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/bbox"
            }
          },
          {
            "name": "time",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/list_of_time"
            }
          },
          {
            "name": "vertical",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/list_of_double"
            }
          },
          {
            "name": "threshold",
            "in": "query",
            "required": true,
            "schema": {
              "description": "Thresholds for the contour lines.",
              "example": "10,12.5,15,17.5,20",
              "type": "string",
              "format": "comma separated list of doubles"
            }
          },
          {
            "name": "detail",
            "in": "query",
            "schema": {
              "description": "The level of detail in degree; smaller value means more detail.",
              "example": 0.1,
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "application/geo+json"
              ],
              "description": "Format of the response."
            }
          },
          {
            "name": "use_polygon",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ],
              "description": "When true, contours are returned as polygons (i.e., closed \"rings\" of points).\nOtherwise, contours are returned as lines strings (i.e., not necessarily closed\nsequence of points). Default value is `false`.\n",
              "example": "true"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/geo+json": {
                "schema": {
                  "type": "object",
                  "description": "A feature collection containing contour lines as line strings.",
                  "properties": {
                    "features": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "geometry": {
                            "type": "object",
                            "properties": {
                              "coordinates": {
                                "example": [
                                  [
                                    33.20269028696518,
                                    31.8969696969697
                                  ],
                                  [
                                    33.20849305509535,
                                    31.657575757575756
                                  ],
                                  [
                                    32.994981751824824,
                                    31.457931459833087
                                  ]
                                ],
                                "type": "array",
                                "items": {
                                  "type": "array",
                                  "items": {
                                    "type": "number",
                                    "format": "double"
                                  }
                                }
                              },
                              "type": {
                                "type": "string",
                                "enum": [
                                  "LineString"
                                ]
                              }
                            }
                          },
                          "properties": {
                            "type": "object",
                            "properties": {
                              "threshold": {
                                "type": "number",
                                "format": "double",
                                "example": 7.4465
                              },
                              "when": {
                                "type": "string",
                                "format": "ISO8601 time stamp",
                                "example": "2023-05-21T15:20:00Z"
                              },
                              "vertical": {
                                "example": {
                                  "value": 60,
                                  "unit": "hft"
                                },
                                "type": "object",
                                "properties": {
                                  "value": {
                                    "type": "number",
                                    "format": "double"
                                  },
                                  "unit": {
                                    "type": "string",
                                    "enum": [
                                      "hft",
                                      "m"
                                    ]
                                  }
                                }
                              }
                            }
                          },
                          "type": {
                            "type": "string",
                            "enum": [
                              "Feature"
                            ]
                          }
                        }
                      }
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "FeatureCollection"
                      ]
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/point": {
      "post": {
        "operationId": "pointPost",
        "tags": [
          "Weather Points"
        ],
        "summary": "Retrieve weather for a set of points",
        "description": "Retrieve the current state of the nowcasted weather for a given set of points, which must be 2D, 3D, or 4D points.\n\nThe retrieved set of points is\n\n`zip(latitude, longitude, time, vertical)`\n\nwhere `latitude`, `longitude`, `time`, and `vertical` are list-shaped input parameters. Note that `time` and\n`vertical` are optional. However, if the underlying dataset has a time and/or vertical coordinate, respectively,\nthen the parameter `time` and/or `vertical` is mandatory. Otherwise the query might fail or points with\narbitrary time and/or vertical coordinate might be retrieved.\n\nThe retrieved points are returned in JSON format as a list of records.\n\nThe result data can be rounded using the optional query parameter `round_decimals`, which specifies the number of decimal places to\nround to (if negative, it specifies places left of the decimal point). Rounding is specifically useful together with HTTP-compression,\nbecause rounding can improve compression rates significantly.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/point_request_body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/point_response"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/point/cut": {
      "post": {
        "operationId": "pointCutPost",
        "tags": [
          "Weather Points"
        ],
        "summary": "Retrieve weather as points in vertical and/or time cuts",
        "description": "Retrieve the current state of the nowcasted weather for a 2D, 3D, or, 4D set of points that represents a cut\nalong the time axis and/or the vertical axis.\n\nThe retrieved set of points is specified as the Cartesian product\n\n`zip(latitude, longitude)` x `time` x `vertical`\n\nwhere `latitude`, `longitude`, `time`, and `vertical` are list-shaped input parameters, with `time` and\n`vertical` being optional. If the underlying dataset has a time and/or vertical coordinate, respectively, then the\nparameter `time` and/or `vertical` have to be specified. Otherwise the query might fail or points with\narbitrary time and/or vertical coordinate might be retrieved.\n\nThe retrieved points are returned in JSON format as a list of records.\n\nThe result data can be rounded using the optional query parameter `round_decimals`, which specifies the number of decimal places to\nround to (if negative, it specifies places left of the decimal point). Rounding is specifically useful together with HTTP-compression,\nbecause rounding can improve compression rates significantly.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/point_request_body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/point_response"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/point/set/aggregate/mean": {
      "post": {
        "operationId": "pointSetAggregateMeanPost",
        "tags": [
          "Weather Points"
        ],
        "summary": "Retrieve averaged weather for a set of points",
        "description": "Retrieve the current state of the nowcasted weather for a given set of points, which must be 2D, 3D, or 4D points\nand then average the values. The averaged values are returned as a single point.\n\nThe retrieved set of points is\n\n`zip(latitude, longitude, time, vertical)`\n\nwhere `latitude`, `longitude`, `time`, and `vertical` are list-shaped input parameters. Note that `time` and\n`vertical` are optional. However, if the underlying dataset has a time and/or vertical coordinate, respectively,\nthen the parameter `time` and/or `vertical` is mandatory. Otherwise the query might fail or points with\narbitrary time and/or vertical coordinate might be retrieved.\n\nIf some of the retrieved points have missing values, the average is computed over the available values.\n\nThe computed average is returned in JSON format as a list of one record.\n\nThe retrieved data can be rounded before the average is computed using the optional query parameter `round_decimals`,\nwhich specifies the number of decimal places to round to (if negative, it specifies places left of the decimal point).\nThe resulting average is always returned with the highest precision available.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/point_request_body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/point_response"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/point/cut/aggregate/mean": {
      "post": {
        "operationId": "pointCutAggregateMeanPost",
        "tags": [
          "Weather Points"
        ],
        "summary": "Retrieve averaged weather over vertical and/or time cuts",
        "description": "Retrieve the current state of the nowcasted weather for a given set of points, which must be 2D, 3D, or 4D points and\nthen average the values by the vertical and time dimensions (if available and specified). The averaged values are returned\nas number of the time cuts times number of the vertical cuts.\n\nThe retrieved set of points is specified as the cartesian product\n\n`zip(latitude, longitude)` x `time` x `vertical`\n\nwhere `latitude`, `longitude`, `time`, and `vertical` are list-shaped input parameters, with `time` and\n`vertical` being optional. If the underlying dataset has a time and/or vertical coordinate, respectively, then the\nparameter `time` and/or `vertical` have to be specified. Otherwise the query might fail or points with\narbitrary time and/or vertical coordinate might be retrieved.\n\nIf some of the retrieved points have missing values, the average is computed over the available values.\n\nThe computed averages are returned in JSON format as a list of one record. Each record represents one averaged value for a particular\ncombination of time and vertical coordinate. Therefore the number of records is equal to the number of\ntime cuts times the number of vertical cuts.\n\nThe retrieved data can be rounded before the average is computed using the optional query parameter `round_decimals`,\nwhich specifies the number of decimal places to round to (if negative, it specifies places left of the decimal point).\nThe resulting average is always returned with the highest precision available.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/point_request_body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/point_response"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "description": "Not found."
          }
        }
      }
    },
    "/api/v1/aw-metar": {
      "get": {
        "operationId": "awMetar",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "AW-METAR weather for one location.",
        "deprecated": true,
        "description": "Retrieve the current state of the nowcasted weather at a specified location at a time T0 close to the current time.\n\nThe specified location can either be\n- a single airport given via query parameter `icao_id` that accepts a string or\n- a single location given via query parameters `latitude` and `longitude`\n  that each accept a floating point number.\n\nIf the location is specified via query parameter `icao_id` and the respective airport\npublishes METAR reports (which only a minority does), then the result contains a section\n`metar` with weather information obtained from decoding the METAR from that airport.\n\n**Deprecated**: The same functionality is covered by the more general `/api/v1/aw-metars`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/icao_id"
          },
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/weather_response"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/aw-metars": {
      "get": {
        "operationId": "awMetars",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "AW-METAR weather for list of locations",
        "description": "Retrieve the current state of the nowcasted weather at a list of locations at a time T0 close to the current time.\n\nThe specified locations can either be\n- a list of airports given via query parameter `icao_ids` that accepts strings separated by comma or\n- a list of locations given via query parameters `latitudes` and `longitudes`\n  that each accept a list of floating point numbers, where both lists have the same length,\n  with corresponding latitudes and longitudes at the same position respectively.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/icao_ids"
          },
          {
            "$ref": "#/components/parameters/latitudes"
          },
          {
            "$ref": "#/components/parameters/longitudes"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/weather_response"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "awMetarsPost",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "AW-METAR weather for list of locations",
        "description": "Retrieve the current state of the nowcasted weather at a list of locations at a time T0 close to current time.\n\nThe specified one or more locations are given in terms of their ICAO codes or\nvia their latitudes and longitudes, the latter as as two separate lists within\nthe request body.\n\nThe POST request does the same as the GET request.\n\nTo avoid very long URLs, the POST request should be used for larger numbers of locations.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/lat_lon_request_body"
                  },
                  {
                    "$ref": "#/components/schemas/icao_id_request_body"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/weather_response"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/aw-taf": {
      "get": {
        "operationId": "awTaf",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "AW-TAF weather for one location.",
        "deprecated": true,
        "description": "Retrieve the forecasted weather at a specified location for the next 5 hours at times\nT0+1h, T0+2h, ..., T0+5h with a time T0 close to current time.\n\nThe specified location can either be\n- a single airport given via query parameter `icao_id` that accepts a string or\n- a single location given via query parameters `latitude` and `longitude`\n  that each accept a floating point number.\n\nIf the location is specified via query parameter `icao_id` and the respective airport\npublishes TAF reports (which only a minority does), then the result contains a section\n`taf` with weather information obtained from decoding the TAF from that airport.\n\n**Deprecated**: The same functionality is covered by the more general `/api/v1/aw-tafs`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/icao_id"
          },
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/weather_response"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/aw-tafs": {
      "get": {
        "operationId": "awTafs",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "AW-TAF weather for list of locations",
        "description": "Retrieve the forecasted weather at a list of locations for the next 5 hours at times\nT0+1h, T0+2h, ..., T0+5h with a time T0 close to current time.\n\nThe specified locations can either be\n- a list of airports given via query parameter `icao_ids` that accepts strings separated by comma or\n- a list of locations given via query parameters `latitudes` and `longitudes`\n  that each accept a list of floating point numbers, where both lists have the same length,\n  with corresponding latitudes and longitudes at the same position respectively.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/icao_ids"
          },
          {
            "$ref": "#/components/parameters/latitudes"
          },
          {
            "$ref": "#/components/parameters/longitudes"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/weather_response"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      },
      "post": {
        "operationId": "awTafsPost",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "AW-TAF weather for list of locations",
        "description": "Retrieve the forecasted weather at a list of locations for the next 5 hours at times\nT0+1h, T0+2h, ..., T0+5h with a time T0 close to current time.\n\nThe specified one or more locations are given in terms of their ICAO codes or\nvia their latitudes and longitudes, the latter as as two separate lists within\nthe request body.\n\nThe POST request does the same as the GET request.\n\nTo avoid very long URLs, the POST request should be used for larger numbers of locations.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/lat_lon_request_body"
                  },
                  {
                    "$ref": "#/components/schemas/icao_id_request_body"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/weather_response"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/aw-metar-report": {
      "get": {
        "operationId": "awMetarReport",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Textual AW-METAR weather report for one location",
        "deprecated": true,
        "description": "Retrieve the current state of the nowcasted weather at a specified location\nand generate a synthetic textual METAR-like report from that data.\n\nThe specified location can either be\n- a single airport given via query parameter `icao_id` that accepts a string or\n- a single location given via query parameters `latitude` and `longitude`\n  that each accept a floating point number.\n\n**Deprecated**: The same functionality is covered by the more general `/api/v1/aw-metar-reports`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/icao_id"
          },
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/synthetic_metar_report"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      }
    },
    "/api/v1/aw-metar-reports": {
      "get": {
        "operationId": "awMetarReports",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Textual AW-METAR weather reports for list of locations",
        "description": "Retrieve the current state of the nowcasted weather at a list of specified locations\nand generate synthetic textual METAR-like reports from that data.\n\nThe specified locations can either be\n- a list of airports given via query parameter `icao_ids` that accepts strings separated by comma or\n- a list of locations given via query parameters `latitudes` and `longitudes`\n  that each accept a list of floating point numbers, where both lists have the same length,\n  with corresponding latitudes and longitudes at the same position respectively.\n\nThe response can either be JSON data or a plain text, depending on the optional query parameter `format`\nthat defaults to `text/plain`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/icao_ids"
          },
          {
            "$ref": "#/components/parameters/latitudes"
          },
          {
            "$ref": "#/components/parameters/longitudes"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "text/plain",
                "application/json"
              ],
              "description": "Format of the response."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/plain_text_list_of_synthetic_metar_report"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/list_of_synthetic_metar_report"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      },
      "post": {
        "operationId": "awMetarReportsPost",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Textual AW-METAR weather reports for list of locations",
        "description": "Retrieve the current state of the nowcasted weather at a list of specified locations\nand generate synthetic textual METAR-like reports from that data.\n\nThe specified one or more locations are given in terms of their ICAO codes or\nvia their latitudes and longitudes, the latter as as two separate lists within\nthe request body.\n\nThe POST request does the same as the GET request except for not supporting format plain/text.\n\nTo avoid very long URLs, the POST request should be used for larger numbers of locations\nrather than the GET request.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/lat_lon_request_body"
                  },
                  {
                    "$ref": "#/components/schemas/icao_id_request_body"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/weather_response"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/aw-taf-report": {
      "get": {
        "operationId": "awTafReport",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Textual AW-TAF weather report for one location",
        "deprecated": true,
        "description": "Retrieve the forecasted weather at a specified location for the next 5 hours\nand generate a synthetic textual TAF-like report from that data.\n\nThe specified location can either be\n- a single airport given via query parameter `icao_id` that accepts a string or\n- a single location given via query parameters `latitude` and `longitude`\n  that each accept a floating point number.\n\n**Deprecated**: The same functionality is covered by the more general `/api/v1/aw-taf-reports`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/icao_id"
          },
          {
            "$ref": "#/components/parameters/latitude"
          },
          {
            "$ref": "#/components/parameters/longitude"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/synthetic_taf_report"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      }
    },
    "/api/v1/aw-taf-reports": {
      "get": {
        "operationId": "awTafReports",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Textual AW-TAF weather reports for list of locations",
        "description": "Retrieve the forecasted weather at a list of locations for the next 5 hours\nin the form of synthetic textual TAF-like reports.\n\nThe specified locations can either be\n- a list of airports given via query parameter `icao_ids` that accepts strings separated by comma or\n- a list of locations given via query parameters `latitudes` and `longitudes`\n  that each accept a list of floating point numbers, where both lists have the same length,\n  with corresponding latitudes and longitudes at the same position respectively.\n\nThe response can either be JSON data or a plain text, depending on the optional query parameter `format`\nthat defaults to `text/plain`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/icao_ids"
          },
          {
            "$ref": "#/components/parameters/latitudes"
          },
          {
            "$ref": "#/components/parameters/longitudes"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "text/plain",
                "application/json"
              ],
              "description": "Format of the response."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/plain_text_list_of_synthetic_taf_report"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/list_of_synthetic_taf_report"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      },
      "post": {
        "operationId": "awTafReportsPost",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Textual AW-TAF weather reports for list of locations",
        "description": "Retrieve the forecasted weather at a list of locations for the next 5 hours\nin the form of synthetic textual TAF-like reports.\n\nThe specified one or more locations are given in terms of their ICAO codes or\nvia their latitudes and longitudes, the latter as as two separate lists within\nthe request body.\n\nThe POST request does the same as the GET request except for not supporting format plain/text.\n\nTo avoid very long URLs, the POST request should be used for larger numbers of locations\nrather than the GET request.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/lat_lon_request_body"
                  },
                  {
                    "$ref": "#/components/schemas/icao_id_request_body"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/weather_response"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/metar-report": {
      "get": {
        "operationId": "metarReport",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Original METAR weather report for an airport",
        "deprecated": true,
        "description": "Retrieve the original textual METAR weather report for an airport specified by its ICAO code.\n\nThe airport's ICAO code must be given via query parameter `icao_id` accepting a string.\nNote that METAR reports are available only for a minority of airports.\n\n**Deprecated**: The same functionality is covered by the more general `/api/v1/metar-reports`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/strict_icao_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/metar_report"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      }
    },
    "/api/v1/metar-reports": {
      "get": {
        "operationId": "metarReports",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Original METAR weather reports for a list of airport",
        "description": "Retrieve the original textual METAR weather report for a list of airport specified by their ICAO codes.\n\nThe airport's ICAO codes must be given via query parameter `icao_ids` accepting a string.\nNote that METAR reports are available only for a minority of airports.\n\nThe response can either be JSON data or a plain text, depending on the optional query parameter `format`\nthat defaults to `text/plain`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/strict_icao_ids"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "text/plain",
                "application/json"
              ],
              "description": "Format of the response."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/plain_text_list_of_metar_report"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/list_of_metar_report"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      },
      "post": {
        "operationId": "metarReportsPost",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Original METAR weather reports for a list of airport",
        "description": "Retrieve the original textual METAR weather report for a list of airport specified by their ICAO codes.\n\nThe airport's ICAO codes must be given within the request body as a list of strings with the key `icao_id`.\nNote that METAR reports are available only for a minority of airports.\n\nThe POST request does the same as the GET request except for not supporting format plain/text.\n\nTo avoid very long URLs, the POST request should be used for larger numbers of locations\nrather than the GET request.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/lat_lon_request_body"
                  },
                  {
                    "$ref": "#/components/schemas/icao_id_request_body"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/weather_response"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/taf-report": {
      "get": {
        "operationId": "tafReport",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Original TAF weather report for an airport",
        "deprecated": true,
        "description": "Retrieve the original textual TAF weather report for an airport specified by its ICAO code.\n\nThe airport's ICAO code must be given via query parameter `icao_id` accepting a string.\nNote that TAF reports are available only for a minority of airports.\n\n**Deprecated**: The same functionality is covered by the more general `/api/v1/taf-reports`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/strict_icao_id"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/taf_report"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      }
    },
    "/api/v1/taf-reports": {
      "get": {
        "operationId": "tafReports",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Original TAF weather reports for a list of airports",
        "description": "Retrieve the original textual TAF weather report for a list of airport specified by their ICAO codes.\n\nThe airport's ICAO codes must be given via query parameter `icao_ids` accepting a string.\nNote that METAR reports are available only for a minority of airports.\n\nThe response can either be JSON data or a plain text, depending on the optional query parameter `format`\nthat defaults to `text/plain`.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/strict_icao_ids"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "text/plain",
                "application/json"
              ],
              "description": "Format of the response."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/plain_text_list_of_taf_report"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/list_of_taf_report"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      },
      "post": {
        "operationId": "tafReportsPost",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "Original TAF weather reports for a list of airports",
        "description": "Retrieve the original textual TAF weather report for a list of airport specified by their ICAO codes.\n\nThe airport's ICAO codes must be given within the request body as a list of strings with the key `icao_id`.\nNote that TAF reports are available only for a minority of airports.\n\nThe POST request does the same as the GET request except for not supporting format plain/text.\n\nTo avoid very long URLs, the POST request should be used for larger numbers of locations\nrather than the GET request.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/lat_lon_request_body"
                  },
                  {
                    "$ref": "#/components/schemas/icao_id_request_body"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/weather_response"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          }
        }
      }
    },
    "/api/v1/icao-ids": {
      "get": {
        "operationId": "getIcaoCodes",
        "tags": [
          "Airport and Location Weather"
        ],
        "summary": "ICAO codes in bounding box",
        "description": "Retrieve ICAO codes of all airports in given bounding box.\n\nThe bounding box is given in terms of the four query parameters\nmin_lat, min_lon, max_lat, and max_lon.\n",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "sessionToken": []
          }
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/min_lat"
          },
          {
            "$ref": "#/components/parameters/min_lon"
          },
          {
            "$ref": "#/components/parameters/max_lat"
          },
          {
            "$ref": "#/components/parameters/max_lon"
          }
        ],
        "responses": {
          "200": {
            "description": "Success. (metered)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/strict_icao_id"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/UnauthorizedError"
          },
          "404": {
            "$ref": "#/components/responses/NotFoundError"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      },
      "sessionToken": {
        "type": "apiKey",
        "in": "query",
        "name": "session"
      }
    },
    "responses": {
      "UnauthorizedError": {
        "description": "Access token (or session token if applicable) is missing or invalid."
      },
      "NotFoundError": {
        "description": "Not found."
      }
    },
    "schemas": {
      "icao_id": {
        "type": "string",
        "format": "capital letters, numbers, or '-'",
        "description": "Airport identifier used for (AW-)METAR/TAF reports (either an ICAO airport code or an AW airport code).",
        "example": "LKPR"
      },
      "list_of_icao_id": {
        "type": "string",
        "description": "Airport identifier used for (AW-)METAR/TAF reports (either an ICAO airport code or an AW airport code) separated by comma.",
        "example": "LJFK,EDDF,LKPR"
      },
      "strict_icao_id": {
        "type": "string",
        "format": "capital letters, numbers, or '-'",
        "description": "ICAO airport code used for METAR/TAF reports.",
        "example": "LKPR"
      },
      "list_of_strict_icao_id": {
        "type": "string",
        "description": "Airport identifier used for METAR/TAF reports separated by comma.",
        "example": "LJFK,EDDF,LKPR"
      },
      "list_of_double": {
        "type": "string",
        "format": "digits 0 to 9, '.', '-', or ','",
        "description": "List of double precision numbers separated by comma.",
        "example": "13.45234,-21.893435"
      },
      "bbox": {
        "type": "string",
        "format": "digits 0 to 9, '.', '-', ',', or 'inf'",
        "description": "A list of four double precision numbers separated by comma denoting a bounding box,\nfollowing the scheme x_min, y_min, x_max, y_max. Note that `inf` and `-inf` are\nallowed values.\n",
        "example": "-26.25,24.5,43.7,74.25"
      },
      "synthetic_metar_report": {
        "type": "string",
        "format": "capital letters, numbers, '-', '/', '.', or space",
        "example": "AW-METAR KJFK 241305Z AUTO 00000MPS 9999 BKN090 10/// Q1029 RMK PROVIDED BY AIRPORTWEATHER.COM ADVISORY ONLY",
        "description": "Synthetically generated METAR report. Follows METAR format conventions but starts with AW-METAR.\n\nWhen issued for a location without an ICAO code, we generate a pseudo-ICAO-code that encodes the\ncoordinate of the location. The format is `YYYy+[N|S]XXXx+[E|W]`, where\n- `YYYy+[N|S]` and `XXXx+[E|W]` denote latitude and longitude respectively,\n- `YYY` and `XXX` are the three zero padded digits before the decimal point,\n- `y+` and `x+` are a flexible number of digits after the decimal point (depending on the accuracy), and\n- `N` or `S` and `E` or `W` denote weather latitude and longitude are positive or negative respectively.\n"
      },
      "list_of_synthetic_metar_report": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/synthetic_metar_report"
        }
      },
      "plain_text_list_of_synthetic_metar_report": {
        "type": "string",
        "format": "capital letters, numbers, '-', '/', '.', space, or newline",
        "description": "List of synthetically generated METAR report separated by newline.\nEach report follows METAR format conventions but starts with AW-METAR.\n",
        "example": [
          "AW-METAR KJFK 251935Z AUTO 23007KT 9999 CLR 17/03 Q1018 RMK PROVIDED BY AIRPORTWEATHER.COM ADVISORY ONLY",
          "AW-METAR EDDF 251935Z AUTO 04007KT 9999 BKN240 13/11 Q1020 RMK PROVIDED BY AIRPORTWEATHER.COM ADVISORY ONLY"
        ]
      },
      "synthetic_taf_report": {
        "type": "string",
        "example": "AW-TAF KSFO 241305Z 2414/2418 11001MPS 9999 SCT024 FM241405 13001MPS 9999 SCT012 FM241505 11001MPS 9999 BKN/// FM241605 05001MPS 9999 BKN036 FM241705 11001MPS 9999 CLR FM241805 26001MPS 9999 CLR RMK PROVIDED BY AIRPORTWEATHER.COM ADVISORY ONLY",
        "description": "Synthetically generated TAF report. Follows TAF format conventions but starts with AW-TAF.\n\nWhen issued for a location without an ICAO code, we generate a pseudo-ICAO-code that encodes the\ncoordinate of the location. The format is `YYYy+[N|S]XXXx+[E|W]`, where\n- `YYYy+[N|S]` and `XXXx+[E|W]` denote latitude and longitude respectively,\n- `YYY` and `XXX` are the three zero padded digits before the decimal point,\n- `y+` and `x+` are a flexible number of digits after the decimal point (depending on the accuracy), and\n- `N` or `S` and `E` or `W` denote weather latitude and longitude are positive or negative respectively.\n"
      },
      "list_of_synthetic_taf_report": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/synthetic_taf_report"
        }
      },
      "plain_text_list_of_synthetic_taf_report": {
        "type": "string",
        "description": "List of synthetically generated TAF report separated by newline.\nEach report follows TAF format conventions but starts with AW-TAF.\n",
        "example": [
          "AW-TAF KJFK 252015Z 2521/2602 24008KT 9999 BKN260 FM252115 22008KT 9999 CLR FM252215 23008KT 9999 BKN180 FM252315 25008KT 9999 BKN310 FM260015 25009KT 9999 BKN290 FM260115 25008KT 9999 OVC250 RMK PROVIDED BY AIRPORTWEATHER.COM ADVISORY ONLY",
          "AW-TAF EDDF 252020Z 2521/2602 04005KT 9999 FEW110 FM252120 04007KT 9999 CLR FM252220 04006KT 9999 FEW/// FM252320 04005KT 9999 FEW/// FM260020 05004KT 9999 BKN120 FM260120 05003KT 9999 SCT110 RMK PROVIDED BY AIRPORTWEATHER.COM ADVISORY ONLY"
        ]
      },
      "synthetic_report_remark": {
        "type": "string",
        "format": "capital letters, numbers, '-', '/', '.', or space",
        "example": "PROVIDED BY AIRPORTWEATHER.COM ADVISORY ONLY",
        "description": "Remark section of synthetically generated METAR or TAF reports."
      },
      "metar_report": {
        "type": "string",
        "format": "capital letters, numbers, '-', '/', '.', or space",
        "example": "EDDF 011220Z AUTO 18012KT 150V210 CAVOK 15/08 Q1004 NOSIG",
        "description": "Original METAR report issued by airport."
      },
      "list_of_metar_report": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/metar_report"
        }
      },
      "plain_text_list_of_metar_report": {
        "type": "string",
        "format": "capital letters, numbers, '-', '/', '.', space, or newline",
        "description": "Original METAR reports issued by airports separated by newline.",
        "example": [
          "KJFK 251851Z 23008KT 10SM FEW250 17/04 A3008 RMK AO2 SLP185 T01670039",
          "EDDF 251920Z AUTO 04008KT CAVOK 13/11 Q1020 NOSIG"
        ]
      },
      "taf_report": {
        "type": "string",
        "format": "capital letters, numbers, '-', '/', '.', or space",
        "example": "TAF EDDF 011100Z 0112/0218 18008KT 9999 SCT030 PROB40 TEMPO 0117/0120 19015G25KT 4500 SHRA BKN020TCU BECMG 0202/0204 BKN030 TEMPO 0203/0209 3500 RA PROB30 TEMPO 0203/0209 BKN014 BECMG 0207/0209 17013KT TEMPO 0207/0216 17015G30KT PROB40 TEMPO 0213/0218 4500 SHRA BKN020CB",
        "description": "Original TAF report issued by airport."
      },
      "list_of_taf_report": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/taf_report"
        }
      },
      "plain_text_list_of_taf_report": {
        "type": "string",
        "format": "capital letters, numbers, '-', '/', '.', space, or newline",
        "description": "Original TAF reports issued by airports separated by newline.",
        "example": [
          "TAF AMD KJFK 251943Z 2520/2624 21009KT P6SM FEW250 FM260100 23007KT P6SM BKN070 FM261100 29011KT P6SM SCT070 FM261500 31015G25KT P6SM FEW040 FEW250",
          "TAF EDDF 251700Z 2518/2624 06005KT CAVOK PROB30 TEMPO 2602/2607 1200 BCFG PROB40 TEMPO 2607/2612 BKN012"
        ]
      },
      "latitude": {
        "type": "object",
        "required": [
          "unit",
          "value"
        ],
        "properties": {
          "unit": {
            "type": "string",
            "enum": [
              "degree_north"
            ]
          },
          "value": {
            "type": "number",
            "format": "float",
            "example": 50.7556
          }
        }
      },
      "longitude": {
        "type": "object",
        "required": [
          "unit",
          "value"
        ],
        "properties": {
          "unit": {
            "type": "string",
            "enum": [
              "degree_east"
            ]
          },
          "value": {
            "type": "number",
            "format": "float",
            "example": 3.86389
          }
        }
      },
      "elevation": {
        "type": "object",
        "required": [
          "unit",
          "value"
        ],
        "properties": {
          "unit": {
            "type": "string",
            "enum": [
              "m"
            ]
          },
          "value": {
            "type": "number",
            "format": "float",
            "example": 110.9471
          }
        }
      },
      "tile": {
        "type": "string",
        "enum": [
          "precipitation-probability",
          "convective-precipitation-rate",
          "precipitation-composite",
          "precipitation-rate",
          "reflectivity",
          "reflectivity-composite",
          "precipitation-type",
          "cloud-composite",
          "cloud-cover",
          "cloud-cover-error",
          "cloud-mask-error",
          "cloud-top-amsl",
          "cloud-lowest-top-amsl",
          "cloud-ceiling-agl",
          "visibility-sfc",
          "wind-composite-10m-agl",
          "wind-speed-10m-agl",
          "wind-u-10m-agl",
          "wind-v-10m-agl",
          "wind-gust-10m-agl",
          "wind-composite-80m-agl",
          "wind-speed-80m-agl",
          "wind-u-80m-agl",
          "wind-v-80m-agl",
          "wind-composite",
          "wind-speed",
          "wind-u",
          "wind-v",
          "turbulence",
          "thunderstorm",
          "icing-severity",
          "weather-type",
          "air-pressure-qnh",
          "air-temperature-2m-agl",
          "dew-point-temperature-2m-agl",
          "metar",
          "airport",
          "k-index",
          "precipitation-arrival",
          "precipitation-arrival-binary",
          "global-horizontal-irradiance"
        ],
        "example": "precipitation-probability"
      },
      "coverage": {
        "type": "string",
        "enum": [
          "precipitation-probability",
          "convective-precipitation-rate",
          "precipitation-rate",
          "reflectivity",
          "reflectivity-composite",
          "precipitation-type",
          "cloud-cover",
          "cloud-cover-error",
          "cloud-mask-error",
          "cloud-top-amsl",
          "cloud-lowest-top-amsl",
          "cloud-ceiling-agl",
          "visibility-sfc",
          "thunderstorm",
          "turbulence",
          "icing-severity",
          "weather-type",
          "air-pressure-qnh",
          "air-temperature-2m-agl",
          "dew-point-temperature-2m-agl",
          "wind-gust-10m-agl",
          "wind-u-10m-agl",
          "wind-v-10m-agl",
          "wind-u-80m-agl",
          "wind-v-80m-agl",
          "wind-u",
          "wind-v",
          "k-index",
          "precipitation-arrival",
          "global-horizontal-irradiance"
        ],
        "example": "precipitation-probability"
      },
      "general_quantity": {
        "type": "object",
        "properties": {
          "unit": {
            "type": "string",
            "example": "Pa",
            "enum": [
              "Pa",
              "degC",
              "m",
              "percent",
              "degreeT",
              "m/s",
              "s",
              "hft",
              "m2/3 s-1",
              "W m-2",
              "600 s",
              "1"
            ]
          },
          "value": {
            "type": "number",
            "description": "Numeric form of the value (e.g., 34.2 m/s for wind speed).",
            "example": 101608.285
          },
          "meaning": {
            "type": "string",
            "enum": [
              "no data",
              "no ceiling",
              "no clouds",
              "terrain",
              "no precipitation",
              "masked"
            ],
            "description": "- \"no data\": no data available\n- \"no ceiling\": there is no ceiling because there are no clouds on the respective location\n- \"no clouds\": there are no clouds on the respective location\n- \"terrain\": The pixel's altitude is not above ground\n- \"no precipitation\": no precipitation observed or predicted\n- \"masked\": Default value that should never occur. If it does, please report a bug.\n",
            "example": "no ceiling"
          }
        }
      },
      "awd_quantity": {
        "type": "object",
        "properties": {
          "unit": {
            "type": "string",
            "example": "Pa",
            "enum": [
              "Pa",
              "degC",
              "m",
              "percent",
              "degreeT",
              "m/s",
              "s"
            ]
          },
          "value": {
            "type": "number",
            "description": "Numeric form of the value (e.g., 34.2 m/s for wind speed).",
            "example": 101608.285
          },
          "meaning": {
            "type": "string",
            "enum": [
              "no data",
              "no ceiling",
              "undefined",
              "variable"
            ],
            "description": "- \"no data\": a value showed in principle, but there are no source data for currently; a possible reason might be that no value is present in the current METAR report for an airport for example\nIn case of non-existent value (unit and value are omitted), textual explanation of the omission reason\n- \"no ceiling\": there is no ceiling; this is very different from \"no data\", because \"no ceiling\" means there are the data, but the data says there is no ceiling\n- \"undefined\": a value showed in principle, but for the current data it does not have a defined meaning; for example, if data says wind speed is 0 m/s, then wind direction does not have a defined meaning, in which case we report \"undefined\"\n- \"variable\": value is not stable; for example, if the wind direction changes a lot, no fixed direction can be reported\n",
            "example": "no ceiling"
          }
        }
      },
      "weather_time": {
        "type": "string",
        "format": "ISO8601 (extended by the name of the time-zone in square brackets)",
        "example": "2023-01-20T11:45:00+01:00[Europe/Brussels]"
      },
      "valid_time": {
        "allOf": [
          {
            "$ref": "#/components/schemas/weather_time"
          }
        ],
        "description": "Date and time for which the current weather value is valid."
      },
      "list_of_time": {
        "type": "string",
        "format": "ISO8601 time stamps, 'now-plus-<time duration>', ',' | (first, last, step)",
        "description": "List of time stamps separated by comma.\nA time stamp is either in ISO8601 or relative to now denoted as `now-plus-<time duration>`.\nA time duration is denoted as `<float><unit>` with `<unit>` being `m` (minutes) or `h` (hours).\nNote that ISO8601 time stamps are without milliseconds and `Z` is the only allowed timezone specifier\n(with `Z` denoting UTC).\nAlso note that `now-plus-0m` can be written as `now`.\nAll requested time stamps have to be in future or now.\nAn alternative format of the list is `(first, last, step)` where `first` and `last` are ISO8601 time stamps or the `now-plus-<time duration>` and `step` is a time duration.\n",
        "example": "2023-01-20T10:45:00Z,2023-01-20T11:30:00Z,now-plus-17m,now-plus-1.5h | (now,now-plus-24h,10m)"
      },
      "list_of_vertical": {
        "type": "string",
        "format": "digits 0 to 9, '.', '-', ',' | (first, last, step)",
        "description": "List of double precision numbers separated by comma.\nAn alternative format of the list is `(first, last, step)` where `first` and `last` and `step` are double precision numbers.\n",
        "example": "13.45234,-21.893435 | (0, 600, 10)"
      },
      "weather_response": {
        "type": "object",
        "properties": {
          "icao_id": {
            "$ref": "#/components/schemas/icao_id"
          },
          "latitude": {
            "$ref": "#/components/schemas/latitude"
          },
          "longitude": {
            "$ref": "#/components/schemas/longitude"
          },
          "elevation": {
            "$ref": "#/components/schemas/elevation"
          },
          "next_sunrise": {
            "$ref": "#/components/schemas/weather_time"
          },
          "next_sunset": {
            "$ref": "#/components/schemas/weather_time"
          },
          "magnetic_declination": {
            "type": "object",
            "description": "Angle between magnetic north and true north (positive when angle is east of true north).\n",
            "required": [
              "unit",
              "value"
            ],
            "properties": {
              "unit": {
                "type": "string",
                "enum": [
                  "degreeT"
                ]
              },
              "value": {
                "type": "number",
                "format": "float",
                "example": 3.243213
              }
            }
          },
          "timezone": {
            "type": "object",
            "description": "Timezone of the response location",
            "properties": {
              "name": {
                "type": "string",
                "example": "Europe/Prague"
              },
              "offset": {
                "properties": {
                  "unit": {
                    "type": "string",
                    "enum": [
                      "s"
                    ]
                  },
                  "value": {
                    "type": "number",
                    "format": "float",
                    "example": 7200
                  }
                }
              }
            }
          },
          "nowcast": {
            "type": "object",
            "description": "Meandair nowcasted AW-METAR (time_steps[0]) and AW-TAF (time_steps[1..5]) data",
            "properties": {
              "batch_time": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/weather_time"
                  }
                ],
                "description": "Date and time of the temporal batch the data fall in",
                "example": "2023-06-21T12:50:00+02:00[Europe/Prague]"
              },
              "earliest_modified_time": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/weather_time"
                  }
                ],
                "description": "Date and time of the earliest input data used",
                "example": "2023-06-21T12:45:13+02:00[Europe/Prague]"
              },
              "latest_modified_time": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/weather_time"
                  }
                ],
                "description": "Date and time of the latest input data used",
                "example": "2023-06-21T12:47:11+02:00[Europe/Prague]"
              },
              "publish_time": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/weather_time"
                  }
                ],
                "description": "Date and time when the weather data were generated and published",
                "example": "2023-06-21T12:52:25+02:00[Europe/Prague]"
              },
              "air_pressure_qnh": {
                "description": "Air pressure in QNH (unit: Pa).",
                "type": "object",
                "properties": {
                  "time_steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "quantity": {
                          "$ref": "#/components/schemas/awd_quantity"
                        },
                        "valid_time": {
                          "$ref": "#/components/schemas/valid_time"
                        }
                      }
                    }
                  }
                }
              },
              "air_temperature_2m_agl": {
                "description": "Temperature 2m above ground level (unit: degC).",
                "type": "object",
                "properties": {
                  "time_steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "quantity": {
                          "$ref": "#/components/schemas/awd_quantity"
                        },
                        "valid_time": {
                          "$ref": "#/components/schemas/valid_time"
                        }
                      }
                    }
                  }
                }
              },
              "ceiling_agl": {
                "description": "Altitude of cloud ceiling above the ground level (unit: m).",
                "type": "object",
                "properties": {
                  "time_steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "quantity": {
                          "$ref": "#/components/schemas/awd_quantity"
                        },
                        "valid_time": {
                          "$ref": "#/components/schemas/valid_time"
                        }
                      }
                    }
                  }
                }
              },
              "cloud_cover": {
                "description": "Cloud cover amount (unit: percent).",
                "type": "object",
                "properties": {
                  "time_steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "quantity": {
                          "$ref": "#/components/schemas/awd_quantity"
                        },
                        "valid_time": {
                          "$ref": "#/components/schemas/valid_time"
                        }
                      }
                    }
                  }
                }
              },
              "surface_visibility": {
                "description": "Visibility distance from ground point (unit: m).",
                "type": "object",
                "properties": {
                  "time_steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "quantity": {
                          "$ref": "#/components/schemas/awd_quantity"
                        },
                        "valid_time": {
                          "$ref": "#/components/schemas/valid_time"
                        }
                      }
                    }
                  }
                }
              },
              "wind_10m_agl": {
                "description": "Wind direction (unit: degreeT) and speed (unit: m/s) 10m above the ground.",
                "type": "object",
                "properties": {
                  "time_steps": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "from_direction": {
                          "$ref": "#/components/schemas/awd_quantity"
                        },
                        "speed": {
                          "$ref": "#/components/schemas/awd_quantity"
                        },
                        "gust_speed": {
                          "$ref": "#/components/schemas/awd_quantity"
                        },
                        "valid_time": {
                          "$ref": "#/components/schemas/valid_time"
                        }
                      }
                    }
                  }
                }
              },
              "synthetic_metar_report": {
                "$ref": "#/components/schemas/synthetic_metar_report"
              },
              "synthetic_taf_report": {
                "$ref": "#/components/schemas/synthetic_taf_report"
              },
              "synthetic_report_remark": {
                "$ref": "#/components/schemas/synthetic_report_remark"
              }
            }
          },
          "metar": {
            "type": "object",
            "description": "Provided that the location publishes METAR, this section contain JSON parsed METAR data.\n\nFormat of `metar` and `nowcast` sections is in principle the same. The differences are the following:\n- `metar` has section `dew_point_temperature_2m_agl` and `nowcast` does not\n- `metar` contains `original_report` but `nowcast` contains `synthetic_metar_report`\n- `metar` has `observation_time`, `nowcast` does not (the process of observation, thus `observation_time` is specific for `metar`)\n- `metar` has `gust_speed` under `wind_10m_agl`, `nowcast` does not (planned for future versions of `nowcast`)\n- `metar` may have `\"value_type\": \"above\"` under `surface_visibility`, nowcast does not need that because it can report values above 10000m (which METAR does not)\n- `metar` does not have `earliest_modified_time` and `latest_modified_time`, which are specific for `nowcast`\n"
          },
          "taf": {
            "type": "object",
            "description": "Provided that the location publishes TAF, this section contain JSON parsed TAF data.\n\nFormat of `taf` and `nowcast` sections is in principle the same. The differences are the following:\n- `taf` has `issued_time` and `nowcast` does not (note that `issued_time` is specific for `taf`)\n- `taf` contains section `probability` and `nowcast` does not\n- `taf` misses two sections that `nowcast` has; these are `air_pressure_qnh` and `air_temperature_2m_agl\"`\n- `taf` does not have `earliest_modified_time` and `latest_modified_time`, which are specific for `nowcast`\n- `taf` has `original_report`, which `nowcast` does not (planned for future versions of `nowcast` - TAF-like textual form of the `nowcast` data)\n- `taf` may have `\"value_type\": \"above\"` under `surface_visibility`, `nowcast` does not need that because it can report values above 10000 m (which TAF does not)\n"
          }
        }
      },
      "point_response": {
        "type": "array",
        "description": "Response of point POST request",
        "items": {
          "type": "object",
          "properties": {
            "latitude": {
              "type": "number",
              "format": "float"
            },
            "longitude": {
              "type": "number",
              "format": "float"
            },
            "time": {
              "type": "string",
              "format": "ISO8601 time stamp or `now` or `now-plus-<time duration>`",
              "example": "2023-05-21T15:20:00Z"
            },
            "vertical": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "example": "flight_level"
                },
                "quantity": {
                  "$ref": "#/components/schemas/general_quantity"
                }
              }
            },
            "quantity": {
              "$ref": "#/components/schemas/general_quantity"
            }
          }
        }
      },
      "point_request_body": {
        "type": "object",
        "description": "Body of point POST request",
        "required": [
          "weather",
          "latitude",
          "longitude"
        ],
        "properties": {
          "weather": {
            "type": "string",
            "enum": [
              "precipitation-probability",
              "convective-precipitation-rate",
              "precipitation-rate",
              "reflectivity",
              "precipitation-type",
              "cloud-cover",
              "cloud-cover-error",
              "cloud-mask-error",
              "cloud-top-amsl",
              "cloud-lowest-top-amsl",
              "cloud-ceiling-agl",
              "visibility-sfc",
              "turbulence",
              "icing-severity",
              "weather-type",
              "air-pressure-qnh",
              "air-temperature-2m-agl",
              "dew-point-temperature-2m-agl",
              "wind-gust-10m-agl",
              "wind-u-10m-agl",
              "wind-v-10m-agl",
              "wind-u-80m-agl",
              "wind-v-80m-agl",
              "wind-u",
              "wind-v",
              "k-index",
              "precipitation-arrival",
              "global-horizontal-irradiance"
            ],
            "example": "cloud-ceiling-agl"
          },
          "latitude": {
            "type": "array",
            "example": [
              49.34234,
              32.3457,
              51.36777
            ],
            "items": {
              "type": "number",
              "format": "double"
            }
          },
          "longitude": {
            "type": "array",
            "example": [
              0.34546,
              5.45756,
              -34.565678
            ],
            "items": {
              "type": "number",
              "format": "double"
            }
          },
          "vertical": {
            "type": "array",
            "example": [
              0,
              40,
              60,
              150
            ],
            "items": {
              "type": "number",
              "format": "double"
            }
          },
          "time": {
            "type": "array",
            "description": "List of time stamps, either in ISO8601 or relative to now denoted as `now-plus-<time duration>`.\nA time duration is denoted as `<float><unit>` with `<unit>` being `m` (minutes) or `h` (hours).\nNote that ISO8601 time stamps are without milliseconds and `Z` is the only allowed timezone specifier\n(with `Z` denoting UTC).\nAlso note that `now-plus-0m` can be written as `now`.\nAll requested time stamps have to be in future or now.\n",
            "example": [
              "2023-05-21T15:20:00Z",
              "now",
              "now-plus-1h"
            ],
            "items": {
              "object": {
                "type": "string",
                "format": "ISO8601 time stamp or `now` or `now-plus-<time duration>`",
                "example": "2023-05-21T15:20:00Z"
              }
            }
          },
          "round_decimals": {
            "type": "integer",
            "description": "Number of decimal places to round to; if negative, it specifies places left of the decimal point.",
            "example": 3
          }
        }
      },
      "auth_request_body": {
        "type": "object",
        "required": [
          "uid",
          "passwd"
        ],
        "description": "Credentials.",
        "properties": {
          "uid": {
            "type": "string",
            "example": "john_doe"
          },
          "passwd": {
            "type": "string",
            "example": "secretpassword"
          }
        }
      },
      "lat_lon_request_body": {
        "type": "object",
        "required": [
          "latitudes",
          "longitudes"
        ],
        "description": "Two list of the same length containing corresponding latitudes and longitudes.",
        "example": {
          "latitudes": [
            13.34454,
            27.95044346,
            4.3483563798
          ],
          "longitudes": [
            9.56357453,
            56.346793,
            12.85636678
          ]
        },
        "properties": {
          "latitudes": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            }
          },
          "longitudes": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            }
          }
        }
      },
      "icao_id_request_body": {
        "type": "object",
        "required": [
          "icao_ids"
        ],
        "description": "List of ICAO codes.",
        "example": [
          "KJFK",
          "EDDF",
          "LKPR"
        ],
        "properties": {
          "icao_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    },
    "parameters": {
      "icao_id": {
        "name": "icao_id",
        "in": "query",
        "required": false,
        "schema": {
          "$ref": "#/components/schemas/icao_id"
        },
        "examples": {
          "icao": {
            "value": "LKPR"
          },
          "aw-id": {
            "value": "AW-299506"
          }
        }
      },
      "icao_ids": {
        "name": "icao_ids",
        "in": "query",
        "required": false,
        "schema": {
          "$ref": "#/components/schemas/list_of_icao_id"
        },
        "examples": {
          "icao": {
            "value": "LKPR,KJFK,EDDF"
          }
        }
      },
      "strict_icao_id": {
        "name": "icao_id",
        "in": "query",
        "required": false,
        "schema": {
          "$ref": "#/components/schemas/strict_icao_id"
        },
        "example": "LKPR"
      },
      "strict_icao_ids": {
        "name": "icao_ids",
        "in": "query",
        "required": false,
        "schema": {
          "$ref": "#/components/schemas/list_of_strict_icao_id"
        },
        "example": "LKPR"
      },
      "latitudes": {
        "name": "latitudes",
        "in": "query",
        "required": false,
        "schema": {
          "$ref": "#/components/schemas/list_of_double"
        },
        "examples": {
          "single": {
            "value": "49.345634"
          },
          "three": {
            "value": "-3.45673,51.49237,17.7823"
          }
        }
      },
      "latitude": {
        "name": "latitude",
        "in": "query",
        "required": false,
        "schema": {
          "type": "number",
          "format": "double"
        },
        "examples": {
          "single": {
            "value": 49.345634
          }
        }
      },
      "longitudes": {
        "name": "longitudes",
        "in": "query",
        "required": false,
        "schema": {
          "$ref": "#/components/schemas/list_of_double"
        },
        "examples": {
          "single": {
            "value": "23.53472"
          },
          "three": {
            "value": "0.3453,-21.57230734,31.23"
          }
        }
      },
      "longitude": {
        "name": "longitude",
        "in": "query",
        "required": false,
        "schema": {
          "type": "number",
          "format": "double"
        },
        "examples": {
          "single": {
            "value": 23.53472
          }
        }
      },
      "min_lat": {
        "name": "min_lat",
        "in": "query",
        "required": false,
        "schema": {
          "type": "number",
          "format": "double"
        },
        "examples": {
          "single": {
            "value": 45.75673
          }
        }
      },
      "min_lon": {
        "name": "min_lon",
        "in": "query",
        "required": false,
        "schema": {
          "type": "number",
          "format": "double"
        },
        "examples": {
          "single": {
            "value": 4.56324
          }
        }
      },
      "max_lat": {
        "name": "max_lat",
        "in": "query",
        "required": false,
        "schema": {
          "type": "number",
          "format": "double"
        },
        "examples": {
          "single": {
            "value": 50.3365
          }
        }
      },
      "max_lon": {
        "name": "max_lon",
        "in": "query",
        "required": false,
        "schema": {
          "type": "number",
          "format": "double"
        },
        "examples": {
          "single": {
            "value": 9.8634267
          }
        }
      }
    }
  }
}