openapi: 3.1.0
info:
  title: SkAI GNSS interference REST API
  description: REST API to access the GNSS spoofing and jamming database.
    Authentication is required via either API Key + Client ID headers OR a JWT
    Bearer token.
  license:
    name: ""
    url: https://gpswise.aero/
  version: 1.0.0
servers:
  - url: /
paths:
  /db-api/v1/spoofing/agg/geojson:
    get:
      tags:
        - Spoofing
      summary: Get spoofing events as GeoJSON (authenticated)
      description: >-
        Retrieve aggregated spoofing events as a GeoJSON FeatureCollection
        (private).


        Each record is converted into a GeoJSON Feature. The geometry type and
        the

        `segment` property reflect which positional timestamps are present.


        **Geometry Types:**

        - `before-during-after`: LineString with 3 vertices (before → during →
        after).

        - `before-during`:       LineString with 2 vertices (before → during).

        - `during-after`:        LineString with 2 vertices (during → after).

        - `during`:              Point at the spoofed location (only during data
        available).


        **Time Range Parameters (Precedence: start/end > lookback):**

        - `start_time`, `end_time` (datetime): Define a specific time window.
        Maximum range is 72 hours.
          *Both must be supplied together. Overrides `lookback_minutes`.*
        - `lookback_minutes` (int): Look back from the current UTC time.
          *Constraint: 1-4320. Default: 1440 (24 hours). Ignored if start/end are provided.*

        **Returns:**

        A GeoJSON FeatureCollection with one feature per spoofing aggregation
        record.

        - **Feature Properties (Common):**
            - `flight_id`: Unique identifier (callsign + date suffix).
            - `icao24`: ICAO-24 hex code of the aircraft.
            - `timestamp_during_min`, `timestamp_during_max`: ISO 8601 timestamps for the spoofing interval.
            - `altitude_during`: Altitude (ft) during spoofing.
            - `track_during`: Track (deg) during spoofing.
            - `segment`: One of `during`, `before-during`, `during-after`, or `before-during-after`.
        - **Feature Properties (Conditional):**
            - If `before` data is present: `timestamp_before`, `time_diff_before`, `altitude_before`, `track_before`.
            - If `after` data is present: `timestamp_after`, `time_diff_after`, `altitude_after`, `track_after`.
        - **Response Headers:**
            - `x-period-start`: ISO 8601 timestamp (UTC) for the start of the query period.
            - `x-period-end`: ISO 8601 timestamp (UTC) for the end of the query period.

        **Example Response:**

        ```json

        // Headers:

        // x-period-start: 2025-06-17T00:00:00Z

        // x-period-end: 2025-06-17T23:59:59Z

        {
          "type": "FeatureCollection",
          "features": [
            {
              "type": "Feature",
              "geometry": { "type": "Point", "coordinates": [52.5846, 27.4736] },
              "properties": {
                "flight_id": "ABY298_2025-06-17",
                "icao24": "8964c6",
                "timestamp_during_min": "2025-06-17T07:50:30Z",
                "timestamp_during_max": "2025-06-17T07:59:58Z",
                "altitude_during": 34000.0,
                "track_during": 0.0,
                "segment": "during"
              }
            }
          ]
        }

        ```
      operationId: get_spoofing_agg_geojson_db_api_v1_spoofing_agg_geojson_get
      parameters:
        - name: start_time
          in: query
          required: false
          schema:
            type: string
            format: date-time
            description: Optional start time in ISO format. Cannot be used with
              lookback_minutes.
            title: Start Time
          description: Optional start time in ISO format. Cannot be used with
            lookback_minutes.
        - name: end_time
          in: query
          required: false
          schema:
            type: string
            format: date-time
            description: Optional end time in ISO format. Cannot be used with
              lookback_minutes.
            title: End Time
          description: Optional end time in ISO format. Cannot be used with
            lookback_minutes.
        - name: lookback_minutes
          in: query
          required: false
          schema:
            type: integer
            maximum: 4320
            minimum: 1
            description: Optional look-back period in minutes (1-4320). If provided,
              start_time and end_time are ignored.
            title: Lookback Minutes
          description: Optional look-back period in minutes (1-4320). If provided,
            start_time and end_time are ignored.
      responses:
        "200":
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SpoofingAggGeoJsonFeatureCollection"
              example:
                type: FeatureCollection
                features:
                  - type: Feature
                    geometry:
                      type: Point
                      coordinates:
                        - 20.1196
                        - 55.3553
                    properties:
                      flight_id: CSN689_2025-08-07
                      icao24: "781739"
                      timestamp_during_min: 2025-08-07T03:11:05Z
                      timestamp_during_max: 2025-08-07T03:19:47Z
                      altitude_during: 36000
                      track_during: 270
                      segment: during
                  - type: Feature
                    geometry:
                      type: LineString
                      coordinates:
                        - - 17.4274
                          - 51.6862
                        - - 31.9208
                          - 54.6994
                    properties:
                      flight_id: ETH760_2025-08-07
                      icao24: "040046"
                      timestamp_during_min: 2025-08-07T03:36:06Z
                      timestamp_during_max: 2025-08-07T03:59:53Z
                      altitude_during: 40000
                      track_during: 186.34
                      segment: before-during
                      timestamp_before: 2025-08-07T03:36:05Z
                      time_diff_before: 1
                      altitude_before: 39975
                      track_before: 174.289
        "404":
          description: Not found
        "422":
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/HTTPValidationError"
      security:
        - ApiKeyAuth: []
          ClientIdHeader: []
        - JWTBearerAuth: []
  /db-api/v1/spoofing/h3_geojson:
    get:
      tags:
        - Spoofing
      summary: Get Spoofing Locations with H3 Index (GeoJSON)
      description: >-
        Retrieve where spoofing occurrences happened with counts aggregated by
        H3 cell (GeoJSON).


        Aggregates GPS spoofing locations into H3 geographic cells over a
        specified lookback period.

        Returns a GeoJSON FeatureCollection where each feature represents an H3
        cell

        containing the number of aircraft experiencing spoofing in that cell.


        **Query Parameters:**

        - `lookback_minutes` (int): Look-back period from the current time in
        minutes.
          *Constraint: 1 to 4320 minutes (72 hours). Default: 1440 (24 hours).*
        - `max_time_diff_before_sec` (int): Maximum allowed time difference in
        seconds between the last valid position before spoofing start.
          *Default: 600 seconds.*
        - `max_time_diff_after_sec` (int): Maximum allowed time difference in
        seconds between the first valid position after spoofing end.
          *Default: 600 seconds.*
        - `resolution` (int): H3 resolution level (0-15). Higher values create
        smaller, more precise cells.
          *Default: 3*
        - `coordinates_source` (str): Source of coordinates to include in the
        aggregation. Options:
          - 'before': Include only the last valid position before spoofing
          - 'after': Include only the first valid position after spoofing
          - 'interpolated': Include interpolated positions between before and after
          - 'before+after': Include both before and after positions

        **Returns:**

        A GeoJSON FeatureCollection. Each feature has:

        - `geometry`: A Polygon representing the H3 cell boundary.


        - 'id' (str): The H3 cell index (hexadecimal string).

        - `properties`:
            - `count` (int): Number of flights affected by spoofing within this cell.
            - `coordinates_source` (str): The type of coordinates included in this count.

        - Response headers:
            - `x-period-start`: ISO 8601 timestamp (UTC) for the start of the query period.
            - `x-period-end`: ISO 8601 timestamp (UTC) for the end of the query period.

        **Example Response:**

        ```json

        {
          "type": "FeatureCollection",
          "id": "832830fffffffff",
          "features": [
            {
              "type": "Feature",
              "properties": {
                "count": 5,
                "coordinates_source": "interpolated"
              },
              "geometry": {
                "type": "Polygon",
                "coordinates": [[[lon1, lat1], [lon2, lat2], ... ]]
              }
            }
          ]
        }

        ```
      operationId: get_spoofing_h3_type_geojson_db_api_v1_spoofing_h3_geojson_get
      parameters:
        - name: lookback_minutes
          in: query
          required: false
          schema:
            type: integer
            maximum: 4320
            minimum: 1
            description: Look-back period in minutes (1-4320).
            default: 1440
            title: Lookback Minutes
          description: Look-back period in minutes (1-4320).
        - name: max_time_diff_before_sec
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            description: Maximum allowed time difference in seconds between the last valid
              position before spoofing start. Used to filter out positions that
              are too old (compared to the spoofing start time) to be considered
              valid reference points.
            default: 600
            title: Max Time Diff Before Sec
          description: Maximum allowed time difference in seconds between the last valid
            position before spoofing start. Used to filter out positions that
            are too old (compared to the spoofing start time) to be considered
            valid reference points.
        - name: max_time_diff_after_sec
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            description: Maximum allowed time difference in seconds between the first valid
              position after spoofing end. Used to filter out positions that are
              too new (compared to the spoofing end time)to be considered valid
              reference points.
            default: 600
            title: Max Time Diff After Sec
          description: Maximum allowed time difference in seconds between the first valid
            position after spoofing end. Used to filter out positions that are
            too new (compared to the spoofing end time)to be considered valid
            reference points.
        - name: resolution
          in: query
          required: false
          schema:
            type: integer
            maximum: 15
            minimum: 0
            description: "H3 resolution level (0-15). Higher values create smaller cells. "
            default: 3
            title: Resolution
          description: "H3 resolution level (0-15). Higher values create smaller cells. "
        - name: coordinates_source
          in: query
          required: false
          schema:
            enum:
              - before
              - after
              - interpolated
              - before+after
            type: string
            description: "Source of coordinates to include in the aggregation. Options: -
              'before': Include only the last valid position before spoofing\\n-
              'after': Include only the first valid position after spoofing\\n-
              'interpolated': Include interpolated positions between before and
              after\\n- 'before+after': Include both before and after positions"
            default: interpolated
            title: Coordinates Source
          description: "Source of coordinates to include in the aggregation. Options: -
            'before': Include only the last valid position before spoofing\\n-
            'after': Include only the first valid position after spoofing\\n-
            'interpolated': Include interpolated positions between before and
            after\\n- 'before+after': Include both before and after positions"
      responses:
        "200":
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SpoofingH3FeatureCollection"
        "404":
          description: Not found
        "422":
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/HTTPValidationError"
      security:
        - ApiKeyAuth: []
          ClientIdHeader: []
        - JWTBearerAuth: []
  /db-api/v1/jamming/agg:
    get:
      tags:
        - Jamming
      summary: Get Jamming H3 Index with Ratios & Optional Grouping (GeoJSON)
      description: >-
        Retrieve jamming data as GeoJSON, including good vs. bad counts and

        ratios, with optional grouping.


        Calculates 'good' (NIC 8-11) and 'bad' (NIC 0) aircraft counts and the

        ratio of bad counts (`ratio_bad = n_bad / n_unique_ac`) for each H3 cell

        combination.


        **Grouping (`grouped=True`):**

        - After the initial `n_obs_min` filter, cells are further evaluated for
          grouping.
        - A cell qualifies for grouping if (`ratio_bad <= max_ratio_bad` **OR**
          `n_bad <= max_n_bad`).
        - Spatially contiguous H3 cells that qualify for grouping (within the
        same
          altitude band) are merged into single features with aggregated properties.
        - Cells that met the `n_obs_min` filter but **did not** qualify for
        grouping
          (based on `max_ratio_bad` and `max_n_bad`) are returned as individual
          features.

        **Grouping (`grouped=False`):**

        - Returns individual features for all cells that pass the `n_obs_min`
        filter.


        **Time Range Parameters (Precedence: start/end > date > lookback):**

        - `period_start`, `period_end` (datetime): Define a specific time window
          (max {helpers.MAX_DURATION_HOURS}h).
        - `by_date` (date): Get data for a specific full day (UTC).

        - `lookback_hours` (int): Look back from the current time.
          *Constraint: 1-{helpers.MAX_DURATION_HOURS} hours. Default: 6*
        - `altitudes` (list[str] | str): Altitude bands to include.
          *Enum values: `"&lt;FL100"`, `"FL100-FL200"`, `"FL200-FL300"`,
          `"FL300-FL450"`, `"FL100-FL450"`.*
          *Default: `"FL100-FL450"`*
        - `altitude_summed` (bool): If `True`, sums NIC counts across all
        specified
          `altitudes` bands before calculating ratios. If `False`, calculates ratios
          separately for each altitude band.
          *Default: False*
        - `hours_summed` (bool): If `True`, sums NIC counts across the entire
          `lookback_hours` period before calculating ratios. If `False`, calculates
          ratios separately for each hour in the lookback period.
          *Default: True*
        - `n_obs_min` (int): Minimum total unique aircraft observations
          (n_unique_ac) required.
          *Constraint: >= 1. Default: 5*
        - `grouped` (bool): Whether to group contiguous cells meeting the
        specified
          thresholds.
          *Default: False*
        - `full_output` (bool): If `True`, include all original `n_nicX` fields
        in
          properties.
          *Default: False*
        - `max_ratio_bad` (float): **Used only if `grouped=True`**. Max ratio of
          aircraft with bad nic to total unique aircraft.
          *Constraint: 0.0-1.0. Default: 0.05*
        - `max_n_bad` (int): **Used only if `grouped=True`**. Max number of
        aircraft
          with bad nic (alternative to `max_ratio_bad`).
          *Constraint: >= 0. Default: 3*

        **Returns:**

        A GeoJSON FeatureCollection containing features for individual cells or
        merged

        groups. The collection includes top-level `period_start` and
        `period_end`

        properties indicating the overall time range of the data considered.

        - **Feature Properties (Common):**
            - `id`: Unique identifier for the feature (first H3 index for groups, the
              H3 index for individuals).
            - `altitude`: Altitude band ('FLXXX_YYY') or 'summed'.
            - `n_unique_ac`: Total unique aircraft counts within the feature.
            - `n_good`: Total count for NIC 8-11 within the feature.
            - `n_bad`: Total count for NIC 0 within the feature.
            - `ratio_bad`: Calculated ratio (`n_bad / n_unique_ac`) for the feature.
            - `n_nic0` - `n_nic11`: Raw NIC counts (only if `full_output` is True).
        - **Feature Properties (Specific to Grouped Features -
        `grouped=True`):**
            - `h3_indices`: List of H3 indices included in this merged group.
            - Geometry represents the merged shape (unary union) of the grouped
              cells.
        - **Feature Properties (Specific to Individual Features -
        `grouped=False` or
          ungrouped cells when `grouped=True`):**
            - `h3_indices`: List containing the single H3 index for this feature.
            - Geometry represents the polygon of the single H3 cell.
        - **Response Headers:**
            - `x-period-start`: ISO 8601 timestamp (UTC) for the start of the query
              period.
            - `x-period-end`: ISO 8601 timestamp (UTC) for the end of the query
              period.

        **Example Response (`grouped=False`, `full_output=False`):**

        ```json

        // Headers:

        // x-period-start: 2023-05-01T00:00:00Z

        // x-period-end: 2023-05-01T06:00:00Z

        {
          "type": "FeatureCollection",
          "features": [
            {
              "type": "Feature",
              "id": "832830fffffffff",
              "geometry": { "type": "Polygon", "coordinates": [...] },
              "properties": {
                "h3_indices": ["832830fffffffff"],
                "altitude": "FL100_200",
                "n_unique_ac": 42,
                "n_good": 38,
                "n_bad": 4,
                "ratio_bad": 0.09523809523809523
              }
            },
            // ... more individual features
          ]
        }

        ```

        **Example Response (`grouped=True`, `full_output=False`):**

        ```json

        // Headers:

        // X-Period-Start: 2023-05-01T00:00:00Z

        // X-Period-End: 2023-05-01T06:00:00Z

        {
          "type": "FeatureCollection",
          "features": [
            { // A grouped feature
              "type": "Feature",
              "id": "832830fffffffff", // ID of the first cell in the group
              "geometry": { "type": "Polygon", "coordinates": [...] }, // Merged geometry
              "properties": {
                "h3_indices": ["832830fffffffff", "832834fffffffff", ...], // All
                cells in the group
                "altitude": "FL100_200",
                "n_unique_ac": 150, // Summed over the group
                "n_good": 145,      // Summed over the group
                "n_bad": 5,         // Summed over the group
                "ratio_bad": 0.03333333333333333 // Calculated for the group
              }
            },
            { // An individual feature (did not meet grouping criteria)
              "type": "Feature",
              "id": "8329a4fffffffff",
              "geometry": { "type": "Polygon", "coordinates": [...] },
              "properties": {
                "h3_indices": ["8329a4fffffffff"],
                "altitude": "FL100_200",
                "n_unique_ac": 20,
                "n_good": 15,
                "n_bad": 5,
                "ratio_bad": 0.25
              }
            },
            // ... more grouped or individual features
          ]
        }

        ```
      operationId: get_agg_db_api_v1_jamming_agg_get
      parameters:
        - name: lookback_hours
          in: query
          required: false
          schema:
            type: integer
            maximum: 72
            minimum: 1
            description: Look-back period in hours (1-72). Ignored if start/end or date
              provided.
            title: Lookback Hours
          description: Look-back period in hours (1-72). Ignored if start/end or date
            provided.
        - name: period_start
          in: query
          required: false
          schema:
            type: string
            format: date-time
            description: Start timestamp (ISO 8601 format, UTC recommended). Use with
              period_end. Max duration 72h. Overrides lookback/date.
            title: Period Start
          description: Start timestamp (ISO 8601 format, UTC recommended). Use with
            period_end. Max duration 72h. Overrides lookback/date.
        - name: period_end
          in: query
          required: false
          schema:
            type: string
            format: date-time
            description: End timestamp (ISO 8601 format, UTC recommended). Use with
              period_start. Max duration 72h. Overrides lookback/date.
            title: Period End
          description: End timestamp (ISO 8601 format, UTC recommended). Use with
            period_start. Max duration 72h. Overrides lookback/date.
        - name: by_date
          in: query
          required: false
          schema:
            type: string
            format: date
            description: Specific date (YYYY-MM-DD) to query data for (00:00 to 23:59 UTC).
              Overrides lookback.
            title: By Date
          description: Specific date (YYYY-MM-DD) to query data for (00:00 to 23:59 UTC).
            Overrides lookback.
        - name: altitudes
          in: query
          required: false
          schema:
            anyOf:
              - type: array
                items:
                  type: string
              - type: string
            description: 'Altitude bands to include. Can be a single string or list of
              strings. Valid values: "<FL100", "FL100-FL200", "FL200-FL300",
              "FL300-FL450", "FL100-FL450". Defaults to FL100-FL450.'
            default: FL100-FL450
            title: Altitudes
          description: 'Altitude bands to include. Can be a single string or list of
            strings. Valid values: "<FL100", "FL100-FL200", "FL200-FL300",
            "FL300-FL450", "FL100-FL450". Defaults to FL100-FL450.'
        - name: altitude_summed
          in: query
          required: false
          schema:
            type: boolean
            description: If true, sums NIC counts across all specified altitude bands before
              calculating ratios. If false, calculates ratios separately for
              each altitude band.
            default: false
            title: Altitude Summed
          description: If true, sums NIC counts across all specified altitude bands before
            calculating ratios. If false, calculates ratios separately for each
            altitude band.
        - name: hours_summed
          in: query
          required: false
          schema:
            type: boolean
            description: If true, sums NIC counts across the entire lookback period before
              calculating ratios. If false, calculates ratios separately for
              each hour in the lookback period.
            default: true
            title: Hours Summed
          description: If true, sums NIC counts across the entire lookback period before
            calculating ratios. If false, calculates ratios separately for each
            hour in the lookback period.
        - name: n_obs_min
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            description: Minimum total observations (n_unique_ac) required for a cell to be
              considered.
            default: 5
            title: N Obs Min
          description: Minimum total observations (n_unique_ac) required for a cell to be
            considered.
        - name: grouped
          in: query
          required: false
          schema:
            type: boolean
            description: Whether to group spatially contiguous (neighboring) H3 cells based
              on ratio/count thresholds.
            default: false
            title: Grouped
          description: Whether to group spatially contiguous (neighboring) H3 cells based
            on ratio/count thresholds.
        - name: full_output
          in: query
          required: false
          schema:
            type: boolean
            description: Include all raw n_nicX counts in the output properties.
            default: false
            title: Full Output
          description: Include all raw n_nicX counts in the output properties.
        - name: max_ratio_bad
          in: query
          required: false
          schema:
            type: number
            maximum: 1
            minimum: 0
            description: Only used when `grouped=True`. Maximum ratio of aircraft with bad
              nic to total unique aircraft for a cell to be eligible for
              grouping.
            default: 0.05
            title: Max Ratio Bad
          description: Only used when `grouped=True`. Maximum ratio of aircraft with bad
            nic to total unique aircraft for a cell to be eligible for grouping.
        - name: max_n_bad
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            description: Only used when `grouped=True`. Maximum number of bad nic aircraft
              for a cell to be eligible for grouping (alternative to
              max_ratio_bad).
            default: 3
            title: Max N Bad
          description: Only used when `grouped=True`. Maximum number of bad nic aircraft
            for a cell to be eligible for grouping (alternative to
            max_ratio_bad).
      responses:
        "200":
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GeoJSONFeatureCollection"
        "404":
          description: Not found
        "422":
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/HTTPValidationError"
      security:
        - ApiKeyAuth: []
          ClientIdHeader: []
        - JWTBearerAuth: []
components:
  schemas:
    GeoJSONFeature:
      properties:
        type:
          type: string
          title: Type
        id:
          anyOf:
            - type: string
            - type: "null"
          title: Id
        geometry:
          additionalProperties: true
          type: object
          title: Geometry
        properties:
          additionalProperties: true
          type: object
          title: Properties
      type: object
      required:
        - type
        - geometry
        - properties
      title: GeoJSONFeature
    GeoJSONFeatureCollection:
      properties:
        type:
          type: string
          title: Type
        features:
          items:
            $ref: "#/components/schemas/GeoJSONFeature"
          type: array
          title: Features
      type: object
      required:
        - type
        - features
      title: GeoJSONFeatureCollection
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: "#/components/schemas/ValidationError"
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    LineStringGeometry:
      properties:
        type:
          type: string
          const: LineString
          title: Type
        coordinates:
          items:
            items:
              type: number
            type: array
          type: array
          title: Coordinates
      type: object
      required:
        - type
        - coordinates
      title: LineStringGeometry
    PointGeometry:
      properties:
        type:
          type: string
          const: Point
          title: Type
        coordinates:
          items:
            type: number
          type: array
          title: Coordinates
      type: object
      required:
        - type
        - coordinates
      title: PointGeometry
    PolygonGeometry:
      properties:
        type:
          type: string
          const: Polygon
          title: Type
        coordinates:
          items:
            items:
              items:
                type: number
              type: array
            type: array
          type: array
          title: Coordinates
      type: object
      required:
        - type
        - coordinates
      title: PolygonGeometry
    SpoofingAggGeoJsonFeature:
      properties:
        type:
          type: string
          const: Feature
          title: Type
          default: Feature
        geometry:
          anyOf:
            - $ref: "#/components/schemas/PointGeometry"
            - $ref: "#/components/schemas/LineStringGeometry"
          title: Geometry
        properties:
          $ref: "#/components/schemas/SpoofingAggGeoJsonProperties"
      type: object
      required:
        - geometry
        - properties
      title: SpoofingAggGeoJsonFeature
      description: A GeoJSON feature for the spoofing aggregation response.
    SpoofingAggGeoJsonFeatureCollection:
      properties:
        type:
          type: string
          const: FeatureCollection
          title: Type
          default: FeatureCollection
        features:
          items:
            $ref: "#/components/schemas/SpoofingAggGeoJsonFeature"
          type: array
          title: Features
      type: object
      required:
        - features
      title: SpoofingAggGeoJsonFeatureCollection
      description: The complete GeoJSON FeatureCollection response model for spoofing
        aggregation.
    SpoofingAggGeoJsonProperties:
      properties:
        flight_id:
          anyOf:
            - type: string
            - type: "null"
          title: Flight Id
        icao24:
          anyOf:
            - type: string
            - type: "null"
          title: Icao24
        timestamp_during_min:
          anyOf:
            - type: string
            - type: "null"
          title: Timestamp During Min
        timestamp_during_max:
          anyOf:
            - type: string
            - type: "null"
          title: Timestamp During Max
        altitude_during:
          anyOf:
            - type: number
            - type: "null"
          title: Altitude During
        track_during:
          anyOf:
            - type: number
            - type: "null"
          title: Track During
        segment:
          type: string
          title: Segment
        timestamp_before:
          anyOf:
            - type: string
            - type: "null"
          title: Timestamp Before
        time_diff_before:
          anyOf:
            - type: number
            - type: "null"
          title: Time Diff Before
        altitude_before:
          anyOf:
            - type: number
            - type: "null"
          title: Altitude Before
        track_before:
          anyOf:
            - type: number
            - type: "null"
          title: Track Before
        timestamp_after:
          anyOf:
            - type: string
            - type: "null"
          title: Timestamp After
        time_diff_after:
          anyOf:
            - type: number
            - type: "null"
          title: Time Diff After
        altitude_after:
          anyOf:
            - type: number
            - type: "null"
          title: Altitude After
        track_after:
          anyOf:
            - type: number
            - type: "null"
          title: Track After
      type: object
      required:
        - segment
      title: SpoofingAggGeoJsonProperties
      description: Properties for a GeoJSON feature in the spoofing aggregation response.
    SpoofingH3Feature:
      properties:
        type:
          type: string
          const: Feature
          title: Type
          default: Feature
        id:
          type: string
          title: Id
        properties:
          $ref: "#/components/schemas/SpoofingH3Properties"
        geometry:
          $ref: "#/components/schemas/PolygonGeometry"
      type: object
      required:
        - id
        - properties
        - geometry
      title: SpoofingH3Feature
      description: Feature structure for the Spoofing H3 GeoJSON response.
    SpoofingH3FeatureCollection:
      properties:
        type:
          type: string
          const: FeatureCollection
          title: Type
          default: FeatureCollection
        features:
          items:
            $ref: "#/components/schemas/SpoofingH3Feature"
          type: array
          title: Features
      type: object
      required:
        - features
      title: SpoofingH3FeatureCollection
      description: FeatureCollection structure for the Spoofing H3 GeoJSON response.
    SpoofingH3Properties:
      properties:
        count:
          type: integer
          title: Count
        coordinates_source:
          type: string
          title: Coordinates Source
        h3_index:
          type: string
          title: H3 Index
      type: object
      required:
        - count
        - coordinates_source
        - h3_index
      title: SpoofingH3Properties
      description: Properties for a feature in the Spoofing H3 GeoJSON response.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      name: X-API-Key
      in: header
      description: API Key for authentication.
    ClientIdHeader:
      type: apiKey
      name: X-Client-ID
      in: header
      description: Client ID associated with the API Key.
    JWTBearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT Bearer token for authentication.

