{
  "openapi": "3.1.0",
  "info": {
    "title": "BravoEcho API",
    "version": "1",
    "description": "Flight operations services on one account: RAIM prediction, NOTAMs, weather, airports and route strings, as JSON.\n\n- Keys belong to an organisation and are sent as `Authorization: Bearer <key>`; usage and the free allowance are counted per organisation, across all its keys.\n- JSON in, JSON out. Times are RFC 3339 in UTC.\n- Fields may be added at any time; renaming or removing one needs a new version.\n- Available services are counted toward the organisation's monthly allowance (1,000 requests free a month). Beta services are free and not counted. Every answer says which in `X-Product-Status` and `X-Metered`; each operation says it in `x-status`.\n- Server-side only: call the API from a backend, never from a browser, and keep the key in a secret.\n\nThe full prose reference, with the rules behind every answer, is at https://bravoecho.ai/llms-full.txt.",
    "contact": {
      "name": "BravoEcho",
      "email": "hello@bravoecho.ai",
      "url": "https://bravoecho.ai"
    }
  },
  "externalDocs": {
    "description": "Full prose reference",
    "url": "https://bravoecho.ai/llms-full.txt"
  },
  "servers": [
    {
      "url": "https://api.bravoecho.ai/v1"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "RAIM",
      "description": "Available: counted toward the monthly allowance. GNSS RAIM prediction (DO-229 FD and FDE) at points, along a flight, at one position over time and as a worldwide map, and the reference data behind it."
    },
    {
      "name": "NOTAMs",
      "description": "Beta: free and not counted; answers may change shape. The FAA NOTAM archive: search, NOTAMs along a flight, one NOTAM and its history, FAA locations."
    },
    {
      "name": "Airports and routes",
      "description": "Beta: free and not counted; answers may change shape. Airports, runways, frequencies and navaids from OurAirports, and route strings resolved with the FAA CIFP."
    },
    {
      "name": "Weather",
      "description": "Beta: free and not counted; answers may change shape. METAR, TAF, SIGMETs, G-AIRMETs and CWAs from aviationweather.gov, the weather along a flight, and the winds and temperatures aloft from the FB forecasts."
    },
    {
      "name": "Airspace",
      "description": "Beta: free and not counted; answers may change shape. The special use airspace, Class B, C and D airspace and TFRs a flight enters, United States only, from FAA data."
    },
    {
      "name": "Flight planning",
      "description": "Beta: free and not counted; answers may change shape. Computations on the aircraft data you send: mass and balance, and a navlog with the winds aloft. BravoEcho holds no aircraft data."
    },
    {
      "name": "Alerts",
      "description": "Beta; counted only when a check finds a change and calls your webhook, one request per watched part in its own service. Watches on a flight that call your webhook, signed, when its RAIM verdict, NOTAMs, weather hazards or airspace change."
    },
    {
      "name": "Platform",
      "description": "Available, never counted. Checking a key."
    }
  ],
  "paths": {
    "/ping": {
      "get": {
        "operationId": "ping",
        "tags": [
          "Platform"
        ],
        "summary": "Check a key",
        "description": "Answers when the key is valid, with the key's prefix and its organisation. Never counted.",
        "x-status": "available",
        "responses": {
          "200": {
            "description": "The key works.",
            "headers": {
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PingResponse"
                },
                "example": {
                  "ok": true,
                  "key": "12|be_live_a1b2c3",
                  "organization": "test-airline",
                  "time": "2026-10-08T09:00:00+00:00"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/raim/predict": {
      "post": {
        "operationId": "raimPredict",
        "tags": [
          "RAIM"
        ],
        "summary": "Predict RAIM at points",
        "description": "Predicts GNSS RAIM availability at each point, for a window around each point's time, using the GPS (and optionally Galileo) almanac and the satellite outages in force (NANUs and NAGUs). DO-229 fault detection (FD) and fault detection and exclusion (FDE). FD is available when the horizontal protection level (HPL) is at or under the alert limit (HAL) with at least 5 satellites; FDE also needs 6 and that every single-satellite-removed subset still detects. A past window is computed against the archived almanac and the NANUs of that day; more than 30 days from the almanac is refused with 503. One request whatever the number of points.",
        "x-status": "available",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RaimPredictRequest"
              },
              "examples": {
                "three_points": {
                  "summary": "Three points, one with its own HAL",
                  "value": {
                    "window_minutes": 60,
                    "step_seconds": 60,
                    "mask_deg": 5,
                    "fde": true,
                    "baro": false,
                    "detail": false,
                    "points": [
                      {
                        "id": "EGLL",
                        "lat": 51.4775,
                        "lon": -0.4614,
                        "alt_m": 25,
                        "time": "2026-09-18T06:00:00Z",
                        "phase": "enroute"
                      },
                      {
                        "id": "EHAM",
                        "lat": 52.3086,
                        "lon": 4.7639,
                        "alt_m": 0,
                        "time": "2026-09-18T07:15:00Z",
                        "phase": "approach"
                      },
                      {
                        "id": "WPT1",
                        "lat": 52.0,
                        "lon": 2.5,
                        "alt_m": 11000,
                        "time": "2026-09-18T06:40:00Z",
                        "hal_nm": 2.0
                      }
                    ]
                  }
                },
                "minimal": {
                  "summary": "One point",
                  "value": {
                    "points": [
                      {
                        "id": "EHAM",
                        "lat": 52.3086,
                        "lon": 4.7639,
                        "time": "2026-09-18T07:15:00Z",
                        "phase": "approach"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The prediction. Show `warnings` to the user; `degraded: true` means a warning affects trust in the numbers.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RaimPredictResponse"
                },
                "example": {
                  "almanac": {
                    "version": "2436-61440",
                    "toa": "2026-09-13T17:03:42Z",
                    "source": "navcen",
                    "satellites": 32,
                    "healthy": 31
                  },
                  "params": {
                    "window_minutes": 60,
                    "step_seconds": 60,
                    "mask_deg": 5,
                    "fde": true,
                    "baro": false,
                    "min_sats_fd": 5,
                    "min_sats_fde": 6,
                    "profile": "do229",
                    "min_outage_minutes": 0,
                    "constellations": [
                      "gps"
                    ]
                  },
                  "outages_applied": [
                    {
                      "prn": 1,
                      "from": "2026-09-18T03:00:00Z",
                      "to": "2026-09-18T15:00:00Z",
                      "source": "NANU 2026073 FCSTDV"
                    }
                  ],
                  "dispatch": {
                    "ok": false,
                    "min_outage_minutes": 0,
                    "longest_outage_s": 840,
                    "short_outages": 0
                  },
                  "points": [
                    {
                      "id": "EHAM",
                      "hal_nm": 0.3,
                      "hal_m": 555.6,
                      "start": "2026-09-18T06:15:00Z",
                      "end": "2026-09-18T08:15:00Z",
                      "available_now": false,
                      "epochs": 121,
                      "epochs_available": 107,
                      "availability_pct": 88.4,
                      "outages": [
                        {
                          "from": "2026-09-18T07:10:00Z",
                          "to": "2026-09-18T07:24:00Z",
                          "duration_s": 840,
                          "reason": "hpl_exceeds_hal",
                          "max_hpl_m": 612.0
                        }
                      ],
                      "dispatch": {
                        "ok": false,
                        "min_outage_minutes": 0,
                        "longest_outage_s": 840,
                        "short_outages": 0
                      },
                      "worst": {
                        "hpl_nm": 0.33,
                        "hpl_m": 612.0,
                        "at": "2026-09-18T07:17:00Z",
                        "sats": 6
                      },
                      "min_sats": 6
                    }
                  ],
                  "warnings": [],
                  "degraded": false,
                  "compute_ms": 4.3,
                  "generated_at": "2026-09-18T06:02:11Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/UnknownField"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "422": {
            "$ref": "#/components/responses/RaimValidation"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/RaimUnavailable"
          }
        }
      }
    },
    "/raim/trajectory": {
      "post": {
        "operationId": "raimTrajectory",
        "tags": [
          "RAIM"
        ],
        "summary": "RAIM at one position over time",
        "description": "One position over up to 72 hours (the length of an AUGUR scenario), with the satellite geometry (`passes[]` with azimuth, elevation and status per epoch) for plotting. Takes the same tuning fields as predict.",
        "x-status": "available",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RaimTrajectoryRequest"
              },
              "example": {
                "lat": 48.1103,
                "lon": 16.5697,
                "alt_m": 183,
                "start": "2026-09-24T00:00:00Z",
                "hours": 24,
                "phase": "approach"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Per-epoch arrays, the satellite passes and a summary.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RaimTrajectoryResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/UnknownField"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "422": {
            "$ref": "#/components/responses/RaimValidation"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/RaimUnavailable"
          }
        }
      }
    },
    "/raim/route": {
      "post": {
        "operationId": "raimRoute",
        "tags": [
          "RAIM"
        ],
        "summary": "RAIM along a flight",
        "description": "A flight plan flown along great-circle legs, RAIM evaluated at the aircraft's position and time at every step. The flight is the flight object: waypoints, or a route string with `departure`, `speed_kt` and a cruise level. With waypoints, `phase` or `hal_nm` applies from a waypoint onwards (the first must have one) and a leg is flown against the smaller HAL of its two ends. `window_minutes` checks a departure that may slip by up to that many minutes either way: the answer adds `window` with the slack, the clean and blocked departures, and each fix's own window. Every answer leads with `summary`. The flight must be timed: a time on the first waypoint or `departure`, then times or `speed_kt`.",
        "x-status": "available",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RaimRouteRequest"
              },
              "examples": {
                "waypoints": {
                  "summary": "Waypoints with a departure and speed",
                  "value": {
                    "departure": "2026-09-18T08:00:00Z",
                    "speed_kt": 450,
                    "profile": "faa-c129",
                    "waypoints": [
                      {
                        "id": "LOWW",
                        "lat": 48.1103,
                        "lon": 16.5697,
                        "alt_m": 183,
                        "phase": "terminal"
                      },
                      {
                        "id": "TOC",
                        "lat": 48.9,
                        "lon": 12.5,
                        "alt_m": 11000,
                        "phase": "enroute"
                      },
                      {
                        "id": "EGLL",
                        "lat": 51.4706,
                        "lon": -0.4619,
                        "alt_m": 25,
                        "phase": "approach"
                      }
                    ]
                  }
                },
                "route_string": {
                  "summary": "The route as filed",
                  "value": {
                    "route": "KMSP DWN6.ABR J158 RAP MBW MTU J148 OAL.MOD5 KSFO",
                    "departure": "2026-09-23T18:00:00Z",
                    "speed_kt": 450,
                    "cruise_alt_m": 10700,
                    "phase": "enroute",
                    "profile": "faa-c129"
                  }
                },
                "departure_window": {
                  "summary": "A timed track, departure slipping up to two hours",
                  "value": {
                    "profile": "faa-c129",
                    "window_minutes": 120,
                    "waypoints": [
                      {
                        "id": "KSFO",
                        "lat": 37.6188,
                        "lon": -122.375,
                        "alt_m": 4,
                        "time": "2026-09-24T12:00:00Z",
                        "hal_nm": 0.1
                      },
                      {
                        "id": "CLB",
                        "lat": 37.74,
                        "lon": -121.98,
                        "alt_m": 1800,
                        "time": "2026-09-24T12:05:00Z",
                        "hal_nm": 0.3
                      },
                      {
                        "id": "TOC",
                        "lat": 38.15,
                        "lon": -120.4,
                        "alt_m": 10700,
                        "time": "2026-09-24T12:20:00Z",
                        "hal_nm": 2.0
                      },
                      {
                        "id": "TOD",
                        "lat": 40.9,
                        "lon": -75.9,
                        "alt_m": 10700,
                        "time": "2026-09-24T17:02:00Z",
                        "hal_nm": 1.0
                      },
                      {
                        "id": "FAF",
                        "lat": 40.67,
                        "lon": -73.9,
                        "alt_m": 600,
                        "time": "2026-09-24T17:17:00Z",
                        "hal_nm": 0.1
                      },
                      {
                        "id": "KJFK",
                        "lat": 40.6398,
                        "lon": -73.7789,
                        "alt_m": 4,
                        "time": "2026-09-24T17:20:00Z"
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The verdict along the route.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RaimRouteResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FlightBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "422": {
            "$ref": "#/components/responses/FlightUnprocessable"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/RaimUnavailable"
          }
        }
      }
    },
    "/raim/map": {
      "post": {
        "operationId": "raimMap",
        "tags": [
          "RAIM"
        ],
        "summary": "Worldwide RAIM unavailability map",
        "description": "Unavailability minutes on a lat/lon grid for a UTC day and HAL: the FAA \"24-hour worldwide RAIM unavailability\" product on demand. The map counts every unavailable minute per cell, as the FAA plot does; the profile's dispatch rule applies only when `min_outage_minutes` is sent. To match the FAA plot use `profile: \"faa-c129\"`, `step_seconds: 60`, `hal_nm: 0.1` or `0.3`. Maps are kept for an hour; `Cache-Control: no-cache` recomputes. Besides the key's rate limit, each organisation may ask for 10 maps a minute; past that, 429 `rate_limited` with `Retry-After`.",
        "x-status": "available",
        "parameters": [
          {
            "name": "Cache-Control",
            "in": "header",
            "required": false,
            "description": "`no-cache` recomputes instead of serving the cached map.",
            "schema": {
              "type": "string",
              "enum": [
                "no-cache"
              ]
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RaimMapRequest"
              },
              "example": {
                "start": "2026-09-24T00:00:00Z",
                "hours": 24,
                "grid_deg": 2,
                "profile": "faa-c129",
                "step_seconds": 60,
                "hal_nm": 0.3
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The grid and its coverage.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-Cache": {
                "$ref": "#/components/headers/X-Cache"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RaimMapResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/UnknownField"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "422": {
            "$ref": "#/components/responses/RaimValidation"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/RaimUnavailable"
          }
        }
      }
    },
    "/raim/almanac": {
      "get": {
        "operationId": "raimAlmanac",
        "tags": [
          "RAIM"
        ],
        "summary": "Almanac status",
        "description": "GPS and Galileo almanac status, with the NANU and NAGU sets in force.",
        "x-status": "available",
        "responses": {
          "200": {
            "description": "The almanac status.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RaimAlmanacStatus"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "description": "No almanac loaded yet (the status with `loaded: false`), or the RAIM service is down (`upstream_unavailable`).",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/RaimAlmanacStatus"
                    },
                    {
                      "$ref": "#/components/schemas/Error"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/raim/phases": {
      "get": {
        "operationId": "raimPhases",
        "tags": [
          "RAIM"
        ],
        "summary": "Flight phases and their alert limits",
        "description": "The phase names `phase` takes and the HAL each stands for.",
        "x-status": "available",
        "responses": {
          "200": {
            "description": "The phases.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RaimPhaseList"
                },
                "example": {
                  "phases": [
                    {
                      "name": "oceanic",
                      "hal_nm": 4.0,
                      "hal_m": 7408,
                      "note": "Oceanic / remote en route, 4.0 NM"
                    },
                    {
                      "name": "enroute",
                      "hal_nm": 2.0,
                      "hal_m": 3704,
                      "note": "En route, 2.0 NM (DO-229)"
                    },
                    {
                      "name": "terminal",
                      "hal_nm": 1.0,
                      "hal_m": 1852,
                      "note": "Terminal, 1.0 NM (DO-229)"
                    },
                    {
                      "name": "approach",
                      "hal_nm": 0.3,
                      "hal_m": 555.6,
                      "note": "Non-precision approach / LNAV, 0.3 NM (DO-229)"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/raim/nanu": {
      "get": {
        "operationId": "raimNanu",
        "tags": [
          "RAIM"
        ],
        "summary": "GPS NANUs",
        "description": "The GPS NANUs considered and the satellite outage windows in force. They are ingested continuously and applied to every prediction.",
        "x-status": "available",
        "responses": {
          "200": {
            "description": "The NANU set.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RaimNanuStatus"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "description": "The NANU set is not loaded yet (the status with `loaded: false`), or the RAIM service is down (`upstream_unavailable`).",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/RaimNanuStatus"
                    },
                    {
                      "$ref": "#/components/schemas/Error"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/raim/nagu": {
      "get": {
        "operationId": "raimNagu",
        "tags": [
          "RAIM"
        ],
        "summary": "Galileo NAGUs",
        "description": "The Galileo NAGUs considered and the outage windows in force, applied when `constellations` includes Galileo.",
        "x-status": "available",
        "responses": {
          "200": {
            "description": "The NAGU set.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RaimNaguStatus"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "description": "The NAGU set is not loaded yet (the status with `loaded: false`), or the RAIM service is down (`upstream_unavailable`).",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/RaimNaguStatus"
                    },
                    {
                      "$ref": "#/components/schemas/Error"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/raim/profiles": {
      "get": {
        "operationId": "raimProfiles",
        "tags": [
          "RAIM"
        ],
        "summary": "Parameter profiles",
        "description": "The named parameter sets `profile` takes: each profile's name and what it does.",
        "x-status": "available",
        "responses": {
          "200": {
            "description": "The profiles, sorted by name.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RaimProfileInfo"
                  }
                },
                "example": [
                  {
                    "name": "augur",
                    "mask_deg": 5,
                    "fde": false,
                    "step_seconds": 60,
                    "min_outage_minutes": 5,
                    "note": "Matches Eurocontrol AUGUR: its false alert budget, FD, 5 deg, 1 min step, its error and baro models as identified from its own output, 5 min dispatch rule measured as AUGUR prints outages."
                  },
                  {
                    "name": "do229",
                    "mask_deg": null,
                    "fde": null,
                    "step_seconds": null,
                    "min_outage_minutes": 0,
                    "note": "RTCA DO-229 baseline: the standard false alert and missed detection budget, FDE, service error model."
                  },
                  {
                    "name": "faa-c129",
                    "mask_deg": 5,
                    "fde": false,
                    "step_seconds": 60,
                    "min_outage_minutes": 5,
                    "note": "Matches the FAA RAIM SAPT / TSO-C129 prediction: DO-208 false alert budget, FD only, 5 deg, 1 min step, error model calibrated on the FAA daily plot, outages under 5 continuous minutes not reported."
                  },
                  {
                    "name": "faa-c129-sa",
                    "mask_deg": 5,
                    "fde": false,
                    "step_seconds": 60,
                    "min_outage_minutes": 5,
                    "note": "As faa-c129 for the TSO-C129 SA-on receiver class."
                  }
                ]
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/notams": {
      "get": {
        "operationId": "notamsSearch",
        "tags": [
          "NOTAMs"
        ],
        "summary": "Search NOTAMs",
        "description": "The NOTAM archive: every NOTAM the FAA NOTAM Management Service distributes (US domestic, FDC, military and the international feed, worldwide), collected since 2026-08-12 and kept as append-only versions. Newest first. At least one filter is required: `location`, `fir`, `bbox`, `lat`/`lon`/`radius_nm`, `q`, `number`, `classification` or `category`. Read `meta.gaps` before trusting history.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "location",
            "in": "query",
            "description": "Domestic or ICAO identifiers; either form matches. Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "style": "form",
            "explode": false,
            "example": [
              "KJFK",
              "EGLL"
            ]
          },
          {
            "name": "fir",
            "in": "query",
            "description": "FIR identifiers. Matches NOTAMs affecting the FIR or addressed to it. Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "style": "form",
            "explode": false,
            "example": [
              "EGTT",
              "KZNY"
            ]
          },
          {
            "name": "bbox",
            "in": "query",
            "description": "`west,south,east,north` in degrees, west less than east.",
            "schema": {
              "type": "array",
              "items": {
                "type": "number"
              },
              "minItems": 4,
              "maxItems": 4
            },
            "style": "form",
            "explode": false,
            "example": [
              -1.0,
              51.0,
              0.5,
              52.0
            ]
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the centre; with `lon` and `radius_nm`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "in": "query",
            "description": "Longitude of the centre.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_nm",
            "in": "query",
            "description": "Radius around `lat`/`lon`, up to 1000 NM.",
            "schema": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 1000
            }
          },
          {
            "name": "classification",
            "in": "query",
            "description": "`DOM`, `INTL`, `MIL`, `FDC`, `LMIL`. Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "category",
            "in": "query",
            "description": "Our grouping of the Q-code; `GET /notams/categories` lists them. Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "runway",
                  "taxiway",
                  "aerodrome",
                  "lighting",
                  "obstacle",
                  "navaid",
                  "airspace",
                  "warning",
                  "procedure",
                  "service",
                  "other"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "number",
            "in": "query",
            "description": "Exact NOTAM number.",
            "schema": {
              "type": "string"
            },
            "example": "A1045/26"
          },
          {
            "name": "q",
            "in": "query",
            "description": "Substring over text, number and locations.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "In-force window start. NOTAMs effective at any point of the window match, reaching back into expired ones.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "In-force window end.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "active",
            "in": "query",
            "description": "`true`: the FAA's live set (distributed, not necessarily in force yet; use a window for \"in force now\"). `false` includes cancelled and expired.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "as_of",
            "in": "query",
            "description": "Replay the archive as it was known at that instant.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "include",
            "in": "query",
            "description": "`geometry` (the FAA's own GeoJSON), `area` (the affected area: FAA polygon, else read out of the text, else the radius circle), `raw` (ICAO and domestic renderings). Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "geometry",
                  "area",
                  "raw"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "collapse",
            "in": "query",
            "description": "One entry for the same notice issued under two numbers, with `also_issued_as`.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "`meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Page size, up to 500.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching NOTAMs and the archive's caveats.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotamSearchResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/UnknownParameter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/notams/route": {
      "post": {
        "operationId": "notamsRoute",
        "tags": [
          "NOTAMs"
        ],
        "summary": "NOTAMs along a flight",
        "description": "NOTAMs along a flight. The flight is the flight object: waypoints or a route string; the NOTAM service reads each point's position, name and `codes`. The corridor is the great-circle line buffered sideways plus a circle around each waypoint; NOTAMs match by area, by aerodrome code and through the FIRs the corridor touches, and each carries its `placement`. The window is `from` and `to` when either is given, else the flight's own window when it is timed, else the live set; `meta.window` says which. The answer leads with `summary`.",
        "x-status": "beta",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotamRouteRequest"
              },
              "examples": {
                "route_string": {
                  "summary": "A route string with the corridor options",
                  "value": {
                    "route": "LDZA DCT 4448N01552E DCT LDSP",
                    "departure": "2026-09-24T07:00:00Z",
                    "speed_kt": 250,
                    "half_width_nm": 5,
                    "terminal_radius_nm": 10,
                    "fl_from": 100,
                    "fl_to": 350,
                    "classifications": [],
                    "categories": [],
                    "q": "",
                    "include_area": false,
                    "include_geometry": false,
                    "include_raw": false,
                    "collapse": true,
                    "limit": 500
                  }
                },
                "waypoints": {
                  "summary": "Waypoints",
                  "value": {
                    "waypoints": [
                      {
                        "id": "KJFK",
                        "lat": 40.6398,
                        "lon": -73.7789,
                        "alt_ft": 13,
                        "codes": [
                          "KJFK"
                        ],
                        "phase": "terminal"
                      },
                      {
                        "id": "TOC",
                        "lat": 41.3,
                        "lon": -70.0,
                        "fl": 350,
                        "phase": "enroute"
                      },
                      {
                        "id": "4460N",
                        "lat": 44.0,
                        "lon": -60.0,
                        "fl": 350,
                        "phase": "oceanic"
                      },
                      {
                        "lat": 50.0,
                        "lon": -40.0,
                        "fl": 350
                      },
                      {
                        "lat": 52.0,
                        "lon": -20.0,
                        "fl": 370
                      },
                      {
                        "id": "TOD",
                        "lat": 51.6,
                        "lon": -3.5,
                        "fl": 370,
                        "phase": "enroute"
                      },
                      {
                        "id": "EGLL",
                        "lat": 51.4706,
                        "lon": -0.4619,
                        "alt_ft": 83,
                        "codes": [
                          "EGLL"
                        ],
                        "phase": "approach"
                      }
                    ],
                    "departure": "2026-09-24T08:00:00Z",
                    "speed_kt": 480
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The NOTAMs along the route, the archive's caveats and, for a route string, `resolved_route`.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotamRouteResponse"
                },
                "example": {
                  "summary": "1 NOTAM along the route, in force 24 Sep 07:00Z to 07:32Z: 1 crossing the corridor, 0 abeam, 0 at the route's aerodromes, 0 FIR-wide.",
                  "notams": [
                    {
                      "number": "A3710/26",
                      "icao_location": "LQSB",
                      "category": "airspace",
                      "title": "Danger area activated",
                      "placement": "crosses",
                      "chainage_nm": 55.76438613588303,
                      "span_end_nm": 57.76362309611289
                    }
                  ],
                  "meta": {
                    "window": {
                      "from": "2026-09-24T07:00:00Z",
                      "to": "2026-09-24T07:32:27Z",
                      "semantic": "in_force"
                    },
                    "route": {
                      "length_nm": 135.2,
                      "firs": [
                        "LQSB"
                      ],
                      "fir_section": "matched_by_affected_fir"
                    }
                  },
                  "resolved_route": {
                    "route": "LDZA 4448N01552E LDSP",
                    "notes": []
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FlightBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/FlightUnprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/notams/categories": {
      "get": {
        "operationId": "notamsCategories",
        "tags": [
          "NOTAMs"
        ],
        "summary": "NOTAM categories",
        "description": "The category slugs `category` and `categories` take.",
        "x-status": "beta",
        "responses": {
          "200": {
            "description": "The categories.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotamCategories"
                },
                "example": {
                  "categories": [
                    "runway",
                    "taxiway",
                    "aerodrome",
                    "lighting",
                    "obstacle",
                    "navaid",
                    "airspace",
                    "warning",
                    "procedure",
                    "service",
                    "other"
                  ]
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/notams/{nmsId}": {
      "get": {
        "operationId": "notamsGet",
        "tags": [
          "NOTAMs"
        ],
        "summary": "One NOTAM",
        "description": "Everything held about one NOTAM: the search fields plus the raw renderings as received, the decoded schedule (display only), the text-derived geometry and provenance.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "nmsId",
            "in": "path",
            "required": true,
            "description": "The 16-digit FAA NOTAM identifier (`nms_id`).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{16}$"
            },
            "example": "1234567890123456"
          }
        ],
        "responses": {
          "200": {
            "description": "The NOTAM.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotamDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/notams/{nmsId}/history": {
      "get": {
        "operationId": "notamsHistory",
        "tags": [
          "NOTAMs"
        ],
        "summary": "A NOTAM's history",
        "description": "Every observed version of one NOTAM, oldest first, with the fields that changed from the previous one.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "nmsId",
            "in": "path",
            "required": true,
            "description": "The 16-digit FAA NOTAM identifier (`nms_id`).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{16}$"
            },
            "example": "1234567890123456"
          }
        ],
        "responses": {
          "200": {
            "description": "The versions.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotamHistory"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/locations/{id}": {
      "get": {
        "operationId": "notamsLocation",
        "tags": [
          "NOTAMs"
        ],
        "summary": "A NOTAM location",
        "description": "The FAA location reference row for a domestic or ICAO identifier.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "A domestic or ICAO location identifier, 2 to 8 letters and digits.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{2,8}$"
            },
            "example": "KJFK"
          }
        ],
        "responses": {
          "200": {
            "description": "The location.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Location"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/airports": {
      "get": {
        "operationId": "airportsSearch",
        "tags": [
          "Airports and routes"
        ],
        "summary": "Search airports",
        "description": "Airports from OurAirports (public domain, refreshed nightly). At least one of `q`, `country`, `region`, or `lat` and `lon`. Sorted by size then name; a position search adds `distance_nm` and sorts by distance.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Code, name or municipality.",
            "schema": {
              "type": "string",
              "maxLength": 80
            }
          },
          {
            "name": "country",
            "in": "query",
            "description": "ISO 3166-1 alpha-2.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 2
            }
          },
          {
            "name": "region",
            "in": "query",
            "description": "ISO 3166-2.",
            "schema": {
              "type": "string",
              "maxLength": 12
            }
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the centre; needs `lon`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "in": "query",
            "description": "Longitude of the centre; needs `lat`.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_nm",
            "in": "query",
            "description": "Radius around `lat`/`lon`.",
            "schema": {
              "type": "number",
              "minimum": 0.1,
              "maximum": 500,
              "default": 50
            }
          },
          {
            "name": "type[]",
            "in": "query",
            "description": "Airport types; repeat the parameter for several.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "large_airport",
                  "medium_airport",
                  "small_airport",
                  "heliport",
                  "seaplane_base",
                  "balloonport",
                  "closed"
                ]
              }
            },
            "style": "form",
            "explode": true
          },
          {
            "name": "scheduled",
            "in": "query",
            "description": "1: with scheduled service only; 0: without. `true` and `false` are refused with 422.",
            "schema": {
              "type": "integer",
              "enum": [
                0,
                1
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Up to 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching airports, without runways and frequencies.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AirportSearchResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/AirportBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/LaravelValidation"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/airports/status": {
      "get": {
        "operationId": "airportsStatus",
        "tags": [
          "Airports and routes"
        ],
        "summary": "Reference data status",
        "description": "Each reference dataset with its row count and when it was synced, and the AIRAC cycles loaded that are in force today or later.",
        "x-status": "beta",
        "responses": {
          "200": {
            "description": "The datasets and navigation data cycles.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AirportsStatusResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/airports/{code}": {
      "get": {
        "operationId": "airportsGet",
        "tags": [
          "Airports and routes"
        ],
        "summary": "One airport",
        "description": "One airport by ICAO, IATA, GPS or local code (resolved in that order; `VIE` and `LOWW` are the same row), with its runways and COM frequencies.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "description": "ICAO, IATA, GPS or local code.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9-]{2,8}$"
            },
            "example": "LOWW"
          }
        ],
        "responses": {
          "200": {
            "description": "The airport.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AirportDetail"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/AirportCodeBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/navaids": {
      "get": {
        "operationId": "navaidsSearch",
        "tags": [
          "Airports and routes"
        ],
        "summary": "Search navaids",
        "description": "Navaids from OurAirports. At least one of `ident`, `airport`, or `lat` and `lon`.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "ident",
            "in": "query",
            "description": "Navaid identifier.",
            "schema": {
              "type": "string",
              "maxLength": 8
            }
          },
          {
            "name": "type",
            "in": "query",
            "description": "`VOR`, `VOR-DME`, `VORTAC`, `DME`, `NDB`, `NDB-DME`, `TACAN`.",
            "schema": {
              "type": "string",
              "maxLength": 16
            }
          },
          {
            "name": "airport",
            "in": "query",
            "description": "The associated aerodrome code.",
            "schema": {
              "type": "string",
              "maxLength": 8
            }
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the centre; needs `lon`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "in": "query",
            "description": "Longitude of the centre; needs `lat`.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_nm",
            "in": "query",
            "description": "Radius around `lat`/`lon`.",
            "schema": {
              "type": "number",
              "minimum": 0.1,
              "maximum": 500,
              "default": 50
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Up to 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 25
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching navaids.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NavaidSearchResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/NavaidBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/LaravelValidation"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/routes/resolve": {
      "get": {
        "operationId": "routesResolve",
        "tags": [
          "Airports and routes"
        ],
        "summary": "Resolve a route string",
        "description": "The points a route string stands for, exactly as `POST /raim/route` would fly it, with a note for every simplification. Airports and navaids from OurAirports (worldwide); named fixes, airways and SIDs/STARs from the FAA CIFP (US airspace) for the AIRAC cycle in force at `at`. An airway or procedure outside the US data is flown direct, with a note; a point that cannot be placed is 422 `route_unresolved`, never a guess.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "route",
            "in": "query",
            "description": "The route as filed.",
            "schema": {
              "type": "string",
              "maxLength": 2000
            },
            "required": true,
            "example": "KMSP DWN6.ABR J158 RAP MBW MTU J148 OAL.MOD5 KSFO"
          },
          {
            "name": "at",
            "in": "query",
            "description": "Picks the AIRAC cycle; default now.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The resolved route.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RouteResolution"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/RouteUnresolved"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/weather/metar": {
      "get": {
        "operationId": "weatherMetar",
        "tags": [
          "Weather"
        ],
        "summary": "METARs",
        "description": "METARs from aviationweather.gov, collected since 2026-09-24 and kept as received. Without a time, the latest report now; with `at`, the latest observed at or before it; with `from` and `to`, every report in the window (up to 31 days). Every answer carries `meta`: what it describes and how far to trust it.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "description": "ICAO identifiers, up to 50; IATA and FAA codes are read through the station list (`JFK` as `KJFK`, said in `meta.resolved`). Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "minItems": 1,
              "maxItems": 50
            },
            "style": "form",
            "explode": false,
            "example": [
              "KJFK",
              "EGLL"
            ],
            "required": true
          },
          {
            "name": "at",
            "in": "query",
            "description": "The latest observed at or before it. Not with `from`/`to`.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "History window start; needs `to`.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "History window end; at most 31 days after `from`.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "as_of",
            "in": "query",
            "description": "Only what was known at that instant; not in the future (400).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The reports.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MetarResponse"
                },
                "example": {
                  "metars": [
                    {
                      "station": "EGLL",
                      "name": "London/Heathrow Intl",
                      "lat": 51.477,
                      "lon": -0.461,
                      "elevation_m": 26,
                      "observed_at": "2026-09-24T06:20:00Z",
                      "report_type": "METAR",
                      "raw": "METAR EGLL 240620Z AUTO 05001KT 9999 NCD 11/09 Q1026",
                      "flight_category": "VFR",
                      "wind": {
                        "direction_deg": 50,
                        "variable": false,
                        "speed_kt": 1,
                        "gust_kt": null
                      },
                      "visibility": {
                        "statute_mi": 6,
                        "or_more": true
                      },
                      "ceiling_ft_agl": null,
                      "vertical_visibility_ft": null,
                      "sky": [
                        {
                          "cover": "CLR"
                        }
                      ],
                      "temperature_c": 11,
                      "dewpoint_c": 9,
                      "altimeter_in_hg": 30.3,
                      "altimeter_hpa": 1026.1,
                      "weather": null,
                      "corrected": false,
                      "auto": true,
                      "versions": 1,
                      "first_seen_at": "2026-09-24T06:26:03.718225Z",
                      "age_minutes": 22.2
                    }
                  ],
                  "meta": {
                    "time": {
                      "semantic": "latest",
                      "at": "2026-09-24T06:59:33.941179938Z"
                    },
                    "as_of": {
                      "time": "2026-09-24T06:59:33.941179938Z",
                      "archive_start": "2026-09-24T00:04:15.773259Z",
                      "before_archive": false
                    },
                    "collection": {
                      "metar": {
                        "last_successful_poll": "2026-09-24T06:59:16.632769Z",
                        "age_s": 17,
                        "fresh": true
                      }
                    },
                    "gaps": {
                      "checked": {
                        "from": "2026-09-24T04:59:33.941179938Z",
                        "to": "2026-09-24T06:59:33.941179938Z"
                      },
                      "total": 0,
                      "recent": []
                    },
                    "resolved": {
                      "JFK": "KJFK"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/UnknownParameter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/weather/taf": {
      "get": {
        "operationId": "weatherTaf",
        "tags": [
          "Weather"
        ],
        "summary": "TAFs",
        "description": "Without `at`: per station the newest TAF issued, even one valid only from a later hour; `covers_time` says whether it is in force now. With `at`: the TAF in force then. A station with none is in `meta.missing`.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "description": "ICAO identifiers, up to 50; IATA and FAA codes are read through the station list (`JFK` as `KJFK`, said in `meta.resolved`). Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "minItems": 1,
              "maxItems": 50
            },
            "style": "form",
            "explode": false,
            "example": [
              "KJFK",
              "EGLL"
            ],
            "required": true
          },
          {
            "name": "at",
            "in": "query",
            "description": "The TAF in force then; in the future, the TAF issued by now that covers it.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "as_of",
            "in": "query",
            "description": "Only what was known at that instant; not in the future (400).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The TAFs.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TafResponse"
                },
                "example": {
                  "tafs": [
                    {
                      "station": "EGLL",
                      "issued_at": "2026-09-24T04:56:00Z",
                      "valid_from": "2026-09-24T06:00:00Z",
                      "valid_to": "2026-09-25T12:00:00Z",
                      "covers_time": true,
                      "raw": "TAF EGLL 240456Z 2406/2512 08005KT 9999 FEW030 PROB30 2406/2408 7000 BECMG 2411/2414 19010KT BECMG 2419/2422 VRB03KT TEMPO 2500/2506 7000 PROB30 TEMPO 2503/2508 3000 BR BKN004 TEMPO 2506/2510 7000 BKN006",
                      "periods": [
                        {
                          "from": "2026-09-24T06:00:00Z",
                          "to": "2026-09-24T11:00:00Z",
                          "change": null,
                          "wind": {
                            "direction_deg": 80,
                            "variable": false,
                            "speed_kt": 5,
                            "gust_kt": null
                          },
                          "visibility": {
                            "statute_mi": 6,
                            "or_more": true
                          },
                          "sky": [
                            {
                              "cover": "FEW",
                              "base_ft_agl": 3000
                            }
                          ],
                          "ceiling_ft_agl": null,
                          "flight_category": "VFR"
                        },
                        {
                          "from": "2026-09-24T11:00:00Z",
                          "to": "2026-09-24T19:00:00Z",
                          "change": "BECMG",
                          "becoming_at": "2026-09-24T14:00:00Z",
                          "wind": {
                            "direction_deg": 190,
                            "variable": false,
                            "speed_kt": 10,
                            "gust_kt": null
                          },
                          "visibility": {
                            "statute_mi": 6,
                            "or_more": true
                          },
                          "sky": [
                            {
                              "cover": "FEW",
                              "base_ft_agl": 3000
                            }
                          ],
                          "ceiling_ft_agl": null,
                          "flight_category": "VFR"
                        },
                        {
                          "from": "2026-09-25T03:00:00Z",
                          "to": "2026-09-25T08:00:00Z",
                          "change": "TEMPO",
                          "probability": 30,
                          "visibility": {
                            "statute_mi": 1.86,
                            "or_more": false
                          },
                          "sky": [
                            {
                              "cover": "BKN",
                              "base_ft_agl": 400
                            }
                          ],
                          "weather": "BR",
                          "ceiling_ft_agl": 400,
                          "flight_category": "LIFR"
                        }
                      ]
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/UnknownParameter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/weather/hazards": {
      "get": {
        "operationId": "weatherHazards",
        "tags": [
          "Weather"
        ],
        "summary": "SIGMETs, G-AIRMETs and CWAs",
        "description": "SIGMETs (international and US), G-AIRMETs and CWAs in force. Without an area the answer is worldwide. `meta.rules` states how hazards are matched.",
        "x-status": "beta",
        "parameters": [
          {
            "name": "bbox",
            "in": "query",
            "description": "`west,south,east,north` in degrees; west greater than east crosses the antimeridian.",
            "schema": {
              "type": "array",
              "items": {
                "type": "number"
              },
              "minItems": 4,
              "maxItems": 4
            },
            "style": "form",
            "explode": false,
            "example": [
              -1.0,
              51.0,
              0.5,
              52.0
            ]
          },
          {
            "name": "lat",
            "in": "query",
            "description": "Latitude of the centre; with `lon` and `radius_nm`.",
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "in": "query",
            "description": "Longitude of the centre.",
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "radius_nm",
            "in": "query",
            "description": "Radius around `lat`/`lon`, up to 2,000 NM.",
            "schema": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 2000
            }
          },
          {
            "name": "at",
            "in": "query",
            "description": "In force at an instant; default now.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "from",
            "in": "query",
            "description": "In force at any point of a window, up to 72 hours; needs `to`.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Window end.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "as_of",
            "in": "query",
            "description": "Only what was known at that instant; not in the future (400).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "fl_from",
            "in": "query",
            "description": "Flight level band; only a stated limit keeps a hazard out.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 999
            }
          },
          {
            "name": "fl_to",
            "in": "query",
            "description": "Flight level band top.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 999
            }
          },
          {
            "name": "types",
            "in": "query",
            "description": "`sigmet` stands for both SIGMET feeds. Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "sigmet",
                  "sigmet_intl",
                  "sigmet_us",
                  "gairmet",
                  "cwa"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "hazard",
            "in": "query",
            "description": "Source codes (`TS`, `TC`, `TURB-HI`, `ICE`, `IFR`, `LLWS`, ...). `FZLVL` returns the G-AIRMET freezing-level contours, otherwise left out. Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "include",
            "in": "query",
            "description": "`geometry` (GeoJSON), `raw` (the bulletin). Comma separated.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "geometry",
                  "raw"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "limit",
            "in": "query",
            "description": "`meta.truncated` says when there were more. Above 2,000 is read as the default.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2000,
              "default": 500
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The hazards.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HazardResponse"
                },
                "example": {
                  "hazards": [
                    {
                      "id": 29,
                      "product": "gairmet",
                      "ident": "G-AIRMET TANGO 1W TURB-HI +3h",
                      "hazard": "TURB-HI",
                      "title": "Moderate turbulence (high level)",
                      "severity": "MOD",
                      "issuer": "KKCI",
                      "series": "TANGO",
                      "issued_at": "2026-09-24T02:45:00Z",
                      "valid_from": "2026-09-24T04:30:00Z",
                      "valid_to": "2026-09-24T07:30:00Z",
                      "snapshot_at": "2026-09-24T06:00:00Z",
                      "package_expires_at": "2026-09-24T09:00:00Z",
                      "status": "NRML",
                      "band": {
                        "base_ft": 17000,
                        "base": "given",
                        "top_ft": 33000,
                        "top": "given",
                        "text": "17000 ft to FL330",
                        "matched_from_ft": 17000,
                        "matched_to_ft": 33000
                      },
                      "geometry_kind": "area",
                      "first_seen_at": "2026-09-24T06:06:29.198579Z"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/UnknownParameter"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/weather/route": {
      "post": {
        "operationId": "weatherRoute",
        "tags": [
          "Weather"
        ],
        "summary": "Weather along a flight",
        "description": "The weather along a flight in four dimensions: a hazard counts where the corridor meets it, while it is in force, and where the aircraft is within its band. The flight is the flight object; the service times it and levels it, and an unknown level never keeps a hazard off. The flight must be timed: waypoint times, or `departure` with `speed_kt`. Also the METAR and TAF at each aerodrome for the time the aircraft is there, and aircraft reports near the track. Limits: 2 to 200 waypoints, each leg under 9,000 NM, the route at most 13,000 NM and 36 hours. The answer leads with `summary`.",
        "x-status": "beta",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WeatherRouteRequest"
              },
              "examples": {
                "route_string": {
                  "summary": "A route string with a cruise level and an alternate",
                  "value": {
                    "route": "KMSP DWN6.ABR J158 RAP MBW MTU J148 OAL.MOD5 KSFO",
                    "departure": "2026-09-24T08:00:00Z",
                    "speed_kt": 450,
                    "cruise_fl": 350,
                    "alternates": [
                      "KOAK"
                    ]
                  }
                },
                "short_route": {
                  "summary": "The flight as filed",
                  "value": {
                    "route": "LDZA DCT 4448N01552E DCT LDSP",
                    "departure": "2026-09-24T07:00:00Z",
                    "speed_kt": 250,
                    "cruise_fl": 150
                  }
                },
                "waypoints": {
                  "summary": "Waypoints",
                  "value": {
                    "waypoints": [
                      {
                        "id": "KJFK",
                        "lat": 40.6398,
                        "lon": -73.7789,
                        "alt_ft": 13,
                        "codes": [
                          "KJFK"
                        ],
                        "phase": "terminal"
                      },
                      {
                        "id": "TOC",
                        "lat": 41.3,
                        "lon": -70.0,
                        "fl": 350,
                        "phase": "enroute"
                      },
                      {
                        "id": "4460N",
                        "lat": 44.0,
                        "lon": -60.0,
                        "fl": 350,
                        "phase": "oceanic"
                      },
                      {
                        "lat": 50.0,
                        "lon": -40.0,
                        "fl": 350
                      },
                      {
                        "lat": 52.0,
                        "lon": -20.0,
                        "fl": 370
                      },
                      {
                        "id": "TOD",
                        "lat": 51.6,
                        "lon": -3.5,
                        "fl": 370,
                        "phase": "enroute"
                      },
                      {
                        "id": "EGLL",
                        "lat": 51.4706,
                        "lon": -0.4619,
                        "alt_ft": 83,
                        "codes": [
                          "EGLL"
                        ],
                        "phase": "approach"
                      }
                    ],
                    "departure": "2026-09-24T08:00:00Z",
                    "speed_kt": 480
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The weather along the route.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WeatherRouteResponse"
                },
                "example": {
                  "summary": "1436 NM, 24 08:00Z to 24 11:11Z. 2 hazard(s) affect the flight: Moderate turbulence (high level) (G-AIRMET TANGO 3W TURB-HI +6h) crosses from 222 NM, 08:29Z at FL350; IFR conditions (G-AIRMET SIERRA 2E IFR +9h) crosses from 1428 NM, 11:10Z at 15000 ft. 5 more meet the corridor but not the aircraft's time or level. departure KMSP: METAR VFR, TAF worst VFR around 08:00Z. destination KSFO: METAR VFR, TAF worst MVFR around 11:11Z. Collection has 1 gap(s) in the period: see meta.gaps.",
                  "flight": {
                    "length_nm": 1436.4,
                    "departure": "2026-09-24T08:00:00Z",
                    "arrival": "2026-09-24T11:11:31Z",
                    "duration_min": 191.5,
                    "half_width_nm": 20,
                    "sample_step_nm": 1,
                    "waypoints": [
                      {
                        "index": 0,
                        "id": "KMSP",
                        "lat": 44.880081,
                        "lon": -93.221741,
                        "chainage_nm": 0,
                        "time": "2026-09-24T08:00:00Z",
                        "time_source": "departure",
                        "alt_ft": 841,
                        "level_source": "given",
                        "codes": [
                          "KMSP"
                        ]
                      },
                      {
                        "index": 1,
                        "id": "ABR",
                        "lat": 45.4174,
                        "lon": -98.368698,
                        "chainage_nm": 220.3,
                        "time": "2026-09-24T08:29:22Z",
                        "time_source": "speed",
                        "alt_ft": 35000,
                        "level_source": "given"
                      }
                    ]
                  },
                  "hazards": [
                    {
                      "ident": "G-AIRMET TANGO 3W TURB-HI +6h",
                      "hazard": "TURB-HI",
                      "title": "Moderate turbulence (high level)",
                      "severity": "MOD",
                      "valid_from": "2026-09-24T07:30:00Z",
                      "valid_to": "2026-09-24T10:30:00Z",
                      "band": {
                        "text": "FL250 to FL420",
                        "matched_from_ft": 25000,
                        "matched_to_ft": 42000
                      },
                      "placement": "crosses",
                      "affects": true,
                      "chainage_nm": 222.2,
                      "offset_nm": 0,
                      "track": [
                        {
                          "from_nm": 222.2,
                          "to_nm": 952.9,
                          "from_time": "2026-09-24T08:29:37Z",
                          "to_time": "2026-09-24T10:07:02Z",
                          "level_from_ft": 35000,
                          "level_to_ft": 35000,
                          "min_offset_nm": 0,
                          "track_inside": true
                        }
                      ]
                    }
                  ],
                  "hazards_clear": [
                    {
                      "ident": "G-AIRMET SIERRA 5E IFR +6h",
                      "placement": "crosses",
                      "valid_from": "2026-09-24T07:30:00Z",
                      "valid_to": "2026-09-24T10:30:00Z",
                      "band": {
                        "text": "SFC to 15000 ft (top assumed)"
                      },
                      "chainage_nm": 162.9,
                      "spatial": [
                        {
                          "from_nm": 162.9,
                          "to_nm": 370.9,
                          "from_time": "2026-09-24T08:21:43Z",
                          "to_time": "2026-09-24T08:49:27Z",
                          "level_from_ft": 26106,
                          "level_to_ft": 35000
                        }
                      ],
                      "clear_by": "above",
                      "clear_reason": "the aircraft is above the hazard's top"
                    }
                  ],
                  "aerodromes": [
                    {
                      "role": "destination",
                      "code": "KSFO",
                      "station": "KSFO",
                      "time": "2026-09-24T11:11:31Z",
                      "window": {
                        "from": "2026-09-24T10:11:31Z",
                        "to": "2026-09-24T12:11:31Z"
                      },
                      "metar": {
                        "observed_at": "2026-09-24T05:56:00Z",
                        "flight_category": "VFR",
                        "raw": "METAR KSFO 240556Z 29008KT 10SM CLR 17/12 A2986 RMK AO2 SLP113 T01720122 10250 20172 51005"
                      },
                      "taf": {
                        "valid_from": "2026-09-24T06:00:00Z",
                        "valid_to": "2026-09-25T12:00:00Z",
                        "covers_time": true,
                        "worst_category_in_window": "MVFR"
                      }
                    }
                  ],
                  "resolved_route": {
                    "route": "KMSP DWN6.ABR J158 RAP MBW MTU J148 OAL.MOD5 KSFO",
                    "notes": [
                      "Procedure DWN6 is not in AIRAC 2609 (US procedures only): flown direct to its transition ABR.",
                      "MTU: 2 places share this identifier; took Myton VORTAC (US), the one on the way.",
                      "MOD5 is not published at KSFO in AIRAC 2609; flown as MOD9, its current revision."
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FlightBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/FlightUnprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/weather/winds": {
      "get": {
        "operationId": "windsPoint",
        "tags": [
          "Weather"
        ],
        "summary": "Wind and temperature aloft at one point",
        "x-status": "beta",
        "description": "The wind and temperature at a point, level and time, interpolated from the FB forecasts, with the stations used.",
        "parameters": [
          {
            "name": "lat",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "alt_ft",
            "in": "query",
            "schema": {
              "type": "number"
            },
            "description": "Altitude in feet; give alt_ft or fl."
          },
          {
            "name": "fl",
            "in": "query",
            "schema": {
              "type": "number",
              "minimum": 0
            },
            "description": "Flight level (350 for FL350)."
          },
          {
            "name": "at",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Default now."
          },
          {
            "name": "as_of",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Replay: only the forecasts issued by this time."
          }
        ],
        "responses": {
          "200": {
            "description": "The interpolated wind and temperature, the stations used and the forecasts.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WindsPointResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/weather/winds/route": {
      "post": {
        "operationId": "windsRoute",
        "tags": [
          "Weather"
        ],
        "summary": "Winds aloft along a flight",
        "x-status": "beta",
        "description": "The wind and temperature a flight meets at its levels and times, from the official winds and temperatures aloft forecasts (FB) of aviationweather.gov (United States, Alaska, Hawaii, the Pacific), interpolated between the nearest stations and the levels either side, using the forecast whose period of use holds the time. Headwind and crosswind components, ISA deviation, averages per leg and over the flight and, with tas_kt, the time with the wind against still air. Not a gridded model.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WindsRouteRequest"
              },
              "examples": {
                "route_string": {
                  "summary": "A filed route at FL350 with a true airspeed",
                  "value": {
                    "route": "KMSP DWN6.ABR J158 RAP MBW KSFO",
                    "departure": "2026-10-14T18:00:00Z",
                    "speed_kt": 450,
                    "cruise_fl": 350,
                    "tas_kt": 460,
                    "step_nm": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The samples along the track, the legs, the totals and the forecasts used.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WindsRouteResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FlightBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/FlightUnprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/airspace/route": {
      "post": {
        "operationId": "airspaceRoute",
        "tags": [
          "Airspace"
        ],
        "summary": "Airspace a flight enters",
        "description": "The special use airspace, Class B, C and D airspace and TFRs a flight enters (United States, from FAA data; the FAA's layer also carries the Bahamas danger areas), where, when and at what level. An airspace is entered where the track is inside its area while it is in force and the aircraft is within its vertical limits. Special use airspace counts as in force at all times (activation is not known: check NOTAMs); a TFR limit above ground level is widened by the highest terrain in its state.",
        "x-status": "beta",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AirspaceRouteRequest"
              },
              "examples": {
                "route_string": {
                  "summary": "A filed route at FL250",
                  "value": {
                    "route": "KLAS DCT KLAX",
                    "departure": "2026-10-14T18:00:00Z",
                    "speed_kt": 300,
                    "cruise_fl": 250,
                    "kinds": [
                      "restricted",
                      "moa",
                      "tfr",
                      "class_b"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The airspace the flight enters and passes near, the TFRs that cannot be placed, and the sources.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AirspaceRouteResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FlightBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/FlightUnprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/planning/mass-balance": {
      "post": {
        "operationId": "massBalance",
        "tags": [
          "Flight planning"
        ],
        "summary": "Mass and balance for one loading",
        "x-status": "beta",
        "description": "Weight and centre of gravity at ramp, takeoff, landing and zero fuel from the aircraft data in the request, checked against its weight limits and centre of gravity envelopes, with the centre of gravity path as the trip fuel burns. BravoEcho holds no aircraft data; check the result against the aircraft flight manual.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MassBalanceRequest"
              },
              "examples": {
                "four_seat_single": {
                  "summary": "A four-seat single",
                  "value": {
                    "aircraft": {
                      "empty": {
                        "weight": 1663,
                        "arm": 39.45
                      },
                      "stations": [
                        {
                          "id": "front_seats",
                          "arm": 37
                        },
                        {
                          "id": "rear_seats",
                          "arm": 73
                        },
                        {
                          "id": "baggage_1",
                          "arm": 95,
                          "max_weight": 120
                        }
                      ],
                      "fuel_tanks": [
                        {
                          "id": "main",
                          "arm": 48,
                          "capacity": 53,
                          "fuel_type": "avgas"
                        }
                      ],
                      "limits": {
                        "max_ramp": 2558,
                        "max_takeoff": 2550,
                        "max_landing": 2550
                      },
                      "envelopes": [
                        {
                          "name": "normal",
                          "points": [
                            [
                              35,
                              1500
                            ],
                            [
                              35,
                              1950
                            ],
                            [
                              39.5,
                              2550
                            ],
                            [
                              47.3,
                              2550
                            ],
                            [
                              47.3,
                              1500
                            ]
                          ]
                        }
                      ]
                    },
                    "load": {
                      "stations": {
                        "front_seats": 340,
                        "rear_seats": 0,
                        "baggage_1": 30
                      },
                      "fuel": {
                        "main": 48
                      }
                    },
                    "fuel_burn": {
                      "taxi": 1.4,
                      "trip": 20
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The phases, the limits with their margins and the centre of gravity path.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MassBalanceResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/UnknownField"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/LaravelValidation"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/planning/navlog": {
      "post": {
        "operationId": "navlog",
        "tags": [
          "Flight planning"
        ],
        "summary": "Navigation log for a flight",
        "x-status": "beta",
        "description": "Each leg with course and heading, true and magnetic (the magnetic variation from the World Magnetic Model, WMM2025, at the leg's midpoint), wind, ground speed, time, fuel and ETA, and the fuel plan, from the aircraft performance in the request and the winds aloft along the flight (FB forecasts, United States; still air elsewhere). BravoEcho holds no aircraft performance models; check the result against the aircraft flight manual.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NavlogRequest"
              },
              "examples": {
                "route_string": {
                  "summary": "A filed route with a single-engine piston's figures",
                  "value": {
                    "route": "KMSP DCT KMKE",
                    "departure": "2026-10-14T15:00:00Z",
                    "cruise_fl": 65,
                    "performance": {
                      "climb": {
                        "tas_kt": 80,
                        "fuel_per_hour": 12,
                        "rate_fpm": 700
                      },
                      "cruise": {
                        "tas_kt": 120,
                        "fuel_per_hour": 9
                      },
                      "descent": {
                        "tas_kt": 130,
                        "fuel_per_hour": 7,
                        "rate_fpm": 500
                      }
                    },
                    "taxi_fuel": 1.4,
                    "reserve": {
                      "minutes": 45
                    },
                    "fuel_on_board": 48,
                    "fuel_unit": "gal"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The legs, the totals and the winds used.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NavlogResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FlightBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "422": {
            "$ref": "#/components/responses/FlightUnprocessable"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/briefing": {
      "post": {
        "operationId": "flightBriefing",
        "tags": [
          "RAIM"
        ],
        "summary": "Briefing pack: RAIM, NOTAMs, weather and airspace for one flight",
        "description": "One flight object to the four route checks at once, or to the parts named in `parts`: the RAIM route check, the NOTAMs along the route, the weather along the route and the airspace the flight enters, with one summary. Each part counts as one request of its own service, recorded as `POST /v1/briefing (raim)` and so on: today the RAIM part is counted, and the NOTAM, weather and airspace parts are Beta and not counted. With RAIM in it the pack stands on its RAIM route check: when that check fails the pack answers with that error. A failure of any other part stays in its own section. For poor connections, `format: compact` keeps what a crew acts on, and `known` (the etags of the sections you hold) leaves out every section that has not changed.",
        "x-status": "available",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BriefingRequest"
              },
              "examples": {
                "route_string": {
                  "summary": "A filed route, compact, refreshed with the etags you hold",
                  "value": {
                    "route": "KMSP DWN6.ABR J158 RAP MBW KSFO",
                    "departure": "2026-10-14T23:00:00Z",
                    "speed_kt": 450,
                    "cruise_fl": 370,
                    "window_minutes": 60,
                    "format": "compact",
                    "known": {
                      "notams": "9f2c1d0e4b7a6c35"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The pack: one summary, then each part with its etag.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              },
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BriefingResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FlightBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "422": {
            "$ref": "#/components/responses/FlightUnprocessable"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/RaimUnavailable"
          }
        }
      }
    },
    "/alerts": {
      "post": {
        "operationId": "alertCreate",
        "tags": [
          "Alerts"
        ],
        "summary": "Watch a flight and call a webhook when it changes",
        "description": "A watch on one flight: every 15 minutes we run the briefing pack for it and call your webhook when what you watch changes. The first check calls with `alert.started`; after that a call comes only when the RAIM verdict, the NOTAMs along the route or the hazards along it change, so a new almanac or a fresh METAR that changes nothing a crew acts on does not call. Calls are signed with the watch's secret (shown once, in this answer). Counted only when something changed: a check that calls with a situation the webhook has not had (the first call, or a change) counts as the briefing pack of the watched parts, one request per part in its own service (today only RAIM is counted), once per change however many times the call is tried. Making, listing and stopping watches is not counted. Past the organisation's allowance a counted change waits (`last_error`: `quota_exceeded`), and a watch with `raim` cannot be made (429). A watch stops when the key that made it is revoked. The watch is checked once when it is made, and a flight a service refuses is refused with that service's error. An organisation may have 25 active watches and make 100 a day; each ends at `expires_at`, at most 7 days on.",
        "x-status": "beta",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AlertRequest"
              },
              "examples": {
                "route_string": {
                  "summary": "A filed route, RAIM and NOTAMs",
                  "value": {
                    "route": "KMSP DWN6.ABR J158 RAP MBW KSFO",
                    "departure": "2026-10-14T23:00:00Z",
                    "speed_kt": 450,
                    "cruise_fl": 370,
                    "webhook_url": "https://ops.example.com/hooks/bravoecho",
                    "events": [
                      "raim",
                      "notams"
                    ],
                    "window_minutes": 30
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The watch, and its secret, shown this once.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertCreated"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FlightBadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "403": {
            "$ref": "#/components/responses/LicenceRequired"
          },
          "409": {
            "$ref": "#/components/responses/AlertLimit"
          },
          "422": {
            "$ref": "#/components/responses/FlightUnprocessable"
          },
          "429": {
            "$ref": "#/components/responses/CountedTooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        },
        "callbacks": {
          "alert": {
            "{$request.body#/webhook_url}": {
              "post": {
                "summary": "A call to your webhook",
                "description": "Headers: `BravoEcho-Event` (the type), `BravoEcho-Signature: t=<unix time>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" with the watch's secret>`. Answer 2xx within 10 seconds. A call that fails is tried again at the next check; after 10 failures in a row the watch says `failing` and stops.",
                "requestBody": {
                  "required": true,
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/AlertCall"
                      }
                    }
                  }
                },
                "responses": {
                  "2XX": {
                    "description": "Received."
                  }
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "alertList",
        "tags": [
          "Alerts"
        ],
        "summary": "The organisation's watches",
        "x-status": "beta",
        "responses": {
          "200": {
            "description": "Newest first, at most 100; the secret is never shown again.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertList"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/alerts/{alert}": {
      "parameters": [
        {
          "name": "alert",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "pattern": "^alr_[0-9a-z]{26}$"
          },
          "description": "The watch's id, as POST /alerts gave it."
        }
      ],
      "get": {
        "operationId": "alertShow",
        "tags": [
          "Alerts"
        ],
        "summary": "One watch",
        "x-status": "beta",
        "responses": {
          "200": {
            "description": "The watch, with its last check and last call.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alert"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "delete": {
        "operationId": "alertStop",
        "tags": [
          "Alerts"
        ],
        "summary": "Stop a watch",
        "description": "No more checks or calls. The watch stays in the list as `stopped`.",
        "x-status": "beta",
        "responses": {
          "200": {
            "description": "The watch, stopped.",
            "headers": {
              "X-Product-Status": {
                "$ref": "#/components/headers/X-Product-Status"
              },
              "X-Metered": {
                "$ref": "#/components/headers/X-Metered"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alert"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthenticated"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "An organisation API key from https://app.bravoecho.ai (API keys). Read it from the environment; never put it in source, config files or logs."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Every error has this shape: a code and a sentence. Some codes add fields.",
        "required": [
          "error",
          "message"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "The error code. `bad_request`: a required parameter is missing or malformed. `unknown_field`: a field or query parameter this endpoint does not take. `unauthenticated`: missing or invalid key. `licence_required`: the organisation has used its free allowance of counted requests and has not accepted the licence agreement. `not_found`: nothing with that id. `alert_limit`: the organisation already has the most active alerts it may have. `method_not_allowed`: the path exists with another method. `validation`: a value that cannot be right; the message names the field. `route_unresolved`: a route string has a point that cannot be placed. `rate_limited`: back off for `Retry-After` seconds. `quota_exceeded`: the organisation's monthly cap of counted requests is reached. `almanac_untrusted`: the requested time is too far from the almanac to predict. `upstream_unavailable`: a backing service is down. `server_error`, `internal`, `upstream_error` and `unavailable`: a failure on our side; retry once after a short delay. `forbidden` is the generic name of a 403.",
            "enum": [
              "bad_request",
              "unknown_field",
              "unauthenticated",
              "forbidden",
              "licence_required",
              "not_found",
              "alert_limit",
              "method_not_allowed",
              "validation",
              "route_unresolved",
              "rate_limited",
              "quota_exceeded",
              "server_error",
              "internal",
              "upstream_error",
              "unavailable",
              "upstream_unavailable",
              "almanac_untrusted"
            ]
          },
          "message": {
            "type": "string",
            "description": "One plain sentence saying what went wrong. Show it to the person who made the request."
          },
          "errors": {
            "type": "object",
            "description": "On `validation` from a request check: the messages per field, keyed by the field's path (`waypoints.1.lat`).",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "unresolved": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "On `route_unresolved`: one message per point that could not be placed."
          },
          "resolved_route": {
            "type": "object",
            "description": "On `route_unresolved` from a route check: the route as read, its notes and the navigation data cycle used.",
            "properties": {
              "route": {
                "type": "string",
                "description": "The route as read."
              },
              "notes": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "One note per simplification."
              },
              "nav_data": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/NavData"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "additionalProperties": true
          },
          "almanac": {
            "type": "object",
            "description": "On `almanac_untrusted`: the almanac status, as `GET /raim/almanac` returns it.",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "NavData": {
        "type": "object",
        "description": "The navigation data cycle a route string was resolved with. Null when no cycle is loaded.",
        "properties": {
          "source": {
            "type": "string",
            "description": "Where fixes, airways and procedures come from.",
            "examples": [
              "FAA CIFP"
            ]
          },
          "airac": {
            "type": "string",
            "description": "The AIRAC cycle.",
            "examples": [
              "2609"
            ]
          },
          "effective_from": {
            "type": "string",
            "description": "First day of the cycle.",
            "format": "date"
          },
          "effective_to": {
            "type": "string",
            "description": "The day the next cycle takes over.",
            "format": "date"
          }
        },
        "additionalProperties": true
      },
      "Waypoint": {
        "type": "object",
        "description": "One point of the flight. Numbers are JSON numbers (`\"51.47\"` is refused). A field not listed here is refused with 400 `unknown_field`, naming the waypoint.",
        "required": [
          "lat",
          "lon"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "A name for the point (an ICAO code, a fix, your own label). Echoed back."
          },
          "label": {
            "type": "string",
            "description": "Read as `id`, the name older NOTAM clients use."
          },
          "lat": {
            "type": "number",
            "description": "Latitude in decimal degrees (WGS-84).",
            "minimum": -90,
            "maximum": 90
          },
          "lon": {
            "type": "number",
            "description": "Longitude in decimal degrees (WGS-84).",
            "minimum": -180,
            "maximum": 180
          },
          "time": {
            "type": "string",
            "description": "When the aircraft is at the point (RFC 3339, UTC).",
            "format": "date-time"
          },
          "alt_m": {
            "type": "number",
            "description": "Level in metres. Give at most one of `alt_m`, `alt_ft` and `fl`."
          },
          "alt_ft": {
            "type": "number",
            "description": "Level in feet."
          },
          "fl": {
            "type": "number",
            "description": "Flight level: 350 for FL350."
          },
          "codes": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 12
            },
            "description": "Aerodrome identifiers at this point (`[\"KJFK\"]`). Used by the NOTAM and weather routes; accepted and not used by RAIM."
          },
          "phase": {
            "type": "string",
            "description": "RAIM alert limit by flight phase, from this waypoint onwards: `oceanic` 4.0 NM, `enroute` 2.0, `terminal` 1.0, `approach` 0.3 (aliases `lnav`, `npa`), or an RNP value whose HAL is the value in NM. Case and spaces do not matter (`RNP 0.3`, `rnp-0.3`). Give `phase` or `hal_nm`, not both. Used by RAIM only.",
            "enum": [
              "oceanic",
              "enroute",
              "terminal",
              "approach",
              "lnav",
              "npa",
              "rnp4",
              "rnp2",
              "rnp1",
              "rnp0.5",
              "rnp0.3",
              "rnp0.2",
              "rnp0.15",
              "rnp0.1"
            ]
          },
          "hal_nm": {
            "type": "number",
            "description": "RAIM horizontal alert limit in NM, instead of a phase. Used by RAIM only.",
            "exclusiveMinimum": 0,
            "maximum": 20
          }
        },
        "additionalProperties": false,
        "not": {
          "anyOf": [
            {
              "required": [
                "alt_m",
                "alt_ft"
              ]
            },
            {
              "required": [
                "alt_m",
                "fl"
              ]
            },
            {
              "required": [
                "alt_ft",
                "fl"
              ]
            }
          ]
        }
      },
      "FlightByWaypoints": {
        "type": "object",
        "description": "The flight object as waypoints. `cruise_fl`, `cruise_alt_m`, `phase` and `hal_nm` do not go at the top level here: each waypoint carries its own level and alert limit (400 `unknown_field`).",
        "required": [
          "waypoints"
        ],
        "properties": {
          "waypoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Waypoint"
            },
            "description": "The flight, at least 2 points. The RAIM route check takes up to 500, the NOTAM and weather routes up to 200. Waypoints are counted from 0 in messages.",
            "minItems": 2
          },
          "departure": {
            "type": "string",
            "description": "The time of the first waypoint when it has none.",
            "format": "date-time"
          },
          "speed_kt": {
            "type": "number",
            "description": "Ground speed for the waypoints without a time.",
            "minimum": 0,
            "maximum": 2000
          }
        }
      },
      "FlightByRoute": {
        "type": "object",
        "description": "The flight object as filed. The route is resolved once, as `GET /routes/resolve` resolves it, with the AIRAC cycle in force at `departure`. Its airports count as aerodromes. Every answer to a route string adds `resolved_route`. A point that cannot be placed is 422 `route_unresolved`.",
        "required": [
          "route"
        ],
        "properties": {
          "route": {
            "type": "string",
            "description": "The route as filed: airports, navaids, fixes, airways, SIDs and STARs (US), coordinates (`5020N01000W`, `52N020W`, `4413N/09354W`, `N44.2/W93.9`, `44.2/-93.9`). `DCT` and speed/level groups are dropped.",
            "maxLength": 2000,
            "examples": [
              "LDZA DCT 4448N01552E DCT LDSP"
            ]
          },
          "departure": {
            "type": "string",
            "description": "Departure time. Also picks the AIRAC cycle the route is resolved with.",
            "format": "date-time"
          },
          "speed_kt": {
            "type": "number",
            "description": "Ground speed.",
            "minimum": 0,
            "maximum": 2000
          },
          "cruise_alt_m": {
            "type": "number",
            "description": "Cruise level in metres. Give `cruise_alt_m` or `cruise_fl`, not both.",
            "minimum": -500,
            "maximum": 20000
          },
          "cruise_fl": {
            "type": "number",
            "description": "Cruise flight level: 350 for FL350.",
            "minimum": 0,
            "maximum": 650
          },
          "phase": {
            "type": "string",
            "description": "RAIM only: `auto` (default) takes the phases from the route's airports (terminal within 30 NM, approach within 7 NM of the destination, en route between); any other phase holds for the whole route. Give `phase` or `hal_nm`, not both. Accepted and not used by the NOTAM and weather routes.",
            "enum": [
              "auto",
              "oceanic",
              "enroute",
              "terminal",
              "approach",
              "lnav",
              "npa",
              "rnp4",
              "rnp2",
              "rnp1",
              "rnp0.5",
              "rnp0.3",
              "rnp0.2",
              "rnp0.15",
              "rnp0.1"
            ],
            "maxLength": 16
          },
          "hal_nm": {
            "type": "number",
            "description": "RAIM only: one alert limit in NM for the whole route.",
            "exclusiveMinimum": 0,
            "maximum": 20
          }
        },
        "allOf": [
          {
            "not": {
              "required": [
                "phase",
                "hal_nm"
              ]
            }
          },
          {
            "not": {
              "required": [
                "cruise_alt_m",
                "cruise_fl"
              ]
            }
          }
        ]
      },
      "ResolvedPoint": {
        "type": "object",
        "description": "One point of a resolved route string.",
        "properties": {
          "token": {
            "type": [
              "string",
              "null"
            ],
            "description": "The element of the route string the point comes from; null for an added boundary point."
          },
          "id": {
            "type": "string",
            "description": "The point's identifier."
          },
          "kind": {
            "type": "string",
            "description": "What the point is. `boundary` is a point added by RAIM's `auto` phases where a terminal or approach zone starts or ends inside a leg (`KMSP+30NM`, `KSFO-7NM`).",
            "enum": [
              "airport",
              "navaid",
              "fix",
              "coordinate",
              "boundary"
            ]
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "description": "The airport or navaid type, or `waypoint`, `terminal waypoint`."
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 3166-1 code."
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "elevation_ft": {
            "type": [
              "number",
              "null"
            ],
            "description": "Field or navaid elevation in feet."
          },
          "matches": {
            "type": [
              "integer",
              "null"
            ],
            "description": "How many places share the identifier; the one on the way was taken."
          },
          "via": {
            "type": [
              "string",
              "null"
            ],
            "description": "The airway or procedure a fix comes from."
          },
          "phase": {
            "type": "string",
            "description": "RAIM route check with `auto` phases: the phase flown from this point."
          }
        },
        "additionalProperties": true
      },
      "ResolvedRoute": {
        "type": "object",
        "description": "Added to every answer to a route string: the points the route stands for.",
        "properties": {
          "route": {
            "type": "string",
            "description": "The route as read (normalised)."
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ResolvedPoint"
            },
            "description": "The points it was flown through."
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "One note per simplification (an airway or procedure flown direct, a retired revision, a shared identifier)."
          },
          "nav_data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/NavData"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": true
      },
      "RaimProfile": {
        "type": "string",
        "description": "A named parameter set that reproduces a reference service. `do229` (default): the RTCA DO-229 baseline, FDE, every outage counts. `faa-c129`: matches the FAA RAIM SAPT / TSO-C129 prediction (FD only, 5 deg, 1 min step, outages under 5 continuous minutes ignored). `faa-c129-sa`: the TSO-C129 SA-on receiver class. `augur`: matches Eurocontrol AUGUR (FD, 5 deg, 1 min step, its 5 minute rule). Any explicit field overrides the profile; `params` echoes what was applied. `GET /raim/profiles` lists them.",
        "enum": [
          "do229",
          "faa-c129",
          "faa-c129-sa",
          "augur"
        ],
        "default": "do229"
      },
      "RaimPhase": {
        "type": "string",
        "description": "Alert limit by flight phase: `oceanic` 4.0 NM, `enroute` 2.0, `terminal` 1.0, `approach` 0.3 (aliases `lnav`, `npa`), or an RNP value whose HAL is the value in NM. Case and spaces do not matter (`RNP 0.3`, `rnp-0.3`). `GET /raim/phases` lists them.",
        "enum": [
          "oceanic",
          "enroute",
          "terminal",
          "approach",
          "lnav",
          "npa",
          "rnp4",
          "rnp2",
          "rnp1",
          "rnp0.5",
          "rnp0.3",
          "rnp0.2",
          "rnp0.15",
          "rnp0.1"
        ]
      },
      "RaimConstellations": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "gps",
            "galileo"
          ]
        },
        "description": "`[\"gps\"]` (default); `[\"gps\", \"galileo\"]` adds Galileo, which carries the GPS-Galileo time offset as a fifth unknown, so FD needs 6 satellites and FDE 7; `[\"galileo\"]` alone is a single-system solve. `gal` is read as `galileo`.",
        "default": [
          "gps"
        ]
      },
      "RaimOutageInput": {
        "type": "object",
        "description": "An extra satellite outage to apply. Current NANU (GPS) and NAGU (Galileo) outages are applied automatically.",
        "required": [
          "prn",
          "from"
        ],
        "properties": {
          "prn": {
            "type": "integer",
            "description": "Satellite PRN.",
            "minimum": 1,
            "maximum": 255
          },
          "from": {
            "type": "string",
            "description": "Start of the outage.",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "description": "End of the outage; leave out for an open-ended outage.",
            "format": "date-time"
          },
          "source": {
            "type": "string",
            "description": "Your label for it; default `request`."
          },
          "system": {
            "type": "string",
            "description": "`GPS` (default), `GAL`/`GALILEO`/`E`, `GLO`/`GLONASS`/`R`, `BDS`/`BEIDOU`/`C`."
          }
        },
        "additionalProperties": false
      },
      "RaimOutageApplied": {
        "type": "object",
        "description": "An outage window that overlaps the computed window.",
        "properties": {
          "prn": {
            "type": "integer"
          },
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "source": {
            "type": "string",
            "description": "`NANU 2026073 FCSTDV`, a NAGU, or your own label."
          },
          "system": {
            "type": "string",
            "description": "Set for Galileo outages."
          }
        },
        "additionalProperties": true
      },
      "RaimAlmanacInfo": {
        "type": "object",
        "description": "The almanac a result used.",
        "properties": {
          "version": {
            "type": "string",
            "description": "The almanac used.",
            "examples": [
              "2436-61440"
            ]
          },
          "toa": {
            "type": "string",
            "description": "Time of applicability.",
            "format": "date-time"
          },
          "fetched_at": {
            "type": "string",
            "format": "date-time"
          },
          "source": {
            "type": "string",
            "description": "`navcen`, an archive, or the embedded copy."
          },
          "satellites": {
            "type": "integer",
            "description": "Satellites of the requested constellations."
          },
          "healthy": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      },
      "RaimParams": {
        "type": "object",
        "description": "The settings applied, after the profile and your fields.",
        "properties": {
          "window_minutes": {
            "type": "integer"
          },
          "step_seconds": {
            "type": "integer"
          },
          "mask_deg": {
            "type": "number"
          },
          "fde": {
            "type": "boolean"
          },
          "baro": {
            "type": "boolean"
          },
          "min_sats_fd": {
            "type": "integer"
          },
          "min_sats_fde": {
            "type": "integer"
          },
          "profile": {
            "type": "string"
          },
          "min_outage_minutes": {
            "type": "integer"
          },
          "constellations": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sa": {
            "type": "boolean"
          }
        },
        "additionalProperties": true
      },
      "RaimDispatch": {
        "type": "object",
        "description": "The verdict under the profile's outage rule.",
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "True when no outage of `min_outage_minutes` or longer remains."
          },
          "min_outage_minutes": {
            "type": "integer",
            "description": "The outage rule; 0: any unavailable epoch fails."
          },
          "longest_outage_s": {
            "type": "integer",
            "description": "The longest continuous outage found, before the rule."
          },
          "short_outages": {
            "type": "integer",
            "description": "Outages ignored because shorter than the rule."
          }
        },
        "additionalProperties": true
      },
      "RaimOutage": {
        "type": "object",
        "description": "A merged interval where RAIM was not available.",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "description": "The last unavailable epoch plus one step.",
            "format": "date-time"
          },
          "duration_s": {
            "type": "integer"
          },
          "reason": {
            "type": "string",
            "enum": [
              "hpl_exceeds_hal",
              "insufficient_satellites"
            ]
          },
          "max_hpl_m": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "additionalProperties": true
      },
      "RaimWorst": {
        "type": "object",
        "description": "The largest HPL in the window and when it occurred.",
        "properties": {
          "hpl_nm": {
            "type": [
              "number",
              "null"
            ]
          },
          "hpl_m": {
            "type": [
              "number",
              "null"
            ],
            "description": "Null when RAIM is impossible (too few satellites or degenerate geometry)."
          },
          "at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "sats": {
            "type": "integer"
          }
        },
        "additionalProperties": true
      },
      "RaimPointResult": {
        "type": "object",
        "description": "One point's answer.",
        "properties": {
          "id": {
            "type": "string"
          },
          "hal_nm": {
            "type": "number"
          },
          "hal_m": {
            "type": "number"
          },
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "format": "date-time"
          },
          "available_now": {
            "type": "boolean",
            "description": "Availability at the epoch nearest the point's `time`."
          },
          "epochs": {
            "type": "integer"
          },
          "epochs_available": {
            "type": "integer"
          },
          "availability_pct": {
            "type": "number"
          },
          "outages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutage"
            }
          },
          "dispatch": {
            "$ref": "#/components/schemas/RaimDispatch"
          },
          "worst": {
            "$ref": "#/components/schemas/RaimWorst"
          },
          "min_sats": {
            "type": "integer"
          },
          "epochs_detail": {
            "type": "object",
            "description": "With `detail: true`: per-epoch arrays.",
            "properties": {
              "t": {
                "type": "array",
                "items": {
                  "type": "integer"
                },
                "description": "Unix seconds."
              },
              "hpl_m": {
                "type": "array",
                "items": {
                  "type": [
                    "number",
                    "null"
                  ]
                }
              },
              "sats": {
                "type": "array",
                "items": {
                  "type": "integer"
                }
              },
              "avail": {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "RaimPredictResponse": {
        "type": "object",
        "properties": {
          "almanac": {
            "$ref": "#/components/schemas/RaimAlmanacInfo"
          },
          "params": {
            "$ref": "#/components/schemas/RaimParams"
          },
          "outages_applied": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageApplied"
            },
            "description": "The outage windows (NANU, NAGU and your own) that overlap the computed window."
          },
          "dispatch": {
            "$ref": "#/components/schemas/RaimDispatch"
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimPointResult"
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Show them to the user; never hide them."
          },
          "degraded": {
            "type": "boolean",
            "description": "True when a warning affects trust in the numbers: almanac more than 7 days from the requested time, or the NANU/NAGU set stale."
          },
          "compute_ms": {
            "type": "number"
          },
          "generated_at": {
            "type": "string",
            "description": "When the answer was computed.",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "RaimFixWindow": {
        "type": "object",
        "description": "With `window_minutes`: the fix held at its position from its time minus the window to its time plus the window, what predict returns for the same point and window.",
        "properties": {
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "format": "date-time"
          },
          "epochs": {
            "type": "integer"
          },
          "epochs_available": {
            "type": "integer"
          },
          "availability_pct": {
            "type": "number"
          },
          "ok": {
            "type": "boolean",
            "description": "No outage that counts under the rule."
          },
          "outages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutage"
            }
          }
        },
        "additionalProperties": true
      },
      "RaimDepartureRange": {
        "type": "object",
        "description": "A run of departures with the same verdict; both ends inclusive, sampled every `step_s`.",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "from_offset_min": {
            "type": "number"
          },
          "to_offset_min": {
            "type": "number"
          }
        },
        "additionalProperties": true
      },
      "RaimBlockedRange": {
        "allOf": [
          {
            "$ref": "#/components/schemas/RaimDepartureRange"
          },
          {
            "type": "object",
            "properties": {
              "segments": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "from_id": {
                      "type": "string"
                    },
                    "to_id": {
                      "type": "string"
                    },
                    "first_leg": {
                      "type": "integer"
                    },
                    "last_leg": {
                      "type": "integer"
                    },
                    "hal_nm": {
                      "type": "number",
                      "description": "The smallest HAL there."
                    },
                    "reasons": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "max_hpl_m": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "longest_outage_s": {
                      "type": "integer"
                    }
                  },
                  "additionalProperties": true
                },
                "description": "Where those departures lose RAIM."
              }
            },
            "additionalProperties": true
          }
        ],
        "description": "A run of departures that fail."
      },
      "RaimRouteWindow": {
        "type": "object",
        "description": "With `window_minutes`: the departure-slip verdict.",
        "properties": {
          "planned_departure": {
            "type": "string",
            "format": "date-time"
          },
          "planned_ok": {
            "type": "boolean",
            "description": "The same verdict as `dispatch.ok`."
          },
          "minutes": {
            "type": "number"
          },
          "step_s": {
            "type": "integer"
          },
          "departures_checked": {
            "type": "integer"
          },
          "clean_pct": {
            "type": "number",
            "description": "Share of the checked departures that are clean."
          },
          "slack_minutes": {
            "type": [
              "object",
              "null"
            ],
            "description": "How far the departure can move with every departure in between clean; equal to `minutes` when it stays clean to the edge of the window. Null when the planned departure fails.",
            "properties": {
              "early": {
                "type": "number"
              },
              "late": {
                "type": "number"
              }
            }
          },
          "nearest_clean": {
            "type": [
              "object",
              "null"
            ],
            "description": "Only when the planned departure fails: the closest clean departures.",
            "properties": {
              "earlier": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "departure": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "offset_min": {
                    "type": "number"
                  }
                }
              },
              "later": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "departure": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "offset_min": {
                    "type": "number"
                  }
                }
              }
            }
          },
          "clean_departures": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimDepartureRange"
            }
          },
          "blocked_departures": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimBlockedRange"
            }
          },
          "fixes_ok": {
            "type": "boolean",
            "description": "True when every fix passes its own window (`waypoints[].window`)."
          }
        },
        "additionalProperties": true
      },
      "RaimRouteResponse": {
        "type": "object",
        "properties": {
          "dispatch": {
            "$ref": "#/components/schemas/RaimDispatch"
          },
          "summary": {
            "type": "string",
            "description": "The verdict in one to three plain sentences. Show it to people as it is; use the fields for logic.",
            "examples": [
              "RAIM is available along the whole route at the planned times."
            ]
          },
          "start": {
            "type": "string",
            "format": "date-time"
          },
          "end": {
            "type": "string",
            "format": "date-time"
          },
          "duration_s": {
            "type": "integer"
          },
          "distance_nm": {
            "type": "number"
          },
          "samples": {
            "type": "integer"
          },
          "epochs_available": {
            "type": "integer"
          },
          "availability_pct": {
            "type": "number"
          },
          "outages": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "from": {
                  "type": "string",
                  "format": "date-time"
                },
                "to": {
                  "type": "string",
                  "format": "date-time"
                },
                "duration_s": {
                  "type": "integer"
                },
                "reason": {
                  "type": "string",
                  "enum": [
                    "hpl_exceeds_hal",
                    "insufficient_satellites"
                  ]
                },
                "max_hpl_m": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "from_lat": {
                  "type": "number"
                },
                "from_lon": {
                  "type": "number"
                },
                "to_lat": {
                  "type": "number"
                },
                "to_lon": {
                  "type": "number"
                },
                "leg": {
                  "type": "integer",
                  "description": "Index into `legs` where it starts."
                },
                "hal_nm": {
                  "type": "number"
                }
              },
              "additionalProperties": true
            },
            "description": "Outages of the planned flight, with time and position."
          },
          "worst": {
            "type": "object",
            "description": "The largest HPL along the route.",
            "properties": {
              "hpl_nm": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "hpl_m": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "at": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "sats": {
                "type": "integer"
              },
              "leg": {
                "type": "integer"
              }
            },
            "additionalProperties": true
          },
          "min_sats": {
            "type": "integer"
          },
          "waypoints": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "time": {
                  "type": "string",
                  "format": "date-time"
                },
                "lat": {
                  "type": "number"
                },
                "lon": {
                  "type": "number"
                },
                "alt_m": {
                  "type": "number"
                },
                "hal_nm": {
                  "type": "number"
                },
                "available": {
                  "type": "boolean"
                },
                "hpl_m": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "sats": {
                  "type": "integer"
                },
                "window": {
                  "$ref": "#/components/schemas/RaimFixWindow"
                }
              },
              "additionalProperties": true
            },
            "description": "Each fix at its own time."
          },
          "legs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "from": {
                  "type": "string"
                },
                "to": {
                  "type": "string"
                },
                "hal_nm": {
                  "type": "number",
                  "description": "The smaller HAL of the leg's two ends."
                },
                "distance_nm": {
                  "type": "number"
                },
                "samples": {
                  "type": "integer"
                },
                "epochs_available": {
                  "type": "integer"
                },
                "outages": {
                  "type": "integer",
                  "description": "After the outage rule."
                }
              },
              "additionalProperties": true
            }
          },
          "window": {
            "$ref": "#/components/schemas/RaimRouteWindow"
          },
          "samples_detail": {
            "type": "object",
            "description": "With `detail: true`: per-sample arrays.",
            "properties": {
              "t": {
                "type": "array",
                "items": {
                  "type": "integer"
                }
              },
              "lat": {
                "type": "array",
                "items": {
                  "type": "number"
                }
              },
              "lon": {
                "type": "array",
                "items": {
                  "type": "number"
                }
              },
              "hpl_m": {
                "type": "array",
                "items": {
                  "type": [
                    "number",
                    "null"
                  ]
                }
              },
              "sats": {
                "type": "array",
                "items": {
                  "type": "integer"
                }
              },
              "avail": {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              }
            },
            "additionalProperties": true
          },
          "window_detail": {
            "type": "object",
            "description": "With `detail: true` and a window: departure time against distance along the route.",
            "properties": {
              "offset_start_min": {
                "type": "number"
              },
              "step_s": {
                "type": "integer"
              },
              "rows": {
                "type": "integer"
              },
              "row_ok": {
                "type": "array",
                "items": {
                  "type": "boolean"
                }
              },
              "unavailable": {
                "type": "array",
                "items": {
                  "type": "array",
                  "items": {
                    "type": "integer"
                  },
                  "minItems": 3,
                  "maxItems": 3
                },
                "description": "Runs `[row, first sample, last sample]` indexing `samples_detail`."
              }
            },
            "additionalProperties": true
          },
          "almanac": {
            "$ref": "#/components/schemas/RaimAlmanacInfo"
          },
          "params": {
            "$ref": "#/components/schemas/RaimParams"
          },
          "outages_applied": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageApplied"
            },
            "description": "The outage windows (NANU, NAGU and your own) that overlap the computed window."
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Show them to the user; never hide them."
          },
          "degraded": {
            "type": "boolean",
            "description": "True when a warning affects trust in the numbers: almanac more than 7 days from the requested time, or the NANU/NAGU set stale."
          },
          "compute_ms": {
            "type": "number"
          },
          "generated_at": {
            "type": "string",
            "description": "When the answer was computed.",
            "format": "date-time"
          },
          "resolved_route": {
            "$ref": "#/components/schemas/ResolvedRoute"
          }
        },
        "additionalProperties": true
      },
      "RaimTrajectoryResponse": {
        "type": "object",
        "properties": {
          "almanac": {
            "$ref": "#/components/schemas/RaimAlmanacInfo"
          },
          "params": {
            "$ref": "#/components/schemas/RaimParams"
          },
          "outages_applied": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageApplied"
            },
            "description": "The outage windows (NANU, NAGU and your own) that overlap the computed window."
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Show them to the user; never hide them."
          },
          "degraded": {
            "type": "boolean",
            "description": "True when a warning affects trust in the numbers: almanac more than 7 days from the requested time, or the NANU/NAGU set stale."
          },
          "compute_ms": {
            "type": "number"
          },
          "generated_at": {
            "type": "string",
            "description": "When the answer was computed.",
            "format": "date-time"
          },
          "hal_nm": {
            "type": "number"
          },
          "hal_m": {
            "type": "number"
          },
          "t0": {
            "type": "integer",
            "description": "Unix seconds of epoch 0."
          },
          "step_s": {
            "type": "integer"
          },
          "n": {
            "type": "integer",
            "description": "Epochs."
          },
          "prns": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "PRNs of the requested constellations."
          },
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The same order, with the constellation letter: `G02`, `E11`."
          },
          "hpl_m": {
            "type": "array",
            "items": {
              "type": [
                "number",
                "null"
              ]
            },
            "description": "Per epoch; null when RAIM is impossible."
          },
          "sats": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "avail": {
            "type": "array",
            "items": {
              "type": "boolean"
            }
          },
          "passes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "prn": {
                  "type": "integer"
                },
                "id": {
                  "type": "string"
                },
                "sys": {
                  "type": "string",
                  "description": "`GAL` for Galileo; left out for GPS."
                },
                "i0": {
                  "type": "integer",
                  "description": "Epoch index the pass starts at."
                },
                "az": {
                  "type": "array",
                  "items": {
                    "type": "number"
                  },
                  "description": "Azimuth per epoch, degrees."
                },
                "el": {
                  "type": "array",
                  "items": {
                    "type": "number"
                  },
                  "description": "Elevation per epoch, degrees."
                },
                "st": {
                  "type": "array",
                  "items": {
                    "type": "integer",
                    "enum": [
                      0,
                      1,
                      2,
                      3
                    ]
                  },
                  "description": "Status per epoch: 0 used, 1 below mask, 2 unhealthy, 3 outage."
                }
              },
              "additionalProperties": true
            },
            "description": "With `geometry` (default true): each satellite's runs above the horizon."
          },
          "summary": {
            "$ref": "#/components/schemas/RaimPointResult"
          }
        },
        "additionalProperties": true
      },
      "RaimMapResponse": {
        "type": "object",
        "properties": {
          "almanac": {
            "$ref": "#/components/schemas/RaimAlmanacInfo"
          },
          "params": {
            "$ref": "#/components/schemas/RaimParams"
          },
          "outages_applied": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageApplied"
            },
            "description": "The outage windows (NANU, NAGU and your own) that overlap the computed window."
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Show them to the user; never hide them."
          },
          "degraded": {
            "type": "boolean",
            "description": "True when a warning affects trust in the numbers: almanac more than 7 days from the requested time, or the NANU/NAGU set stale."
          },
          "compute_ms": {
            "type": "number"
          },
          "generated_at": {
            "type": "string",
            "description": "When the answer was computed.",
            "format": "date-time"
          },
          "hal_nm": {
            "type": "number"
          },
          "hal_m": {
            "type": "number"
          },
          "t0": {
            "type": "integer"
          },
          "step_s": {
            "type": "integer"
          },
          "n": {
            "type": "integer",
            "description": "Epochs."
          },
          "grid_deg": {
            "type": "number"
          },
          "lat0": {
            "type": "number"
          },
          "lon0": {
            "type": "number",
            "description": "-180."
          },
          "nlat": {
            "type": "integer"
          },
          "nlon": {
            "type": "integer"
          },
          "alt_m": {
            "type": "number"
          },
          "outage_min": {
            "type": "array",
            "items": {
              "type": "integer"
            },
            "description": "Unavailable minutes per cell, `nlat * nlon`, row-major from `lat0` northwards and `lon0` eastwards."
          },
          "coverage": {
            "type": "object",
            "properties": {
              "cells": {
                "type": "integer"
              },
              "cells_with_outage": {
                "type": "integer"
              },
              "pct_cells_100": {
                "type": "number",
                "description": "Share of cells with no outage at all."
              },
              "max_outage_min": {
                "type": "integer"
              },
              "top_cells": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "lat": {
                      "type": "number"
                    },
                    "lon": {
                      "type": "number"
                    },
                    "minutes": {
                      "type": "integer"
                    }
                  },
                  "additionalProperties": true
                },
                "description": "The worst cells."
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "RaimNanuStatus": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "loaded": {
            "type": "boolean"
          },
          "newest": {
            "type": "string",
            "description": "The newest message number."
          },
          "fetched_at": {
            "type": "string",
            "format": "date-time"
          },
          "age_hours": {
            "type": "number"
          },
          "from_cache": {
            "type": "boolean"
          },
          "messages": {
            "type": "integer"
          },
          "windows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageApplied"
            },
            "description": "The outage windows in force."
          },
          "missing_numbers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "last_error": {
            "type": "string"
          },
          "next_refresh": {
            "type": "string",
            "format": "date-time"
          },
          "advisory_date": {
            "type": "string",
            "format": "date-time"
          },
          "nanus": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "number": {
                  "type": "string",
                  "description": "YYYYNNN."
                },
                "type": {
                  "type": "string"
                },
                "dtg": {
                  "type": "string",
                  "description": "Message date-time group.",
                  "format": "date-time"
                },
                "ref": {
                  "type": "string"
                },
                "svn": {
                  "type": "integer"
                },
                "prn": {
                  "type": "integer"
                },
                "start": {
                  "type": "string",
                  "format": "date-time"
                },
                "stop": {
                  "type": "string",
                  "format": "date-time"
                },
                "ufn": {
                  "type": "boolean",
                  "description": "Stop is until further notice."
                }
              },
              "additionalProperties": true
            }
          }
        },
        "description": "The GPS NANUs considered and the outage windows in force.",
        "additionalProperties": true
      },
      "RaimNaguStatus": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "loaded": {
            "type": "boolean"
          },
          "newest": {
            "type": "string",
            "description": "The newest message number."
          },
          "fetched_at": {
            "type": "string",
            "format": "date-time"
          },
          "age_hours": {
            "type": "number"
          },
          "from_cache": {
            "type": "boolean"
          },
          "messages": {
            "type": "integer"
          },
          "windows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageApplied"
            },
            "description": "The outage windows in force."
          },
          "missing_numbers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "last_error": {
            "type": "string"
          },
          "next_refresh": {
            "type": "string",
            "format": "date-time"
          },
          "nagus": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "number": {
                  "type": "string",
                  "description": "YYYYNNN."
                },
                "type": {
                  "type": "string",
                  "description": "As printed: `PLN_OUTAGE`, `UNP_UNUFN`, `USABLE`, ..."
                },
                "generated": {
                  "type": "string",
                  "format": "date-time"
                },
                "subject": {
                  "type": "string"
                },
                "ref": {
                  "type": "string"
                },
                "start": {
                  "type": "string",
                  "format": "date-time"
                },
                "end": {
                  "type": "string",
                  "format": "date-time"
                },
                "gsat": {
                  "type": "string"
                },
                "svid": {
                  "type": "integer",
                  "description": "Galileo PRN."
                },
                "signals": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          }
        },
        "description": "The Galileo NAGUs considered and the outage windows in force.",
        "additionalProperties": true
      },
      "RaimAlmanacStatus": {
        "type": "object",
        "description": "GPS and Galileo almanac status with the NANU and NAGU sets.",
        "properties": {
          "loaded": {
            "type": "boolean"
          },
          "version": {
            "type": "string"
          },
          "format": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "fetched_at": {
            "type": "string",
            "format": "date-time"
          },
          "toa": {
            "type": "string",
            "format": "date-time"
          },
          "gps_week": {
            "type": "integer"
          },
          "toa_s": {
            "type": "number"
          },
          "age_hours": {
            "type": "number"
          },
          "satellites": {
            "type": "integer"
          },
          "healthy": {
            "type": "integer"
          },
          "unhealthy_prns": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "default_outages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageApplied"
            }
          },
          "nanu": {
            "$ref": "#/components/schemas/RaimNanuStatus"
          },
          "nagu": {
            "$ref": "#/components/schemas/RaimNaguStatus"
          },
          "galileo": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean"
              },
              "loaded": {
                "type": "boolean"
              },
              "almanac": {
                "type": "object",
                "additionalProperties": true
              },
              "last_error": {
                "type": "string"
              },
              "fetched_at": {
                "type": "string",
                "format": "date-time"
              }
            },
            "additionalProperties": true
          },
          "systems": {
            "type": "object",
            "description": "Per constellation: `week`, `toa_s`, `toa`, `satellites`, `healthy`, `format`, `source`, `fetched_at`.",
            "additionalProperties": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "warning": {
            "type": "string"
          },
          "last_fetch_error": {
            "type": "string"
          },
          "next_refresh": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "RaimPhaseList": {
        "type": "object",
        "properties": {
          "phases": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "hal_nm": {
                  "type": "number"
                },
                "hal_m": {
                  "type": "number"
                },
                "note": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          }
        },
        "additionalProperties": true
      },
      "RaimProfileInfo": {
        "type": "object",
        "description": "A profile: its name and what it does.",
        "properties": {
          "name": {
            "type": "string",
            "enum": [
              "do229",
              "faa-c129",
              "faa-c129-sa",
              "augur"
            ]
          },
          "mask_deg": {
            "type": [
              "number",
              "null"
            ],
            "description": "Null: the service default."
          },
          "fde": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Null: FDE on."
          },
          "step_seconds": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Null: the endpoint's default."
          },
          "min_outage_minutes": {
            "type": "integer",
            "description": "Outages shorter than this are ignored for the dispatch verdict."
          },
          "note": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "Notam": {
        "type": "object",
        "description": "One NOTAM.",
        "properties": {
          "nms_id": {
            "type": "string",
            "description": "The 16-digit FAA identifier."
          },
          "number": {
            "type": [
              "string",
              "null"
            ],
            "examples": [
              "A1045/26"
            ]
          },
          "classification": {
            "type": [
              "string",
              "null"
            ],
            "description": "`DOM`, `INTL`, `MIL`, `FDC`, `LMIL`."
          },
          "category": {
            "type": "string",
            "description": "Our grouping of the Q-code, with the FAA keyword as fallback.",
            "enum": [
              "runway",
              "taxiway",
              "aerodrome",
              "lighting",
              "obstacle",
              "navaid",
              "airspace",
              "warning",
              "procedure",
              "service",
              "other"
            ]
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Our plain reading of the Q-code; null when there is nothing trustworthy to say."
          },
          "unusable": {
            "type": "boolean"
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "description": "`N` new, `R` replaces, `C` cancels another NOTAM."
          },
          "location": {
            "type": [
              "string",
              "null"
            ]
          },
          "icao_location": {
            "type": [
              "string",
              "null"
            ]
          },
          "affected_fir": {
            "type": [
              "string",
              "null"
            ]
          },
          "is_active": {
            "type": "boolean"
          },
          "issued_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "effective_start": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "effective_end": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "estimated": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "The end is estimated; an estimated end never excludes a NOTAM."
          },
          "cancelled_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "schedule": {
            "type": [
              "string",
              "null"
            ],
            "description": "The raw D) field."
          },
          "selection_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "traffic": {
            "type": [
              "string",
              "null"
            ]
          },
          "purpose": {
            "type": [
              "string",
              "null"
            ]
          },
          "scope": {
            "type": [
              "string",
              "null"
            ]
          },
          "lower_limit": {
            "type": [
              "string",
              "null"
            ]
          },
          "upper_limit": {
            "type": [
              "string",
              "null"
            ]
          },
          "minimum_fl": {
            "type": [
              "string",
              "null"
            ]
          },
          "maximum_fl": {
            "type": [
              "string",
              "null"
            ]
          },
          "coordinates": {
            "type": [
              "string",
              "null"
            ]
          },
          "radius_nm": {
            "type": [
              "number",
              "null"
            ]
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "faa_last_updated": {
            "type": "string",
            "format": "date-time"
          },
          "observed_at": {
            "type": "string",
            "format": "date-time"
          },
          "version_count": {
            "type": "integer"
          },
          "also_issued_as": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "nms_id": {
                  "type": "string"
                },
                "number": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "classification": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "additionalProperties": true
            },
            "description": "With `collapse`: the same notice issued under another number."
          },
          "geometry": {
            "type": "object",
            "description": "With `include=geometry`: the FAA's own geometry (GeoJSON).",
            "additionalProperties": true
          },
          "area": {
            "type": "object",
            "description": "With `include=area`: the affected area (GeoJSON).",
            "additionalProperties": true
          },
          "area_source": {
            "type": "string",
            "description": "Where `area` comes from.",
            "enum": [
              "faa",
              "text",
              "radius"
            ]
          },
          "area_km2": {
            "type": "number"
          },
          "raw": {
            "type": "object",
            "description": "With `include=raw`: the renderings as received.",
            "properties": {
              "icao": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "domestic": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "aixm": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "NotamMeta": {
        "type": "object",
        "description": "The archive's caveats; they travel with every answer.",
        "properties": {
          "total": {
            "type": "integer"
          },
          "returned": {
            "type": "integer"
          },
          "truncated": {
            "type": "boolean"
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ]
          },
          "duplicates_collapsed": {
            "type": "integer"
          },
          "window": {
            "type": "object",
            "description": "Which window the answer used.",
            "properties": {
              "from": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "to": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "semantic": {
                "type": "string",
                "enum": [
                  "active",
                  "in_force",
                  "all"
                ]
              }
            },
            "additionalProperties": true
          },
          "as_of": {
            "type": "object",
            "description": "For anything about the past: what the archive knew.",
            "properties": {
              "time": {
                "type": "string",
                "format": "date-time"
              },
              "archive_start": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "before_archive": {
                "type": "boolean"
              }
            },
            "additionalProperties": true
          },
          "gaps": {
            "type": "object",
            "description": "Unrecovered collection holes before the period. Read them before trusting history.",
            "properties": {
              "total": {
                "type": "integer"
              },
              "recent": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "from": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "to": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "status": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true
                }
              }
            },
            "additionalProperties": true
          },
          "query_ms": {
            "type": "number"
          }
        },
        "additionalProperties": true
      },
      "NotamSearchResponse": {
        "type": "object",
        "properties": {
          "notams": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Notam"
            }
          },
          "meta": {
            "$ref": "#/components/schemas/NotamMeta"
          }
        },
        "additionalProperties": true
      },
      "NotamRouteResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string",
            "description": "The answer in one sentence: how many NOTAMs, in force when, where they sit, and the caveats that apply."
          },
          "notams": {
            "type": "array",
            "items": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Notam"
                },
                {
                  "type": "object",
                  "properties": {
                    "placement": {
                      "type": "string",
                      "enum": [
                        "crosses",
                        "abeam",
                        "aerodrome",
                        "fir",
                        "unplaced"
                      ]
                    },
                    "chainage_nm": {
                      "type": "number",
                      "description": "`crosses`: where the area is entered; `abeam`: the nearest point; `aerodrome`: the fix."
                    },
                    "span_end_nm": {
                      "type": "number",
                      "description": "`crosses`: where the area is left."
                    },
                    "offset_nm": {
                      "type": "number",
                      "description": "`abeam`: distance off track."
                    },
                    "matched_by": {
                      "type": "string",
                      "enum": [
                        "corridor",
                        "aerodrome_code",
                        "affected_fir"
                      ]
                    }
                  },
                  "additionalProperties": true
                }
              ]
            }
          },
          "meta": {
            "allOf": [
              {
                "$ref": "#/components/schemas/NotamMeta"
              },
              {
                "type": "object",
                "properties": {
                  "route": {
                    "type": "object",
                    "properties": {
                      "length_nm": {
                        "type": "number"
                      },
                      "half_width_nm": {
                        "type": "number"
                      },
                      "terminal_radius_nm": {
                        "type": "number"
                      },
                      "waypoint_chainage": {
                        "type": "array",
                        "items": {
                          "type": "number"
                        }
                      },
                      "firs": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      },
                      "fir_section": {
                        "type": "string",
                        "description": "`unavailable`: the corridor touched no FIR in the archive, so FIR-wide notices are missing.",
                        "enum": [
                          "matched_by_affected_fir",
                          "unavailable"
                        ]
                      },
                      "placements": {
                        "type": "object",
                        "description": "Counts per placement.",
                        "additionalProperties": {
                          "type": "integer"
                        }
                      },
                      "vertical": {
                        "type": "object",
                        "properties": {
                          "fl_from": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          },
                          "fl_to": {
                            "type": [
                              "integer",
                              "null"
                            ]
                          }
                        },
                        "additionalProperties": true
                      }
                    },
                    "additionalProperties": true
                  }
                },
                "additionalProperties": true
              }
            ]
          },
          "resolved_route": {
            "$ref": "#/components/schemas/ResolvedRoute"
          }
        },
        "additionalProperties": true
      },
      "NotamDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Notam"
          },
          {
            "type": "object",
            "properties": {
              "schedule_decoded": {
                "type": [
                  "object",
                  "null"
                ],
                "description": "The D) field read into `kind`, `summary` and `entries`; display only.",
                "additionalProperties": true
              },
              "account_id": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "year": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "source": {
                "type": "string"
              },
              "first_seen_at": {
                "type": "string",
                "format": "date-time"
              },
              "last_seen_at": {
                "type": "string",
                "format": "date-time"
              },
              "text_geometry": {
                "type": "object",
                "description": "The geometry read out of the text (GeoJSON).",
                "additionalProperties": true
              },
              "text_geometry_kind": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "text_radius_nm": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "additionalProperties": true
          }
        ],
        "description": "Everything held about one NOTAM: geometry, area and raw renderings always included."
      },
      "NotamHistory": {
        "type": "object",
        "properties": {
          "nms_id": {
            "type": "string"
          },
          "versions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "version_id": {
                  "type": "integer"
                },
                "faa_last_updated": {
                  "type": "string",
                  "format": "date-time"
                },
                "observed_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "source": {
                  "type": "string"
                },
                "content_hash": {
                  "type": "string"
                },
                "type": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "number": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "effective_start": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "effective_end": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "estimated": {
                  "type": [
                    "boolean",
                    "null"
                  ]
                },
                "cancellation_date": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "text": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "changed_from_previous": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "text",
                      "effective_start",
                      "effective_end",
                      "cancellation_date",
                      "type"
                    ]
                  }
                }
              },
              "additionalProperties": true
            },
            "description": "Every observed version, oldest first."
          }
        },
        "additionalProperties": true
      },
      "NotamCategories": {
        "type": "object",
        "properties": {
          "categories": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "runway",
                "taxiway",
                "aerodrome",
                "lighting",
                "obstacle",
                "navaid",
                "airspace",
                "warning",
                "procedure",
                "service",
                "other"
              ]
            }
          }
        },
        "additionalProperties": true
      },
      "Location": {
        "type": "object",
        "description": "The FAA location reference row.",
        "properties": {
          "location_id": {
            "type": "string"
          },
          "icao_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "state_text": {
            "type": [
              "string",
              "null"
            ]
          },
          "center_text": {
            "type": [
              "string",
              "null"
            ]
          },
          "payload": {
            "type": "object",
            "description": "The full reference row as the FAA publishes it.",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "ReferenceMeta": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "examples": [
              "OurAirports"
            ]
          },
          "source_url": {
            "type": "string",
            "format": "uri"
          },
          "licence": {
            "type": "string",
            "examples": [
              "public domain"
            ]
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ],
            "description": "When the source file was last regenerated.",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "Airport": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "ICAO where one exists."
          },
          "ident": {
            "type": "string"
          },
          "icao_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "iata_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "gps_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "local_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "large_airport",
              "medium_airport",
              "small_airport",
              "heliport",
              "seaplane_base",
              "balloonport",
              "closed"
            ]
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "elevation_ft": {
            "type": [
              "number",
              "null"
            ]
          },
          "country": {
            "type": "string",
            "description": "ISO 3166-1."
          },
          "region": {
            "type": "string",
            "description": "ISO 3166-2."
          },
          "municipality": {
            "type": [
              "string",
              "null"
            ]
          },
          "scheduled_service": {
            "type": "boolean"
          },
          "distance_nm": {
            "type": "number",
            "description": "A position search only."
          }
        },
        "additionalProperties": true
      },
      "AirportDetail": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Airport"
          },
          {
            "type": "object",
            "properties": {
              "links": {
                "type": "object",
                "properties": {
                  "home": {
                    "type": "string",
                    "format": "uri"
                  },
                  "wikipedia": {
                    "type": "string",
                    "format": "uri"
                  }
                },
                "additionalProperties": true
              },
              "runways": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer"
                    },
                    "length_ft": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "width_ft": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "surface": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "lighted": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "closed": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "low_end": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "ident": {
                          "type": "string"
                        },
                        "lat": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "lon": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "elevation_ft": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "heading_deg_true": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "displaced_threshold_ft": {
                          "type": [
                            "number",
                            "null"
                          ]
                        }
                      }
                    },
                    "high_end": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "ident": {
                          "type": "string"
                        },
                        "lat": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "lon": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "elevation_ft": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "heading_deg_true": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "displaced_threshold_ft": {
                          "type": [
                            "number",
                            "null"
                          ]
                        }
                      }
                    }
                  },
                  "additionalProperties": true
                }
              },
              "frequencies": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string"
                    },
                    "description": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "mhz": {
                      "type": "number"
                    }
                  },
                  "additionalProperties": true
                }
              },
              "meta": {
                "$ref": "#/components/schemas/ReferenceMeta"
              }
            },
            "additionalProperties": true
          }
        ]
      },
      "AirportSearchResponse": {
        "type": "object",
        "properties": {
          "airports": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Airport"
            }
          },
          "count": {
            "type": "integer"
          },
          "meta": {
            "$ref": "#/components/schemas/ReferenceMeta"
          }
        },
        "additionalProperties": true
      },
      "AirportsStatusResponse": {
        "type": "object",
        "properties": {
          "datasets": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "rows": {
                  "type": "integer"
                },
                "source_modified_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "synced_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "checked_at": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "error": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              },
              "additionalProperties": true
            }
          },
          "nav_data": {
            "type": "array",
            "items": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/NavData"
                },
                {
                  "type": "object",
                  "properties": {
                    "in_force": {
                      "type": "boolean"
                    }
                  },
                  "additionalProperties": true
                }
              ]
            },
            "description": "The AIRAC cycles loaded that are in force today or later."
          },
          "meta": {
            "$ref": "#/components/schemas/ReferenceMeta"
          }
        },
        "additionalProperties": true
      },
      "Navaid": {
        "type": "object",
        "properties": {
          "ident": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "type": {
            "type": "string"
          },
          "frequency_khz": {
            "type": [
              "number",
              "null"
            ]
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "elevation_ft": {
            "type": [
              "number",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "dme": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "frequency_khz": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "channel": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "lat": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "lon": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "elevation_ft": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          },
          "magnetic_variation_deg": {
            "type": [
              "number",
              "null"
            ]
          },
          "slaved_variation_deg": {
            "type": [
              "number",
              "null"
            ]
          },
          "usage": {
            "type": [
              "string",
              "null"
            ],
            "description": "`LO`, `HI`, `BOTH`, `TERM`, `RNAV`."
          },
          "power": {
            "type": [
              "string",
              "null"
            ]
          },
          "associated_airport": {
            "type": [
              "string",
              "null"
            ]
          },
          "distance_nm": {
            "type": "number",
            "description": "A position search only."
          }
        },
        "additionalProperties": true
      },
      "NavaidSearchResponse": {
        "type": "object",
        "properties": {
          "navaids": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Navaid"
            }
          },
          "count": {
            "type": "integer"
          },
          "meta": {
            "$ref": "#/components/schemas/ReferenceMeta"
          }
        },
        "additionalProperties": true
      },
      "RouteResolution": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ResolvedRoute"
          },
          {
            "type": "object",
            "properties": {
              "meta": {
                "type": "object",
                "properties": {
                  "sources": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "additionalProperties": true
              }
            },
            "additionalProperties": true
          }
        ]
      },
      "WeatherMeta": {
        "type": "object",
        "description": "What the answer describes and how far to trust it.",
        "properties": {
          "returned": {
            "type": "integer"
          },
          "truncated": {
            "type": "boolean"
          },
          "time": {
            "type": "object",
            "description": "The time the answer describes.",
            "properties": {
              "semantic": {
                "type": "string",
                "enum": [
                  "latest",
                  "latest_at",
                  "history",
                  "valid_at",
                  "valid_during",
                  "flight"
                ]
              },
              "at": {
                "type": "string",
                "format": "date-time"
              },
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            },
            "additionalProperties": true
          },
          "as_of": {
            "type": "object",
            "description": "What was known: nothing first seen after `as_of.time` is used.",
            "properties": {
              "time": {
                "type": "string",
                "format": "date-time"
              },
              "archive_start": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time"
              },
              "before_archive": {
                "type": "boolean"
              }
            },
            "additionalProperties": true
          },
          "collection": {
            "type": "object",
            "description": "Per product used.",
            "additionalProperties": {
              "type": "object",
              "properties": {
                "last_successful_poll": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "age_s": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "fresh": {
                  "type": "boolean"
                }
              },
              "additionalProperties": true
            }
          },
          "gaps": {
            "type": "object",
            "description": "Holes in collection overlapping the period. Read them before trusting an answer about the past.",
            "properties": {
              "checked": {
                "type": "object",
                "properties": {
                  "from": {
                    "type": "string",
                    "format": "date-time"
                  },
                  "to": {
                    "type": "string",
                    "format": "date-time"
                  }
                },
                "additionalProperties": true
              },
              "total": {
                "type": "integer"
              },
              "recent": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "product": {
                      "type": "string"
                    },
                    "from": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "to": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "seconds": {
                      "type": "integer"
                    },
                    "status": {
                      "type": "string"
                    },
                    "notes": {
                      "type": "string"
                    }
                  },
                  "additionalProperties": true
                }
              }
            },
            "additionalProperties": true
          },
          "missing": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ids with nothing found."
          },
          "resolved": {
            "type": "object",
            "description": "Ids read as another station (`JFK` as `KJFK`).",
            "additionalProperties": {
              "type": "string"
            }
          },
          "source": {
            "type": "string"
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "rules": {
            "type": "object",
            "description": "How hazards were matched.",
            "additionalProperties": {
              "type": "string"
            }
          },
          "query_ms": {
            "type": "number"
          }
        },
        "additionalProperties": true
      },
      "Metar": {
        "type": "object",
        "properties": {
          "station": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "lat": {
            "type": [
              "number",
              "null"
            ]
          },
          "lon": {
            "type": [
              "number",
              "null"
            ]
          },
          "elevation_m": {
            "type": [
              "number",
              "null"
            ]
          },
          "observed_at": {
            "type": "string",
            "format": "date-time"
          },
          "report_type": {
            "type": "string",
            "enum": [
              "METAR",
              "SPECI"
            ]
          },
          "raw": {
            "type": "string"
          },
          "flight_category": {
            "type": [
              "string",
              "null"
            ],
            "description": "The source's."
          },
          "wind": {
            "type": "object",
            "properties": {
              "direction_deg": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "variable": {
                "type": "boolean"
              },
              "speed_kt": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "gust_kt": {
                "type": [
                  "integer",
                  "null"
                ]
              }
            },
            "additionalProperties": true
          },
          "visibility": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "statute_mi": {
                "type": "number"
              },
              "or_more": {
                "type": "boolean"
              }
            }
          },
          "ceiling_ft_agl": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Ours: the lowest broken or overcast layer, or the vertical visibility."
          },
          "vertical_visibility_ft": {
            "type": [
              "integer",
              "null"
            ]
          },
          "sky": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "cover": {
                  "type": "string"
                },
                "base_ft_agl": {
                  "type": "integer"
                },
                "cloud_type": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          },
          "temperature_c": {
            "type": [
              "number",
              "null"
            ]
          },
          "dewpoint_c": {
            "type": [
              "number",
              "null"
            ]
          },
          "altimeter_in_hg": {
            "type": [
              "number",
              "null"
            ]
          },
          "altimeter_hpa": {
            "type": [
              "number",
              "null"
            ]
          },
          "weather": {
            "type": [
              "string",
              "null"
            ]
          },
          "corrected": {
            "type": "boolean"
          },
          "auto": {
            "type": "boolean"
          },
          "decoded": {
            "type": "object",
            "description": "The rest of the source's fields.",
            "additionalProperties": true
          },
          "versions": {
            "type": "integer",
            "description": "Corrections of the same report."
          },
          "source": {
            "type": "string"
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time"
          },
          "age_minutes": {
            "type": "number",
            "description": "Without `from`/`to` only."
          }
        },
        "additionalProperties": true
      },
      "TafPeriod": {
        "type": "object",
        "description": "The base forecast or a change group.",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "change": {
            "type": [
              "string",
              "null"
            ],
            "description": "Null for the base forecast.",
            "enum": [
              "FM",
              "BECMG",
              "TEMPO",
              "PROB",
              null
            ]
          },
          "probability": {
            "type": [
              "integer",
              "null"
            ]
          },
          "becoming_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "wind": {
            "type": "object",
            "properties": {
              "direction_deg": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "variable": {
                "type": "boolean"
              },
              "speed_kt": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "gust_kt": {
                "type": [
                  "integer",
                  "null"
                ]
              }
            },
            "additionalProperties": true
          },
          "wind_shear": {
            "type": "object",
            "properties": {
              "height_ft_agl": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "direction_deg": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "speed_kt": {
                "type": [
                  "integer",
                  "null"
                ]
              }
            },
            "additionalProperties": true
          },
          "visibility": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "statute_mi": {
                "type": "number"
              },
              "or_more": {
                "type": "boolean"
              }
            }
          },
          "sky": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "cover": {
                  "type": "string"
                },
                "base_ft_agl": {
                  "type": "integer"
                },
                "cloud_type": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          },
          "vertical_visibility_ft": {
            "type": [
              "integer",
              "null"
            ]
          },
          "weather": {
            "type": [
              "string",
              "null"
            ]
          },
          "altimeter_in_hg": {
            "type": [
              "number",
              "null"
            ]
          },
          "turbulence": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "icing": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "temperatures": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "not_decoded": {
            "type": [
              "string",
              "null"
            ]
          },
          "ceiling_ft_agl": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Ours."
          },
          "flight_category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Ours, FAA thresholds."
          },
          "outside_validity": {
            "type": "boolean",
            "description": "A group whose times are a typo at source."
          },
          "in_window": {
            "type": "boolean",
            "description": "Weather route only: within `aerodrome_window_minutes` of the aircraft's time."
          }
        },
        "additionalProperties": true
      },
      "Taf": {
        "type": "object",
        "properties": {
          "station": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "lat": {
            "type": [
              "number",
              "null"
            ]
          },
          "lon": {
            "type": [
              "number",
              "null"
            ]
          },
          "elevation_m": {
            "type": [
              "number",
              "null"
            ]
          },
          "issued_at": {
            "type": "string",
            "format": "date-time"
          },
          "bulletin_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "valid_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "valid_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "covers_time": {
            "type": "boolean",
            "description": "Whether it is in force at the time asked about."
          },
          "raw": {
            "type": "string"
          },
          "amended": {
            "type": "boolean"
          },
          "corrected": {
            "type": "boolean"
          },
          "remarks": {
            "type": [
              "string",
              "null"
            ]
          },
          "periods": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TafPeriod"
            },
            "description": "The base forecast first, then the change groups by start."
          },
          "versions": {
            "type": "integer"
          },
          "source": {
            "type": "string"
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time"
          },
          "window": {
            "type": "object",
            "description": "Weather route only.",
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            },
            "additionalProperties": true
          },
          "worst_category_in_window": {
            "type": "string",
            "description": "Weather route only."
          }
        },
        "additionalProperties": true
      },
      "Hazard": {
        "type": "object",
        "description": "A SIGMET, G-AIRMET or CWA.",
        "properties": {
          "id": {
            "type": "integer"
          },
          "product": {
            "type": "string",
            "enum": [
              "sigmet_intl",
              "sigmet_us",
              "gairmet",
              "cwa"
            ]
          },
          "ident": {
            "type": "string",
            "examples": [
              "G-AIRMET TANGO 1W TURB-HI +3h"
            ]
          },
          "hazard": {
            "type": "string",
            "description": "The source code: `TS`, `TC`, `TURB-HI`, `ICE`, `IFR`, `LLWS`, ..."
          },
          "title": {
            "type": "string"
          },
          "qualifier": {
            "type": [
              "string",
              "null"
            ]
          },
          "severity": {
            "type": [
              "string",
              "null"
            ]
          },
          "issuer": {
            "type": [
              "string",
              "null"
            ]
          },
          "fir_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "fir_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "series": {
            "type": [
              "string",
              "null"
            ]
          },
          "issued_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "valid_from": {
            "type": "string",
            "format": "date-time"
          },
          "valid_to": {
            "type": "string",
            "format": "date-time"
          },
          "snapshot_at": {
            "type": "string",
            "description": "G-AIRMET.",
            "format": "date-time"
          },
          "package_expires_at": {
            "type": "string",
            "description": "G-AIRMET.",
            "format": "date-time"
          },
          "status": {
            "type": "string"
          },
          "band": {
            "type": "object",
            "properties": {
              "base_ft": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "base": {
                "type": "string",
                "enum": [
                  "given",
                  "surface",
                  "freezing_level",
                  "not_given"
                ]
              },
              "top_ft": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "top": {
                "type": "string",
                "enum": [
                  "given",
                  "not_given",
                  "assumed"
                ]
              },
              "freezing_level_ft": {
                "type": "object",
                "additionalProperties": true
              },
              "text": {
                "type": "string"
              },
              "matched_from_ft": {
                "type": "integer",
                "description": "The band a level is compared with."
              },
              "matched_to_ft": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Null: no top."
              }
            },
            "additionalProperties": true
          },
          "movement": {
            "type": "object",
            "properties": {
              "direction": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "speed_kt": {
                "type": [
                  "integer",
                  "null"
                ]
              }
            },
            "additionalProperties": true
          },
          "change": {
            "type": "string"
          },
          "due_to": {
            "type": "string"
          },
          "geometry_kind": {
            "type": "string"
          },
          "geometry_note": {
            "type": "string",
            "description": "A repair of a broken shape at source."
          },
          "geometry": {
            "type": "object",
            "description": "With `include=geometry` (`include_geometry` on a route): GeoJSON.",
            "additionalProperties": true
          },
          "raw": {
            "type": "string",
            "description": "With `include=raw`: the bulletin."
          },
          "listed": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "from": {
                  "type": "string",
                  "format": "date-time"
                },
                "last_seen": {
                  "type": "string",
                  "format": "date-time"
                },
                "until": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                }
              },
              "additionalProperties": true
            },
            "description": "When the feed carried it."
          },
          "first_seen_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "RouteHazard": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Hazard"
          },
          {
            "type": "object",
            "properties": {
              "placement": {
                "type": "string",
                "description": "`crosses`: the track enters the area; `abeam`: within the half width.",
                "enum": [
                  "crosses",
                  "abeam"
                ]
              },
              "affects": {
                "type": "boolean"
              },
              "chainage_nm": {
                "type": "number",
                "description": "NM from the first waypoint."
              },
              "offset_nm": {
                "type": "number"
              },
              "track": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "from_nm": {
                      "type": "number"
                    },
                    "to_nm": {
                      "type": "number"
                    },
                    "from_time": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "to_time": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "level_from_ft": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "level_to_ft": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "min_offset_nm": {
                      "type": "number"
                    },
                    "track_inside": {
                      "type": "boolean"
                    }
                  },
                  "additionalProperties": true
                },
                "description": "Where the aircraft is in it: in the corridor, in force and in the band."
              },
              "spatial": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "from_nm": {
                      "type": "number"
                    },
                    "to_nm": {
                      "type": "number"
                    },
                    "from_time": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "to_time": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "level_from_ft": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "level_to_ft": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "min_offset_nm": {
                      "type": "number"
                    },
                    "track_inside": {
                      "type": "boolean"
                    }
                  },
                  "additionalProperties": true
                },
                "description": "Where the corridor meets it at all."
              },
              "clear_by": {
                "type": "string",
                "description": "`hazards_clear` only: `before_valid`, `after_expiry`, `above`, ..."
              },
              "clear_reason": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        ]
      },
      "WeatherRouteResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string",
            "description": "The answer in one paragraph. Show it to people as it is."
          },
          "flight": {
            "type": "object",
            "description": "The flight as placed.",
            "properties": {
              "length_nm": {
                "type": "number"
              },
              "departure": {
                "type": "string",
                "format": "date-time"
              },
              "arrival": {
                "type": "string",
                "format": "date-time"
              },
              "duration_min": {
                "type": "number"
              },
              "half_width_nm": {
                "type": "number"
              },
              "sample_step_nm": {
                "type": "number"
              },
              "waypoints": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "index": {
                      "type": "integer"
                    },
                    "id": {
                      "type": "string"
                    },
                    "lat": {
                      "type": "number"
                    },
                    "lon": {
                      "type": "number"
                    },
                    "chainage_nm": {
                      "type": "number"
                    },
                    "time": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "time_source": {
                      "type": "string",
                      "enum": [
                        "given",
                        "departure",
                        "speed",
                        "interpolated"
                      ]
                    },
                    "alt_ft": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "level_source": {
                      "type": "string",
                      "enum": [
                        "given",
                        "interpolated",
                        "unknown"
                      ]
                    },
                    "codes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "additionalProperties": true
                }
              }
            },
            "additionalProperties": true
          },
          "hazards": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RouteHazard"
            },
            "description": "In the corridor while in force and within the band, in order along the track."
          },
          "hazards_clear": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RouteHazard"
            },
            "description": "In the corridor, but not at the aircraft's time or level."
          },
          "unplaced": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Hazard"
            },
            "description": "In force during the flight, without usable geometry."
          },
          "aerodromes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "role": {
                  "type": "string",
                  "enum": [
                    "departure",
                    "destination",
                    "alternate",
                    "enroute"
                  ]
                },
                "code": {
                  "type": "string"
                },
                "station": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "time": {
                  "type": "string",
                  "description": "When the aircraft is there.",
                  "format": "date-time"
                },
                "reference": {
                  "type": "string",
                  "description": "The instant the reports are chosen for: that time, or `as_of` when that is earlier.",
                  "format": "date-time"
                },
                "window": {
                  "type": "object",
                  "properties": {
                    "from": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "to": {
                      "type": "string",
                      "format": "date-time"
                    }
                  },
                  "additionalProperties": true
                },
                "metar": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Metar"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "taf": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/Taf"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "missing": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "waypoint_index": {
                  "type": "integer"
                }
              },
              "additionalProperties": true
            }
          },
          "pireps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer"
                },
                "observed_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "report_type": {
                  "type": "string"
                },
                "aircraft": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "raw": {
                  "type": "string"
                },
                "lat": {
                  "type": "number"
                },
                "lon": {
                  "type": "number"
                },
                "altitude_ft": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "chainage_nm": {
                  "type": "number"
                },
                "offset_nm": {
                  "type": "number"
                },
                "aircraft_passes_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "aircraft_level_ft": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "level_diff_ft": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "significant": {
                  "type": "boolean"
                },
                "turbulence": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  }
                },
                "icing": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": true
                  }
                },
                "weather": {
                  "type": "string"
                },
                "temperature_c": {
                  "type": "number"
                }
              },
              "additionalProperties": true
            },
            "description": "Aircraft reports (PIREPs and AIREPs) near the track."
          },
          "meta": {
            "$ref": "#/components/schemas/WeatherMeta"
          },
          "resolved_route": {
            "$ref": "#/components/schemas/ResolvedRoute"
          }
        },
        "additionalProperties": true
      },
      "MetarResponse": {
        "type": "object",
        "properties": {
          "metars": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Metar"
            }
          },
          "meta": {
            "$ref": "#/components/schemas/WeatherMeta"
          }
        },
        "additionalProperties": true
      },
      "TafResponse": {
        "type": "object",
        "properties": {
          "tafs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Taf"
            }
          },
          "meta": {
            "$ref": "#/components/schemas/WeatherMeta"
          }
        },
        "additionalProperties": true
      },
      "HazardResponse": {
        "type": "object",
        "properties": {
          "hazards": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Hazard"
            }
          },
          "meta": {
            "$ref": "#/components/schemas/WeatherMeta"
          }
        },
        "additionalProperties": true
      },
      "PingResponse": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "key": {
            "type": "string",
            "description": "The key's display prefix."
          },
          "organization": {
            "type": "string",
            "description": "The organisation's slug."
          },
          "time": {
            "type": "string",
            "description": "Server time.",
            "format": "date-time"
          }
        },
        "additionalProperties": true
      },
      "RaimPoint": {
        "type": "object",
        "description": "A point to predict at. Give `phase` or `hal_nm`, not both. A field not listed here is refused with 422 `validation`.",
        "required": [
          "lat",
          "lon",
          "time"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Echoed back; default `p1`, `p2`, ..."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "alt_m": {
            "type": "number",
            "description": "Default 0.",
            "minimum": -1000,
            "maximum": 100000,
            "default": 0
          },
          "time": {
            "type": "string",
            "description": "The centre of the window.",
            "format": "date-time"
          },
          "phase": {
            "$ref": "#/components/schemas/RaimPhase"
          },
          "hal_nm": {
            "type": "number",
            "description": "The alert limit in NM, instead of a phase.",
            "exclusiveMinimum": 0,
            "maximum": 20
          }
        },
        "additionalProperties": false,
        "oneOf": [
          {
            "required": [
              "phase"
            ]
          },
          {
            "required": [
              "hal_nm"
            ]
          }
        ]
      },
      "RaimPredictRequest": {
        "type": "object",
        "description": "Unknown fields are refused with 400 `unknown_field`.",
        "required": [
          "points"
        ],
        "properties": {
          "window_minutes": {
            "type": "integer",
            "description": "Each side of the point's `time`.",
            "minimum": 0,
            "maximum": 720,
            "default": 60
          },
          "step_seconds": {
            "type": "integer",
            "description": "Seconds between epochs. Default 60; the `faa-c129`, `faa-c129-sa` and `augur` profiles set 60.",
            "minimum": 30,
            "maximum": 3600
          },
          "mask_deg": {
            "type": "number",
            "description": "Elevation mask in degrees. Default 5.",
            "minimum": 0,
            "maximum": 45
          },
          "fde": {
            "type": "boolean",
            "description": "Default true; false means FD only. The `faa-c129`, `faa-c129-sa` and `augur` profiles set false."
          },
          "baro": {
            "type": "boolean",
            "description": "Add an altitude pseudo-measurement.",
            "default": false
          },
          "sa": {
            "type": "boolean",
            "description": "The TSO-C129 Selective Availability receiver class, a much larger error budget.",
            "default": false
          },
          "profile": {
            "$ref": "#/components/schemas/RaimProfile"
          },
          "constellations": {
            "$ref": "#/components/schemas/RaimConstellations"
          },
          "min_outage_minutes": {
            "type": "integer",
            "description": "Outages shorter than this are ignored for the dispatch verdict. Default: the profile's (0 for `do229`, 5 for the others).",
            "minimum": 0,
            "maximum": 720
          },
          "outages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageInput"
            },
            "description": "Extra satellite outages to apply."
          },
          "detail": {
            "type": "boolean",
            "description": "True adds per-epoch arrays to each point.",
            "default": false
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimPoint"
            },
            "minItems": 1,
            "maxItems": 500
          }
        },
        "additionalProperties": false
      },
      "RaimTrajectoryRequest": {
        "type": "object",
        "description": "One position over time. Give `phase` or `hal_nm`, not both. Unknown fields are refused with 400 `unknown_field`.",
        "required": [
          "lat",
          "lon",
          "start"
        ],
        "properties": {
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "alt_m": {
            "type": "number",
            "description": "Default 0.",
            "minimum": -1000,
            "maximum": 100000,
            "default": 0
          },
          "start": {
            "type": "string",
            "description": "Start of the run.",
            "format": "date-time"
          },
          "hours": {
            "type": "number",
            "description": "Length of the run, up to 72 h (an AUGUR scenario).",
            "exclusiveMinimum": 0,
            "maximum": 72,
            "default": 24
          },
          "step_seconds": {
            "type": "integer",
            "description": "Seconds between epochs. Default 300; the `faa-c129`, `faa-c129-sa` and `augur` profiles set 60.",
            "minimum": 30,
            "maximum": 3600
          },
          "mask_deg": {
            "type": "number",
            "description": "Elevation mask in degrees. Default 5.",
            "minimum": 0,
            "maximum": 45
          },
          "fde": {
            "type": "boolean",
            "description": "Default true; false means FD only. The `faa-c129`, `faa-c129-sa` and `augur` profiles set false."
          },
          "baro": {
            "type": "boolean",
            "description": "Add an altitude pseudo-measurement.",
            "default": false
          },
          "sa": {
            "type": "boolean",
            "description": "The TSO-C129 Selective Availability receiver class, a much larger error budget.",
            "default": false
          },
          "profile": {
            "$ref": "#/components/schemas/RaimProfile"
          },
          "constellations": {
            "$ref": "#/components/schemas/RaimConstellations"
          },
          "min_outage_minutes": {
            "type": "integer",
            "description": "Outages shorter than this are ignored for the dispatch verdict. Default: the profile's (0 for `do229`, 5 for the others).",
            "minimum": 0,
            "maximum": 720
          },
          "outages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageInput"
            },
            "description": "Extra satellite outages to apply."
          },
          "hal_nm": {
            "type": "number",
            "description": "The alert limit in NM.",
            "exclusiveMinimum": 0,
            "maximum": 20
          },
          "phase": {
            "$ref": "#/components/schemas/RaimPhase"
          },
          "geometry": {
            "type": "boolean",
            "description": "Include `passes[]`, the satellite geometry for plotting.",
            "default": true
          }
        },
        "additionalProperties": false,
        "oneOf": [
          {
            "required": [
              "phase"
            ]
          },
          {
            "required": [
              "hal_nm"
            ]
          }
        ]
      },
      "RaimMapRequest": {
        "type": "object",
        "description": "Unavailability minutes on a lat/lon grid. Give `phase` or `hal_nm`, not both. Unknown fields are refused with 400 `unknown_field`.",
        "properties": {
          "start": {
            "type": "string",
            "description": "Start of the map; default 00:00Z today. A past day picks up the almanac and NANUs of that day.",
            "format": "date-time"
          },
          "hours": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 72,
            "default": 24
          },
          "grid_deg": {
            "type": "number",
            "description": "Cell size in degrees.",
            "minimum": 0.5,
            "maximum": 10,
            "default": 2
          },
          "lat_min": {
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "default": -90
          },
          "lat_max": {
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "default": 90
          },
          "alt_m": {
            "type": "number",
            "minimum": -1000,
            "maximum": 100000,
            "default": 0
          },
          "step_seconds": {
            "type": "integer",
            "description": "Seconds between epochs. Default 300; the `faa-c129`, `faa-c129-sa` and `augur` profiles set 60.",
            "minimum": 30,
            "maximum": 3600
          },
          "mask_deg": {
            "type": "number",
            "description": "Elevation mask in degrees. Default 5.",
            "minimum": 0,
            "maximum": 45
          },
          "fde": {
            "type": "boolean",
            "description": "Default true; false means FD only. The `faa-c129`, `faa-c129-sa` and `augur` profiles set false."
          },
          "baro": {
            "type": "boolean",
            "description": "Add an altitude pseudo-measurement.",
            "default": false
          },
          "sa": {
            "type": "boolean",
            "description": "The TSO-C129 Selective Availability receiver class, a much larger error budget.",
            "default": false
          },
          "profile": {
            "$ref": "#/components/schemas/RaimProfile"
          },
          "constellations": {
            "$ref": "#/components/schemas/RaimConstellations"
          },
          "min_outage_minutes": {
            "type": "integer",
            "description": "Count only runs of at least this many minutes. Default 0 on the map, whatever the profile: every unavailable minute counts, as on the FAA plot.",
            "minimum": 0,
            "maximum": 720
          },
          "outages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageInput"
            },
            "description": "Extra satellite outages to apply."
          },
          "hal_nm": {
            "type": "number",
            "description": "The alert limit in NM; 0.1 or 0.3 to match the FAA plot.",
            "exclusiveMinimum": 0,
            "maximum": 20
          },
          "phase": {
            "$ref": "#/components/schemas/RaimPhase"
          },
          "top_cells": {
            "type": "integer",
            "description": "How many of the worst cells to list.",
            "default": 15
          }
        },
        "additionalProperties": false,
        "oneOf": [
          {
            "required": [
              "phase"
            ]
          },
          {
            "required": [
              "hal_nm"
            ]
          }
        ]
      },
      "RaimRouteOptions": {
        "type": "object",
        "description": "The RAIM route check's own options, beside the flight object.",
        "properties": {
          "window_minutes": {
            "type": "integer",
            "description": "How far the departure may slip each side of the planned times; 0 checks the planned times only. The cost, departures times samples, is at most 250,000 per request.",
            "minimum": 0,
            "maximum": 720,
            "default": 0
          },
          "detail": {
            "type": "boolean",
            "description": "True adds `samples_detail` (and `window_detail` with a window).",
            "default": false
          },
          "step_seconds": {
            "type": "integer",
            "description": "Seconds between epochs. Default 60; the `faa-c129`, `faa-c129-sa` and `augur` profiles set 60.",
            "minimum": 30,
            "maximum": 3600
          },
          "mask_deg": {
            "type": "number",
            "description": "Elevation mask in degrees. Default 5.",
            "minimum": 0,
            "maximum": 45
          },
          "fde": {
            "type": "boolean",
            "description": "Default true; false means FD only. The `faa-c129`, `faa-c129-sa` and `augur` profiles set false."
          },
          "baro": {
            "type": "boolean",
            "description": "Add an altitude pseudo-measurement.",
            "default": false
          },
          "sa": {
            "type": "boolean",
            "description": "The TSO-C129 Selective Availability receiver class, a much larger error budget.",
            "default": false
          },
          "profile": {
            "$ref": "#/components/schemas/RaimProfile"
          },
          "constellations": {
            "$ref": "#/components/schemas/RaimConstellations"
          },
          "min_outage_minutes": {
            "type": "integer",
            "description": "Outages shorter than this are ignored for the dispatch verdict. Default: the profile's (0 for `do229`, 5 for the others).",
            "minimum": 0,
            "maximum": 720
          },
          "outages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RaimOutageInput"
            },
            "description": "Extra satellite outages to apply."
          }
        }
      },
      "NotamRouteOptions": {
        "type": "object",
        "description": "The NOTAM route's own options, beside the flight object.",
        "properties": {
          "half_width_nm": {
            "type": "number",
            "description": "Corridor half width.",
            "exclusiveMinimum": 0,
            "maximum": 200,
            "default": 5
          },
          "terminal_radius_nm": {
            "type": "number",
            "description": "Circle around each waypoint.",
            "exclusiveMinimum": 0,
            "maximum": 200,
            "default": 10
          },
          "fl_from": {
            "type": "integer",
            "description": "Flight level band; only a clean three-digit Q-line pair can exclude a NOTAM."
          },
          "fl_to": {
            "type": "integer"
          },
          "from": {
            "type": "string",
            "description": "In-force window. With `from` or `to` the window is theirs (one alone is an instant); without them, the flight's own window when it is timed, else the live set.",
            "format": "date-time"
          },
          "to": {
            "type": "string",
            "format": "date-time"
          },
          "classifications": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "`DOM`, `INTL`, `MIL`, `FDC`, `LMIL`."
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "runway",
                "taxiway",
                "aerodrome",
                "lighting",
                "obstacle",
                "navaid",
                "airspace",
                "warning",
                "procedure",
                "service",
                "other"
              ]
            }
          },
          "q": {
            "type": "string",
            "description": "Substring over text, number and locations."
          },
          "limit": {
            "type": "integer",
            "description": "Up to 500.",
            "maximum": 500,
            "default": 500
          },
          "include_area": {
            "type": "boolean",
            "default": false
          },
          "include_geometry": {
            "type": "boolean",
            "default": false
          },
          "include_raw": {
            "type": "boolean",
            "default": false
          },
          "collapse": {
            "type": "boolean",
            "description": "One entry for the same notice issued under two numbers.",
            "default": true
          }
        }
      },
      "WeatherRouteOptions": {
        "type": "object",
        "description": "The weather route's own options, beside the flight object.",
        "properties": {
          "alternates": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "METAR and TAF at the destination ETA.",
            "maxItems": 10
          },
          "half_width_nm": {
            "type": "number",
            "description": "Corridor half width; default 20, the FAA's distance to keep from a thunderstorm.",
            "minimum": 1,
            "maximum": 100,
            "default": 20
          },
          "as_of": {
            "type": "string",
            "description": "Replay with only what was known then; not in the future.",
            "format": "date-time"
          },
          "types": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "sigmet",
                "sigmet_intl",
                "sigmet_us",
                "gairmet",
                "cwa"
              ]
            },
            "description": "As `types` on `GET /weather/hazards`."
          },
          "hazards": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "As `hazard` on `GET /weather/hazards`."
          },
          "pireps": {
            "type": "string",
            "description": "`all` adds routine wind and temperature AIREPs.",
            "enum": [
              "significant",
              "all",
              "none"
            ],
            "default": "significant"
          },
          "pirep_radius_nm": {
            "type": "number",
            "minimum": 1,
            "maximum": 200,
            "default": 50
          },
          "pirep_lookback_minutes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 720,
            "default": 90
          },
          "pirep_level_band_ft": {
            "type": "number",
            "description": "A report further than this from the aircraft's level there is left out.",
            "default": 4000
          },
          "aerodrome_window_minutes": {
            "type": "integer",
            "description": "TAF groups within this of the aircraft's time are marked `in_window`. 0 is read as the default.",
            "minimum": 0,
            "maximum": 360,
            "default": 60
          },
          "include_geometry": {
            "type": "boolean",
            "default": false
          },
          "include_raw": {
            "type": "boolean",
            "description": "The hazard bulletins.",
            "default": true
          }
        }
      },
      "RaimRouteRequest": {
        "oneOf": [
          {
            "title": "Route string",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByRoute"
              },
              {
                "$ref": "#/components/schemas/RaimRouteOptions"
              }
            ],
            "unevaluatedProperties": false
          },
          {
            "title": "Waypoints",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByWaypoints"
              },
              {
                "$ref": "#/components/schemas/RaimRouteOptions"
              },
              {
                "properties": {
                  "waypoints": {
                    "maxItems": 500
                  }
                }
              }
            ],
            "unevaluatedProperties": false
          }
        ],
        "description": "The flight object (route string or waypoints) and this endpoint's options. Anything else is refused with 400 `unknown_field`."
      },
      "NotamRouteRequest": {
        "oneOf": [
          {
            "title": "Route string",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByRoute"
              },
              {
                "$ref": "#/components/schemas/NotamRouteOptions"
              }
            ],
            "unevaluatedProperties": false
          },
          {
            "title": "Waypoints",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByWaypoints"
              },
              {
                "$ref": "#/components/schemas/NotamRouteOptions"
              },
              {
                "properties": {
                  "waypoints": {
                    "maxItems": 200
                  }
                }
              }
            ],
            "unevaluatedProperties": false
          }
        ],
        "description": "The flight object (route string or waypoints) and this endpoint's options. Anything else is refused with 400 `unknown_field`."
      },
      "WeatherRouteRequest": {
        "oneOf": [
          {
            "title": "Route string",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByRoute"
              },
              {
                "$ref": "#/components/schemas/WeatherRouteOptions"
              }
            ],
            "unevaluatedProperties": false
          },
          {
            "title": "Waypoints",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByWaypoints"
              },
              {
                "$ref": "#/components/schemas/WeatherRouteOptions"
              },
              {
                "properties": {
                  "waypoints": {
                    "maxItems": 200
                  }
                }
              }
            ],
            "unevaluatedProperties": false
          }
        ],
        "description": "The flight object (route string or waypoints) and this endpoint's options. Anything else is refused with 400 `unknown_field`."
      },
      "BriefingOptions": {
        "type": "object",
        "properties": {
          "parts": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "raim",
                "notams",
                "weather",
                "airspace"
              ]
            },
            "minItems": 1,
            "maxItems": 4,
            "uniqueItems": true,
            "description": "The parts to run. Default: all four. Each counts as one request of its own service."
          },
          "window_minutes": {
            "type": "integer",
            "minimum": 0,
            "maximum": 720,
            "default": 0,
            "description": "For the RAIM part: how far the departure may slip each side of the planned times, as on POST /v1/raim/route."
          },
          "profile": {
            "$ref": "#/components/schemas/RaimProfile"
          },
          "alternates": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 10,
            "description": "For the weather part: alternate aerodromes (ICAO codes), METAR and TAF at the destination ETA."
          },
          "format": {
            "type": "string",
            "enum": [
              "full",
              "compact"
            ],
            "default": "full",
            "description": "compact keeps what a crew acts on (summaries, outages and the departure window, each NOTAM with its full text and place on the route, hazards without their geometry) for poor connections."
          },
          "known": {
            "type": "object",
            "description": "The etag of each section you already hold (raim, notams, weather, airspace). A section whose etag still matches comes back as {etag, unchanged: true}, so a refresh en route only carries what changed.",
            "properties": {
              "raim": {
                "type": "string"
              },
              "notams": {
                "type": "string"
              },
              "weather": {
                "type": "string"
              },
              "airspace": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        }
      },
      "BriefingRequest": {
        "oneOf": [
          {
            "title": "Route string",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByRoute"
              },
              {
                "$ref": "#/components/schemas/BriefingOptions"
              }
            ],
            "unevaluatedProperties": false
          },
          {
            "title": "Waypoints",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByWaypoints"
              },
              {
                "$ref": "#/components/schemas/BriefingOptions"
              },
              {
                "properties": {
                  "waypoints": {
                    "maxItems": 500
                  }
                }
              }
            ],
            "unevaluatedProperties": false
          }
        ],
        "description": "The flight object (route string or waypoints) and the pack's options. Anything else is refused with 400 `unknown_field`; for finer control call the route endpoints."
      },
      "BriefingResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string",
            "description": "Each part's own summary sentence, RAIM first; a part that failed says so."
          },
          "resolved_route": {
            "$ref": "#/components/schemas/ResolvedRoute"
          },
          "raim": {
            "oneOf": [
              {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/RaimRouteResponse"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "etag": {
                        "type": "string",
                        "description": "Send it back in `known` to skip this part when it has not changed."
                      }
                    }
                  }
                ]
              },
              {
                "type": "object",
                "title": "Unchanged",
                "properties": {
                  "etag": {
                    "type": "string"
                  },
                  "unchanged": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "required": [
                  "etag",
                  "unchanged"
                ]
              },
              {
                "type": "object",
                "title": "Not available",
                "description": "This part failed; the rest of the pack stands.",
                "properties": {
                  "etag": {
                    "type": "string"
                  },
                  "status": {
                    "type": "integer"
                  },
                  "error": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  }
                },
                "required": [
                  "etag",
                  "status",
                  "error",
                  "message"
                ]
              }
            ]
          },
          "notams": {
            "oneOf": [
              {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/NotamRouteResponse"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "etag": {
                        "type": "string",
                        "description": "Send it back in `known` to skip this part when it has not changed."
                      }
                    }
                  }
                ]
              },
              {
                "type": "object",
                "title": "Unchanged",
                "properties": {
                  "etag": {
                    "type": "string"
                  },
                  "unchanged": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "required": [
                  "etag",
                  "unchanged"
                ]
              },
              {
                "type": "object",
                "title": "Not available",
                "description": "This part failed; the rest of the pack stands.",
                "properties": {
                  "etag": {
                    "type": "string"
                  },
                  "status": {
                    "type": "integer"
                  },
                  "error": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  }
                },
                "required": [
                  "etag",
                  "status",
                  "error",
                  "message"
                ]
              }
            ]
          },
          "weather": {
            "oneOf": [
              {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/WeatherRouteResponse"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "etag": {
                        "type": "string",
                        "description": "Send it back in `known` to skip this part when it has not changed."
                      }
                    }
                  }
                ]
              },
              {
                "type": "object",
                "title": "Unchanged",
                "properties": {
                  "etag": {
                    "type": "string"
                  },
                  "unchanged": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "required": [
                  "etag",
                  "unchanged"
                ]
              },
              {
                "type": "object",
                "title": "Not available",
                "description": "This part failed; the rest of the pack stands.",
                "properties": {
                  "etag": {
                    "type": "string"
                  },
                  "status": {
                    "type": "integer"
                  },
                  "error": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  }
                },
                "required": [
                  "etag",
                  "status",
                  "error",
                  "message"
                ]
              }
            ]
          },
          "generated_at": {
            "type": "string",
            "format": "date-time"
          },
          "airspace": {
            "oneOf": [
              {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/AirspaceRouteResponse"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "etag": {
                        "type": "string",
                        "description": "Send it back in `known` to skip this part when it has not changed."
                      }
                    }
                  }
                ]
              },
              {
                "type": "object",
                "title": "Unchanged",
                "properties": {
                  "etag": {
                    "type": "string"
                  },
                  "unchanged": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "required": [
                  "etag",
                  "unchanged"
                ]
              },
              {
                "type": "object",
                "title": "Not available",
                "description": "This part failed; the rest of the pack stands.",
                "properties": {
                  "etag": {
                    "type": "string"
                  },
                  "status": {
                    "type": "integer"
                  },
                  "error": {
                    "type": "string"
                  },
                  "message": {
                    "type": "string"
                  }
                },
                "required": [
                  "etag",
                  "status",
                  "error",
                  "message"
                ]
              }
            ]
          }
        },
        "required": [
          "summary",
          "raim",
          "notams",
          "weather",
          "generated_at"
        ]
      },
      "AlertOptions": {
        "type": "object",
        "required": [
          "webhook_url"
        ],
        "properties": {
          "webhook_url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2000,
            "description": "Where the calls go: an https URL on the standard port, whose host resolves only to public addresses. Redirects are not followed.",
            "examples": [
              "https://ops.example.com/hooks/bravoecho"
            ]
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "raim",
                "notams",
                "weather",
                "airspace"
              ]
            },
            "minItems": 1,
            "maxItems": 4,
            "default": [
              "raim",
              "notams"
            ],
            "description": "What to watch. raim: the dispatch verdict, the outages and, with `window_minutes`, the departure window. notams: a NOTAM along the route added, withdrawn, or changed in its text or validity. weather: a hazard along the route added or gone. airspace: a TFR issued or lifted on the route, or a TFR without a shape added or gone. A watch that includes raim counts as one RAIM request when it is made; without raim the RAIM check never runs."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the watch ends, within the next 7 days. Default: two hours after the flight's last timed point, or one day for a flight without times."
          },
          "window_minutes": {
            "type": "integer",
            "minimum": 0,
            "maximum": 120,
            "default": 0,
            "description": "For the RAIM part: how far the departure may slip each side of the planned times, as on POST /v1/raim/route, up to 120 minutes for an alert."
          },
          "profile": {
            "$ref": "#/components/schemas/RaimProfile"
          }
        }
      },
      "AlertRequest": {
        "oneOf": [
          {
            "title": "Route string",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByRoute"
              },
              {
                "$ref": "#/components/schemas/AlertOptions"
              }
            ],
            "unevaluatedProperties": false
          },
          {
            "title": "Waypoints",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByWaypoints"
              },
              {
                "$ref": "#/components/schemas/AlertOptions"
              },
              {
                "properties": {
                  "waypoints": {
                    "maxItems": 500
                  }
                }
              }
            ],
            "unevaluatedProperties": false
          }
        ],
        "description": "The flight object (route string or waypoints), the webhook and what to watch. Anything else is refused with 400 `unknown_field`."
      },
      "Alert": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^alr_[0-9a-z]{26}$",
            "examples": [
              "alr_01k7f3x9q2m4n8p6r0s2t4v6w8"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "stopped",
              "expired",
              "failing"
            ],
            "description": "active: checked every 15 minutes. stopped: you stopped it, or the key that made it was revoked or expired. expired: past `expires_at`. failing: the webhook failed 10 calls in a row, so the checks stopped; make a new watch once it answers again."
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "raim",
                "notams",
                "weather",
                "airspace"
              ]
            }
          },
          "webhook_url": {
            "type": "string"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "flight": {
            "type": "object",
            "description": "The flight object as you sent it."
          },
          "options": {
            "type": "object",
            "description": "`window_minutes` and `profile`, when given."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "last_checked_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "last_change_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When a change was last delivered."
          },
          "last_error": {
            "type": [
              "object",
              "null"
            ],
            "description": "Why the last check could not run, or which part failed; null once a check runs clean.",
            "properties": {
              "at": {
                "type": "string",
                "format": "date-time"
              },
              "part": {
                "type": "string",
                "enum": [
                  "raim",
                  "notams",
                  "weather"
                ]
              },
              "status": {
                "type": "integer"
              },
              "error": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            }
          },
          "last_delivery": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "at": {
                "type": "string",
                "format": "date-time"
              },
              "status": {
                "type": "integer",
                "description": "The HTTP status your webhook answered, 0 when it could not be reached."
              }
            }
          },
          "deliveries": {
            "type": "integer",
            "description": "Calls made to the webhook, failed ones included."
          }
        },
        "required": [
          "id",
          "status",
          "events",
          "webhook_url",
          "expires_at",
          "flight",
          "created_at",
          "deliveries"
        ]
      },
      "AlertCreated": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Alert"
          },
          {
            "type": "object",
            "properties": {
              "secret": {
                "type": "string",
                "description": "Signs every call to the webhook (`BravoEcho-Signature`). Shown this once; keep it like a password.",
                "examples": [
                  "whsec_..."
                ]
              }
            },
            "required": [
              "secret"
            ]
          }
        ]
      },
      "AlertList": {
        "type": "object",
        "properties": {
          "alerts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Alert"
            },
            "description": "The organisation's watches, newest first, at most 100."
          }
        },
        "required": [
          "alerts"
        ]
      },
      "AlertCall": {
        "type": "object",
        "description": "The body of a call to your webhook. Each watched part is the briefing pack's compact form of it (POST /v1/briefing with `format: compact`), without the etag.",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique to each call; a call made again after a failure has its own id.",
            "examples": [
              "evt_01k7f9b2c4d6e8g0h2j4k6m8n0"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "alert.started",
              "alert.changed"
            ],
            "description": "alert.started: the first check, with the situation as it stands. alert.changed: a watched part changed."
          },
          "alert": {
            "type": "string",
            "description": "The watch's id."
          },
          "created": {
            "type": "string",
            "format": "date-time"
          },
          "changed": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "raim",
                "notams",
                "weather",
                "airspace"
              ]
            },
            "description": "The parts that changed; empty for alert.started."
          },
          "summary": {
            "type": "string",
            "description": "The briefing pack's summary: each part's own sentence."
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          },
          "raim": {
            "type": "object",
            "description": "When watched: summary, dispatch, outages, worst, warnings and, with `window_minutes`, the departure window."
          },
          "notams": {
            "type": "object",
            "description": "When watched: summary, each NOTAM with its full text and place on the route, and the archive's caveats."
          },
          "weather": {
            "type": "object",
            "description": "When watched: summary, aerodromes and hazards without their geometry."
          },
          "airspace": {
            "type": "object",
            "description": "When watched: summary, the airspace entered with its limits and where the aircraft is inside, the near ones counted, and the TFRs without a shape."
          }
        },
        "required": [
          "id",
          "type",
          "alert",
          "created",
          "changed",
          "summary",
          "expires_at"
        ]
      },
      "AirspaceRouteOptions": {
        "type": "object",
        "properties": {
          "half_width_nm": {
            "type": "number",
            "minimum": 1,
            "maximum": 50,
            "default": 5,
            "description": "Airspace within this distance of the track that the flight does not enter is listed as near."
          },
          "kinds": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "prohibited",
                "restricted",
                "warning",
                "alert",
                "moa",
                "danger",
                "class_b",
                "class_c",
                "class_d",
                "tfr"
              ]
            },
            "description": "Only these kinds of airspace. Default: all."
          },
          "as_of": {
            "type": "string",
            "format": "date-time",
            "description": "Replay: only the TFRs known at this time."
          },
          "include_geometry": {
            "type": "boolean",
            "default": false,
            "description": "Each airspace's area as GeoJSON."
          }
        }
      },
      "AirspaceRouteRequest": {
        "oneOf": [
          {
            "title": "Route string",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByRoute"
              },
              {
                "$ref": "#/components/schemas/AirspaceRouteOptions"
              }
            ],
            "unevaluatedProperties": false
          },
          {
            "title": "Waypoints",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByWaypoints"
              },
              {
                "$ref": "#/components/schemas/AirspaceRouteOptions"
              },
              {
                "properties": {
                  "waypoints": {
                    "maxItems": 200
                  }
                }
              }
            ],
            "unevaluatedProperties": false
          }
        ],
        "description": "The flight object (route string or waypoints) and the airspace options. Anything else is refused with 400 `unknown_field`."
      },
      "AirspaceLimit": {
        "type": "object",
        "properties": {
          "ft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "As published, in its own reference: 18000 for FL180, 3000 for 3000 ft AGL, 0 for the surface; null when unlimited."
          },
          "ref": {
            "type": "string",
            "enum": [
              "SFC",
              "MSL",
              "AGL",
              "FL",
              "UNL"
            ]
          },
          "text": {
            "type": "string",
            "description": "As published: SFC, 6400 ft MSL, FL180, 3000 ft AGL, unlimited."
          },
          "inclusive": {
            "type": "boolean",
            "description": "Whether the limit level itself belongs to the airspace: false for 'to but not including' and 'above but not including'."
          },
          "matched_ft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "The level the placement matched, in feet above sea level (flight levels as pressure altitude); an AGL limit is widened by the highest terrain in its state. Null when unlimited."
          }
        }
      },
      "AirspaceEntry": {
        "type": "object",
        "description": "A stretch of the track where the aircraft is inside the airspace.",
        "properties": {
          "from_nm": {
            "type": "number"
          },
          "to_nm": {
            "type": "number"
          },
          "from_time": {
            "type": "string",
            "format": "date-time"
          },
          "to_time": {
            "type": "string",
            "format": "date-time"
          },
          "level_from_ft": {
            "type": [
              "number",
              "null"
            ]
          },
          "level_to_ft": {
            "type": [
              "number",
              "null"
            ]
          },
          "track_inside": {
            "type": "boolean"
          }
        }
      },
      "AirspaceTfr": {
        "type": "object",
        "properties": {
          "notam": {
            "type": "string",
            "examples": [
              "6/9299"
            ]
          },
          "type": {
            "type": "string",
            "examples": [
              "HAZARDS"
            ]
          },
          "rule": {
            "type": [
              "string",
              "null"
            ],
            "examples": [
              "91.137(a)(1)"
            ]
          },
          "effective_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "effective_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "null: until further notice."
          },
          "schedule": {
            "type": [
              "string",
              "null"
            ]
          },
          "text": {
            "type": [
              "string",
              "null"
            ],
            "description": "The NOTAM text."
          },
          "area": {
            "type": [
              "string",
              "null"
            ]
          },
          "shape": {
            "type": "string",
            "enum": [
              "published",
              "merged"
            ],
            "description": "published: drawn from the area's own definition; merged: the FAA's outline of the whole TFR."
          }
        }
      },
      "Airspace": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "source": {
            "type": "string",
            "enum": [
              "faa_sua",
              "faa_class",
              "faa_tfr"
            ]
          },
          "kind": {
            "type": "string",
            "enum": [
              "prohibited",
              "restricted",
              "warning",
              "alert",
              "moa",
              "danger",
              "class_b",
              "class_c",
              "class_d",
              "tfr"
            ]
          },
          "name": {
            "type": "string"
          },
          "ident": {
            "type": [
              "string",
              "null"
            ]
          },
          "lower": {
            "$ref": "#/components/schemas/AirspaceLimit"
          },
          "upper": {
            "$ref": "#/components/schemas/AirspaceLimit"
          },
          "times_of_use": {
            "type": [
              "string",
              "null"
            ],
            "description": "Published times of use. Whether special use airspace is active is not known here: check NOTAMs or the controlling agency."
          },
          "controlling": {
            "type": [
              "string",
              "null"
            ]
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "state": {
            "type": [
              "string",
              "null"
            ]
          },
          "tfr": {
            "$ref": "#/components/schemas/AirspaceTfr"
          },
          "placement": {
            "type": "string",
            "enum": [
              "enters",
              "near"
            ]
          },
          "chainage_nm": {
            "type": "number",
            "description": "Along the track from the first point: the first entry, or where the corridor first meets the area."
          },
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AirspaceEntry"
            }
          },
          "min_offset_nm": {
            "type": "number"
          },
          "clear_by": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "level",
              "time",
              "distance",
              null
            ]
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "geometry": {
            "type": "object",
            "description": "GeoJSON, with include_geometry."
          }
        }
      },
      "AirspaceRouteResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string"
          },
          "airspaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Airspace"
            },
            "description": "Entered ones in order along the track, then the near ones."
          },
          "unplaced": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "source": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                },
                "notam": {
                  "type": "string"
                },
                "area": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "location": {
                  "type": "string",
                  "description": "The NOTAM location: an ARTCC (ZDC), or FDC or ZZZ for a national notice."
                },
                "scope": {
                  "type": "string",
                  "enum": [
                    "artcc",
                    "national",
                    "area"
                  ],
                  "description": "artcc: issued for an ARTCC the route passes through (named in `artcc`). national: a nationwide notice, listed for every flight in or near US airspace. area: a shape near the route that cannot be read."
                },
                "artcc": {
                  "type": "string",
                  "description": "For scope artcc, the centre the notice was issued for."
                },
                "text": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "why": {
                  "type": "string"
                }
              }
            },
            "description": "TFRs in force during the flight with no published shape: those issued for an ARTCC the route passes through, and the national ones. An ARTCC notice for a centre the route does not pass through is left out and counted in meta.unplaced_filter."
          },
          "flight": {
            "type": "object",
            "properties": {
              "length_nm": {
                "type": "number"
              },
              "departure": {
                "type": "string",
                "format": "date-time"
              },
              "arrival": {
                "type": "string",
                "format": "date-time"
              },
              "half_width_nm": {
                "type": "number"
              },
              "sample_step_nm": {
                "type": "number"
              },
              "fixes": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Each fix with its chainage, time and level, and where those came from."
              }
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "as_of": {
                "type": "object"
              },
              "sources": {
                "type": "object",
                "description": "When each FAA dataset was edited and imported (the ARTCC boundaries as faa_artcc); when the TFR feed was last polled."
              },
              "truncated": {
                "type": "boolean",
                "description": "More airspace met the corridor than one answer lists."
              },
              "caveats": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "unplaced_filter": {
                "type": "object",
                "description": "How TFRs without a shape were picked, when TFRs are asked for. applied is false until the ARTCC boundaries are loaded, and then every notice is listed.",
                "properties": {
                  "applied": {
                    "type": "boolean"
                  },
                  "route_artccs": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "The ARTCCs the track enters."
                  },
                  "near_artccs": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "ARTCCs within half_width_nm of the track, not entered."
                  },
                  "us_airspace": {
                    "type": "string",
                    "enum": [
                      "in",
                      "near",
                      "outside",
                      "unknown"
                    ]
                  },
                  "left_out_artcc": {
                    "type": "integer",
                    "description": "ARTCC notices left out because the route does not pass through their centre."
                  },
                  "left_out_by_artcc": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    }
                  },
                  "left_out_national": {
                    "type": "integer",
                    "description": "National notices left out because the flight is not in or near US airspace."
                  }
                }
              }
            }
          },
          "resolved_route": {
            "$ref": "#/components/schemas/ResolvedRoute"
          }
        }
      },
      "WindsRouteOptions": {
        "type": "object",
        "properties": {
          "step_nm": {
            "type": "number",
            "minimum": 5,
            "maximum": 200,
            "default": 25,
            "description": "Distance between samples along the track, in NM; every fix is sampled too."
          },
          "tas_kt": {
            "type": "number",
            "minimum": 50,
            "maximum": 650,
            "description": "True airspeed: adds the ground speed at each sample and the flight's time with the wind against still air."
          },
          "as_of": {
            "type": "string",
            "format": "date-time",
            "description": "Replay: only the forecasts issued by this time."
          }
        }
      },
      "WindsRouteRequest": {
        "oneOf": [
          {
            "title": "Route string",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByRoute"
              },
              {
                "$ref": "#/components/schemas/WindsRouteOptions"
              }
            ],
            "unevaluatedProperties": false
          },
          {
            "title": "Waypoints",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByWaypoints"
              },
              {
                "$ref": "#/components/schemas/WindsRouteOptions"
              },
              {
                "properties": {
                  "waypoints": {
                    "maxItems": 200
                  }
                }
              }
            ],
            "unevaluatedProperties": false
          }
        ],
        "description": "The flight object (route string or waypoints) and the winds options. Anything else is refused with 400 `unknown_field`."
      },
      "WindPoint": {
        "type": "object",
        "properties": {
          "chainage_nm": {
            "type": "number"
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "time": {
            "type": "string",
            "format": "date-time"
          },
          "level_ft": {
            "type": [
              "integer",
              "null"
            ],
            "description": "The aircraft's level here, feet above sea level (flight levels as pressure altitude)."
          },
          "fix": {
            "type": [
              "string",
              "null"
            ]
          },
          "track_deg": {
            "type": [
              "integer",
              "null"
            ],
            "description": "True course of the great circle here."
          },
          "wind_dir_deg": {
            "type": [
              "integer",
              "null"
            ],
            "description": "True, where the wind blows from, 1 to 360; null when light and variable."
          },
          "wind_kt": {
            "type": [
              "integer",
              "null"
            ]
          },
          "temp_c": {
            "type": [
              "number",
              "null"
            ]
          },
          "isa_c": {
            "type": [
              "number",
              "null"
            ]
          },
          "isa_dev_c": {
            "type": [
              "number",
              "null"
            ]
          },
          "headwind_kt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Positive a headwind, negative a tailwind."
          },
          "crosswind_kt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Positive from the right."
          },
          "ground_speed_kt": {
            "type": [
              "integer",
              "null"
            ],
            "description": "With tas_kt."
          },
          "light_and_variable": {
            "type": "boolean"
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "available": {
            "type": "boolean"
          },
          "reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Why there is no forecast here."
          }
        }
      },
      "WindLeg": {
        "type": "object",
        "properties": {
          "from": {
            "type": [
              "string",
              "null"
            ]
          },
          "to": {
            "type": [
              "string",
              "null"
            ]
          },
          "from_nm": {
            "type": "number"
          },
          "to_nm": {
            "type": "number"
          },
          "avg_headwind_kt": {
            "type": [
              "number",
              "null"
            ]
          },
          "max_wind_kt": {
            "type": [
              "integer",
              "null"
            ]
          },
          "avg_temp_c": {
            "type": [
              "number",
              "null"
            ]
          },
          "avg_isa_dev_c": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      },
      "WindsMeta": {
        "type": "object",
        "properties": {
          "as_of": {
            "type": "object",
            "properties": {
              "time": {
                "type": "string",
                "format": "date-time"
              }
            }
          },
          "forecasts": {
            "type": "array",
            "description": "The bulletins whose values the answer used.",
            "items": {
              "type": "object",
              "properties": {
                "region": {
                  "type": "string",
                  "enum": [
                    "us",
                    "alaska",
                    "hawaii",
                    "other_pac"
                  ]
                },
                "level_set": {
                  "type": "string",
                  "enum": [
                    "low",
                    "high"
                  ]
                },
                "levels_ft": {
                  "type": "array",
                  "items": {
                    "type": "integer"
                  }
                },
                "heading": {
                  "type": "string"
                },
                "issued": {
                  "type": "string",
                  "format": "date-time"
                },
                "based_on": {
                  "type": "string",
                  "format": "date-time"
                },
                "valid": {
                  "type": "string",
                  "format": "date-time"
                },
                "for_use_from": {
                  "type": "string",
                  "format": "date-time"
                },
                "for_use_to": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            }
          },
          "sources": {
            "type": "object",
            "properties": {
              "windtemp": {
                "type": "object",
                "properties": {
                  "last_poll": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time"
                  },
                  "stale": {
                    "type": "boolean"
                  },
                  "newest_issue": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "date-time"
                  },
                  "stations": {
                    "type": "integer"
                  },
                  "sites_without_position": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "caveats": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "WindsRouteResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string"
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WindPoint"
            }
          },
          "legs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WindLeg"
            }
          },
          "totals": {
            "type": "object",
            "properties": {
              "avg_headwind_kt": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "max_wind": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "kt": {
                    "type": "integer"
                  },
                  "dir_deg": {
                    "type": [
                      "integer",
                      "null"
                    ]
                  },
                  "chainage_nm": {
                    "type": "number"
                  },
                  "level_ft": {
                    "type": "integer"
                  }
                }
              },
              "avg_isa_dev_c": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "time_minutes": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "With tas_kt: the time with the winds found."
              },
              "still_air_minutes": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "available_pct": {
                "type": "number",
                "description": "The share of the flight's length with a forecast."
              }
            }
          },
          "flight": {
            "type": "object",
            "properties": {
              "length_nm": {
                "type": "number"
              },
              "departure": {
                "type": "string",
                "format": "date-time"
              },
              "arrival": {
                "type": "string",
                "format": "date-time"
              },
              "sample_step_nm": {
                "type": "number"
              },
              "tas_kt": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "fixes": {
                "type": "array",
                "items": {
                  "type": "object"
                }
              }
            }
          },
          "meta": {
            "$ref": "#/components/schemas/WindsMeta"
          },
          "resolved_route": {
            "$ref": "#/components/schemas/ResolvedRoute"
          }
        }
      },
      "WindsPointResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string"
          },
          "point": {
            "type": "object",
            "description": "The wind and temperature at the point, level and time, as a sample of the route answer."
          },
          "stations": {
            "type": "array",
            "description": "The stations used: id, name, position, distance in NM, weights and their values at the levels either side.",
            "items": {
              "type": "object"
            }
          },
          "meta": {
            "$ref": "#/components/schemas/WindsMeta"
          }
        }
      },
      "MassBalanceRequest": {
        "type": "object",
        "required": [
          "aircraft"
        ],
        "additionalProperties": false,
        "properties": {
          "units": {
            "type": "string",
            "enum": [
              "imperial",
              "metric"
            ],
            "default": "imperial",
            "description": "imperial: lb, in, US gal. metric: kg, m, L."
          },
          "aircraft": {
            "type": "object",
            "required": [
              "empty"
            ],
            "additionalProperties": false,
            "description": "The aircraft as its documents describe it; BravoEcho holds no aircraft data.",
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 100
              },
              "empty": {
                "type": "object",
                "required": [
                  "weight"
                ],
                "additionalProperties": false,
                "properties": {
                  "weight": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "arm": {
                    "type": "number"
                  },
                  "moment": {
                    "type": "number",
                    "description": "Instead of arm."
                  }
                }
              },
              "stations": {
                "type": "array",
                "maxItems": 50,
                "items": {
                  "type": "object",
                  "required": [
                    "id",
                    "arm"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "arm": {
                      "type": "number"
                    },
                    "max_weight": {
                      "type": "number"
                    }
                  }
                }
              },
              "fuel_tanks": {
                "type": "array",
                "maxItems": 20,
                "items": {
                  "type": "object",
                  "required": [
                    "id",
                    "arm"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "arm": {
                      "type": "number"
                    },
                    "capacity": {
                      "type": "number",
                      "description": "Usable fuel, in volume."
                    },
                    "fuel_type": {
                      "type": "string",
                      "enum": [
                        "avgas",
                        "jet_a",
                        "mogas"
                      ],
                      "description": "avgas and mogas 6.0 lb/gal (0.72 kg/L), jet_a 6.7 lb/gal (0.80 kg/L)."
                    },
                    "unit_weight": {
                      "type": "number",
                      "description": "Weight per volume unit, instead of fuel_type."
                    }
                  }
                }
              },
              "limits": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "max_ramp": {
                    "type": "number"
                  },
                  "max_takeoff": {
                    "type": "number"
                  },
                  "max_landing": {
                    "type": "number"
                  },
                  "max_zero_fuel": {
                    "type": "number"
                  }
                }
              },
              "envelopes": {
                "type": "array",
                "maxItems": 10,
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "points"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "points": {
                      "type": "array",
                      "minItems": 3,
                      "items": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "number"
                        }
                      },
                      "description": "The polygon as [arm, weight] points."
                    }
                  }
                }
              },
              "mac": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "leading_edge_arm": {
                    "type": "number"
                  },
                  "length": {
                    "type": "number"
                  }
                },
                "description": "Mean aerodynamic chord, for % MAC."
              }
            }
          },
          "load": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "stations": {
                "type": "object",
                "additionalProperties": {
                  "type": "number",
                  "minimum": 0
                },
                "description": "Weight at each station, by id."
              },
              "fuel": {
                "type": "object",
                "additionalProperties": {
                  "type": "number",
                  "minimum": 0
                },
                "description": "Fuel in each tank, in volume, by id."
              }
            }
          },
          "fuel_burn": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "taxi": {
                "type": "number",
                "minimum": 0
              },
              "trip": {
                "type": "number",
                "minimum": 0
              },
              "burn_order": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Tank ids to empty in turn; otherwise the tanks burn in proportion to what each holds."
              }
            }
          }
        }
      },
      "MassBalancePhase": {
        "type": "object",
        "properties": {
          "weight": {
            "type": "number"
          },
          "moment": {
            "type": "number"
          },
          "cg_arm": {
            "type": "number"
          },
          "cg_mac_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "fuel": {
            "type": "number"
          },
          "envelopes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "within": {
                  "type": "boolean"
                }
              }
            }
          }
        }
      },
      "MassBalanceResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string"
          },
          "ok": {
            "type": "boolean",
            "description": "Every limit met and the centre of gravity within at least one envelope from takeoff to landing (when envelopes are given)."
          },
          "units": {
            "type": "object",
            "properties": {
              "system": {
                "type": "string"
              },
              "weight": {
                "type": "string"
              },
              "arm": {
                "type": "string"
              },
              "fuel": {
                "type": "string"
              }
            }
          },
          "phases": {
            "type": "object",
            "properties": {
              "ramp": {
                "$ref": "#/components/schemas/MassBalancePhase"
              },
              "takeoff": {
                "$ref": "#/components/schemas/MassBalancePhase"
              },
              "landing": {
                "$ref": "#/components/schemas/MassBalancePhase"
              },
              "zero_fuel": {
                "$ref": "#/components/schemas/MassBalancePhase"
              }
            }
          },
          "limits": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "what": {
                  "type": "string"
                },
                "value": {
                  "type": "number"
                },
                "max": {
                  "type": "number"
                },
                "margin": {
                  "type": "number"
                },
                "unit": {
                  "type": "string"
                },
                "ok": {
                  "type": "boolean"
                }
              }
            }
          },
          "cg_path": {
            "type": "array",
            "description": "Each envelope against the centre of gravity as the trip fuel burns.",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "within": {
                  "type": "boolean"
                },
                "leaves_after_burning": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Fuel burned after takeoff when the centre of gravity leaves the envelope."
                }
              }
            }
          },
          "stations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "weight": {
                  "type": "number"
                },
                "arm": {
                  "type": "number"
                },
                "moment": {
                  "type": "number"
                }
              }
            }
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "NavlogPhase": {
        "type": "object",
        "required": [
          "tas_kt",
          "fuel_per_hour"
        ],
        "additionalProperties": false,
        "properties": {
          "tas_kt": {
            "type": "number",
            "minimum": 30,
            "maximum": 650
          },
          "fuel_per_hour": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "In your fuel unit per hour."
          },
          "rate_fpm": {
            "type": "number",
            "minimum": 50,
            "maximum": 10000,
            "description": "Climb or descent rate: places a route string's top of climb or descent."
          }
        }
      },
      "NavlogOptions": {
        "type": "object",
        "required": [
          "performance"
        ],
        "properties": {
          "performance": {
            "type": "object",
            "required": [
              "cruise"
            ],
            "additionalProperties": false,
            "description": "The aircraft performance from its flight manual; BravoEcho holds no performance models.",
            "properties": {
              "climb": {
                "$ref": "#/components/schemas/NavlogPhase"
              },
              "cruise": {
                "$ref": "#/components/schemas/NavlogPhase"
              },
              "descent": {
                "$ref": "#/components/schemas/NavlogPhase"
              }
            }
          },
          "taxi_fuel": {
            "type": "number",
            "minimum": 0
          },
          "reserve": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "minutes": {
                "type": "number",
                "minimum": 0,
                "maximum": 600,
                "description": "At the cruise fuel flow."
              },
              "fuel": {
                "type": "number",
                "minimum": 0
              }
            }
          },
          "fuel_on_board": {
            "type": "number",
            "exclusiveMinimum": 0
          },
          "fuel_unit": {
            "type": "string",
            "enum": [
              "gal",
              "L",
              "lb",
              "kg"
            ],
            "description": "A label for your fuel figures."
          },
          "step_nm": {
            "type": "number",
            "minimum": 5,
            "maximum": 50,
            "default": 10,
            "description": "Wind sample spacing along the track."
          }
        }
      },
      "NavlogRequest": {
        "oneOf": [
          {
            "title": "Route string",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByRoute"
              },
              {
                "$ref": "#/components/schemas/NavlogOptions"
              }
            ],
            "unevaluatedProperties": false
          },
          {
            "title": "Waypoints",
            "allOf": [
              {
                "$ref": "#/components/schemas/FlightByWaypoints"
              },
              {
                "$ref": "#/components/schemas/NavlogOptions"
              },
              {
                "properties": {
                  "waypoints": {
                    "maxItems": 200
                  }
                }
              }
            ],
            "unevaluatedProperties": false
          }
        ],
        "description": "The flight object and the aircraft performance. Anything else is refused with 400 `unknown_field`."
      },
      "NavlogLeg": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string"
          },
          "to": {
            "type": "string"
          },
          "phase": {
            "type": "string",
            "enum": [
              "climb",
              "cruise",
              "descent"
            ]
          },
          "distance_nm": {
            "type": "number"
          },
          "level_from_ft": {
            "type": "integer"
          },
          "level_to_ft": {
            "type": "integer"
          },
          "true_course_deg": {
            "type": "integer"
          },
          "magnetic_variation_deg": {
            "type": "number",
            "description": "The magnetic variation at the leg's midpoint and mid time, east positive, to a tenth of a degree: the declination of the World Magnetic Model (WMM2025). Absent where the model does not apply: outside its validity, 2025.0 to 2030.0, and in the blackout zone near a magnetic pole (horizontal field under 2000 nT); `meta.notes` says why. In the caution zone (2000 to 6000 nT) it is given, with a caution in `meta.notes`."
          },
          "magnetic_course_deg": {
            "type": "integer",
            "description": "`true_course_deg` minus `magnetic_variation_deg`, rounded; 360 for north, as the true course. Absent with the variation."
          },
          "wind": {
            "type": "object",
            "properties": {
              "dir_deg": {
                "type": "integer"
              },
              "kt": {
                "type": "integer"
              }
            },
            "description": "The leg's average wind; absent in still air."
          },
          "headwind_kt": {
            "type": "number",
            "description": "Positive a headwind, negative a tailwind."
          },
          "wind_correction_deg": {
            "type": "number",
            "description": "Positive to the right."
          },
          "true_heading_deg": {
            "type": "integer"
          },
          "magnetic_heading_deg": {
            "type": "integer",
            "description": "`true_heading_deg` minus `magnetic_variation_deg`, rounded; 360 for north, as the true heading. Absent with the variation."
          },
          "tas_kt": {
            "type": "number"
          },
          "ground_speed_kt": {
            "type": "integer"
          },
          "time_min": {
            "type": "number"
          },
          "fuel": {
            "type": "number"
          },
          "elapsed_min": {
            "type": "number"
          },
          "fuel_used": {
            "type": "number"
          },
          "eta": {
            "type": "string",
            "format": "date-time"
          },
          "still_air_nm": {
            "type": "number",
            "description": "Distance on the leg with no wind forecast, flown in still air."
          }
        }
      },
      "NavlogResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string"
          },
          "legs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NavlogLeg"
            }
          },
          "totals": {
            "type": "object",
            "properties": {
              "distance_nm": {
                "type": "number"
              },
              "time_min": {
                "type": "number"
              },
              "arrival": {
                "type": "string",
                "format": "date-time"
              },
              "trip_fuel": {
                "type": "number"
              },
              "taxi_fuel": {
                "type": "number"
              },
              "reserve_fuel": {
                "type": "number"
              },
              "required_fuel": {
                "type": "number"
              },
              "fuel_on_board": {
                "type": "number"
              },
              "fuel_at_destination": {
                "type": "number"
              },
              "reserve_met": {
                "type": "boolean"
              },
              "avg_headwind_kt": {
                "type": "number"
              },
              "still_air_nm": {
                "type": "number"
              },
              "fuel_unit": {
                "type": "string"
              }
            }
          },
          "performance": {
            "type": "object",
            "description": "The figures used for each phase."
          },
          "flight": {
            "type": "object"
          },
          "meta": {
            "type": "object",
            "properties": {
              "winds": {
                "type": "object",
                "description": "The forecasts and sources of the winds used."
              },
              "notes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "caveats": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "resolved_route": {
            "$ref": "#/components/schemas/ResolvedRoute"
          }
        }
      }
    },
    "responses": {
      "Unauthenticated": {
        "description": "Missing or invalid key.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "unauthenticated",
              "message": "A valid API key is required. Pass it as \"Authorization: Bearer <key>\"."
            }
          }
        }
      },
      "RateLimited": {
        "description": "Too many requests this minute: back off for `Retry-After` seconds, then retry.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "rate_limited",
              "message": "Too Many Attempts."
            }
          }
        }
      },
      "CountedTooManyRequests": {
        "description": "`rate_limited`: too many requests this minute; back off for `Retry-After` seconds. `quota_exceeded`: the organisation's monthly cap of counted requests is reached; `Retry-After` runs to the start of next month. Beta services keep answering.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          },
          "X-Quota-Limit": {
            "$ref": "#/components/headers/X-Quota-Limit"
          },
          "X-Quota-Used": {
            "$ref": "#/components/headers/X-Quota-Used"
          },
          "X-Quota-Remaining": {
            "$ref": "#/components/headers/X-Quota-Remaining"
          },
          "X-Quota-Reset": {
            "$ref": "#/components/headers/X-Quota-Reset"
          },
          "X-Product-Status": {
            "$ref": "#/components/headers/X-Product-Status"
          },
          "X-Metered": {
            "$ref": "#/components/headers/X-Metered"
          },
          "X-RateLimit-Limit": {
            "$ref": "#/components/headers/X-RateLimit-Limit"
          },
          "X-RateLimit-Remaining": {
            "$ref": "#/components/headers/X-RateLimit-Remaining"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "quota_exceeded": {
                "summary": "Monthly cap reached",
                "value": {
                  "error": "quota_exceeded",
                  "message": "This organisation has used its 1,000 free requests for the month, counted across all its API keys. The count resets on 1 Nov at 00:00Z. Beta services (NOTAMs, Weather, Airports and routes) are not counted and keep working. For a higher limit write to hello@bravoecho.ai."
                }
              },
              "rate_limited": {
                "summary": "Per-minute rate limit",
                "value": {
                  "error": "rate_limited",
                  "message": "Too Many Attempts."
                }
              }
            }
          }
        }
      },
      "LicenceRequired": {
        "description": "`licence_required`: the organisation has used its free allowance of counted requests and has not accepted the licence agreement; an owner or admin accepts it in the console. Beta services keep answering.",
        "headers": {
          "X-Product-Status": {
            "$ref": "#/components/headers/X-Product-Status"
          },
          "X-Metered": {
            "$ref": "#/components/headers/X-Metered"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "licence_required",
              "message": "This organisation has used its 1,000 free requests for the month. To go beyond them, an owner or admin accepts the licence agreement in the console at https://app.bravoecho.ai/licence. Beta services (NOTAMs, Weather, Airports and routes) are not counted and keep working."
            }
          }
        }
      },
      "UnknownField": {
        "description": "`unknown_field`: the body has a field this endpoint does not take.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "unknown_field",
              "message": "Unknown field: points_. See https://bravoecho.ai/llms-full.txt for the documented request."
            }
          }
        }
      },
      "UnknownParameter": {
        "description": "`unknown_field`: a query parameter this endpoint does not take. `bad_request`: the service refused a parameter, with its own message.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "unknown_field": {
                "summary": "Unknown parameter",
                "value": {
                  "error": "unknown_field",
                  "message": "Unknown parameter: airport. See https://bravoecho.ai/llms-full.txt for the documented request."
                }
              },
              "bad_request": {
                "summary": "Refused by the service",
                "value": {
                  "error": "bad_request",
                  "message": "at most 50 ids"
                }
              }
            }
          }
        }
      },
      "FlightBadRequest": {
        "description": "`bad_request`: `route` and `waypoints` together, or neither, or a value the service refuses. `unknown_field`: a field that is neither the flight object's nor this endpoint's, naming the waypoint when it is on one.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "both": {
                "summary": "Route and waypoints together",
                "value": {
                  "error": "bad_request",
                  "message": "Give route or waypoints, not both."
                }
              },
              "neither": {
                "summary": "Neither",
                "value": {
                  "error": "bad_request",
                  "message": "Give route (the route as filed) or waypoints."
                }
              },
              "unknown_waypoint_field": {
                "summary": "Unknown field on a waypoint",
                "value": {
                  "error": "unknown_field",
                  "message": "Waypoint 1 (EGLL): unknown field eta. A waypoint takes id, lat, lon, time, alt_m, alt_ft, fl, codes, phase, hal_nm (label is read as id). See https://bravoecho.ai/llms-full.txt for the documented request."
                }
              },
              "route_only_field": {
                "summary": "A route-string field with waypoints",
                "value": {
                  "error": "unknown_field",
                  "message": "Unknown field: cruise_fl. cruise_fl goes with route; with waypoints, each waypoint carries its own level and alert limit. See https://bravoecho.ai/llms-full.txt for the documented request."
                }
              }
            }
          }
        }
      },
      "NotFound": {
        "description": "`not_found`: nothing with that id.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "not_found",
              "message": "no NOTAM with that id in the archive"
            }
          }
        }
      },
      "RaimValidation": {
        "description": "`validation`: a value the RAIM engine refuses; the message names the field.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "validation",
              "message": "window_minutes must be 0..720"
            }
          }
        }
      },
      "FlightUnprocessable": {
        "description": "`validation`: a value that cannot be right; the message names the field, and the flight object's own checks add `errors` per field. `route_unresolved`: a point of the route string cannot be placed, with `unresolved[]` and `resolved_route`.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "validation": {
                "summary": "Waypoint values",
                "value": {
                  "error": "validation",
                  "message": "waypoint 0 (KJFK): give one of alt_m, alt_ft and fl. (and 1 more error)",
                  "errors": {
                    "waypoints.0.alt_m": [
                      "waypoint 0 (KJFK): give one of alt_m, alt_ft and fl."
                    ],
                    "waypoints.1.lat": [
                      "waypoint 1 (EGLL): lat must be a number from -90 to 90."
                    ]
                  }
                }
              },
              "route_unresolved": {
                "summary": "A point that cannot be placed",
                "value": {
                  "error": "route_unresolved",
                  "message": "STYMY: named fixes are not in our navigation data yet. Use a navaid or a coordinate here.",
                  "unresolved": [
                    "STYMY: named fixes are not in our navigation data yet. Use a navaid or a coordinate here."
                  ],
                  "resolved_route": {
                    "route": "KMSP STYMY KSFO",
                    "notes": [],
                    "nav_data": null
                  }
                }
              }
            }
          }
        }
      },
      "LaravelValidation": {
        "description": "`validation`: a parameter that cannot be right, with `errors` per field.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "validation",
              "message": "The limit field must not be greater than 100.",
              "errors": {
                "limit": [
                  "The limit field must not be greater than 100."
                ]
              }
            }
          }
        }
      },
      "UpstreamUnavailable": {
        "description": "`upstream_unavailable`: a backing service is down. Retry once after a short delay.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "upstream_unavailable",
              "message": "The NOTAM service is not reachable right now."
            }
          }
        }
      },
      "RaimUnavailable": {
        "description": "`almanac_untrusted`: the requested time is too far from the almanac to predict (more than 30 days), with `almanac`. `upstream_unavailable`: the RAIM service is down or has no almanac loaded yet.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "almanac_untrusted": {
                "summary": "Too far from the almanac",
                "value": {
                  "error": "almanac_untrusted",
                  "message": "refusing to predict: almanac toa 2026-09-13T17:03:42Z is 41.3 days from the requested time (limit 30 days); the almanac is not trustworthy that far out",
                  "almanac": {
                    "loaded": true,
                    "version": "2436-61440"
                  }
                }
              },
              "upstream_unavailable": {
                "summary": "Service down",
                "value": {
                  "error": "upstream_unavailable",
                  "message": "The RAIM service is not reachable right now."
                }
              }
            }
          }
        }
      },
      "BadRequest": {
        "description": "`bad_request`: a malformed identifier.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "bad_request",
              "message": "nms_id is the 16-digit FAA identifier."
            }
          }
        }
      },
      "AirportBadRequest": {
        "description": "`bad_request`: no filter given.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "bad_request",
              "message": "Give q, country, region or lat and lon."
            }
          }
        }
      },
      "NavaidBadRequest": {
        "description": "`bad_request`: no filter given.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "bad_request",
              "message": "Give ident, airport or lat and lon."
            }
          }
        }
      },
      "AirportCodeBadRequest": {
        "description": "`bad_request`: not an airport code.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "bad_request",
              "message": "Give an ICAO, IATA, GPS or local airport code."
            }
          }
        }
      },
      "RouteUnresolved": {
        "description": "`route_unresolved`: a point cannot be placed, with `unresolved[]` and the route as read (`route`, `points`, `notes`, `nav_data`) at the top level. `validation`: `route` missing or too long.",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/Error"
                },
                {
                  "type": "object",
                  "properties": {
                    "route": {
                      "type": "string"
                    },
                    "points": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ResolvedPoint"
                      }
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "nav_data": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/NavData"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "additionalProperties": true
                }
              ]
            },
            "examples": {
              "route_unresolved": {
                "summary": "A point that cannot be placed",
                "value": {
                  "error": "route_unresolved",
                  "message": "XQZ: no navaid or airport with this identifier.",
                  "unresolved": [
                    "XQZ: no navaid or airport with this identifier."
                  ],
                  "route": "KMSP XQZ PANC",
                  "points": [],
                  "notes": [],
                  "nav_data": null
                }
              },
              "validation": {
                "summary": "No route",
                "value": {
                  "error": "validation",
                  "message": "The route field is required.",
                  "errors": {
                    "route": [
                      "The route field is required."
                    ]
                  }
                }
              }
            }
          }
        }
      },
      "AlertLimit": {
        "description": "`alert_limit`: the organisation already has the most active watches it may have (25), or has made the most it may make in a day (100).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": "alert_limit",
              "message": "An organisation may have 25 active alerts at once. Stop one (DELETE /v1/alerts/{id}) or wait for one to end."
            }
          }
        }
      }
    },
    "headers": {
      "X-Product-Status": {
        "description": "The product family's release status: `ga` (Available, counted) or `beta` (free, not counted).",
        "schema": {
          "type": "string",
          "enum": [
            "ga",
            "beta"
          ]
        }
      },
      "X-Metered": {
        "description": "Whether this call counts toward the organisation's monthly allowance.",
        "schema": {
          "type": "string",
          "enum": [
            "true",
            "false"
          ]
        }
      },
      "X-Quota-Limit": {
        "description": "Counted calls only, when the organisation has a monthly cap: the cap, across all its keys.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Quota-Remaining": {
        "description": "Counted calls only: counted requests left this month.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Quota-Reset": {
        "description": "Counted calls only: when the count resets (the start of next month, UTC).",
        "schema": {
          "type": "string",
          "format": "date-time"
        }
      },
      "X-Quota-Used": {
        "description": "On `quota_exceeded`: counted requests used this month.",
        "schema": {
          "type": "integer"
        }
      },
      "Retry-After": {
        "description": "Seconds to wait before retrying. On `quota_exceeded` it runs to the start of next month.",
        "schema": {
          "type": "integer"
        }
      },
      "X-RateLimit-Limit": {
        "description": "Requests per minute allowed for this key.",
        "schema": {
          "type": "integer"
        }
      },
      "X-RateLimit-Remaining": {
        "description": "Requests left in the current minute.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Cache": {
        "description": "Whether the map was served from the hour-long cache.",
        "schema": {
          "type": "string",
          "enum": [
            "hit",
            "miss",
            "bypass"
          ]
        }
      }
    }
  }
}
