openapi: 3.0.0
info:
  description: The Unifly GCS api provides means for a Ground Control Station to interact with the UTM platform, perform take offs and landings, and create a manage operations.
  version: 1.3.2
  title: Unifly GCS API
servers:
  - url: https://portal.demo.unifly.tech/api/gcs
tags:
  - name: Flight Status
    description: Notify flight status changes
  - name: Operations
    description: Create and manage operations
  - name: PermissionRequests
    description: Manage operation permission requests
  - name: UAS
    description: Create and manage Uas
  - name: Geofences
    description: Retrieve applicable geofences
  - name: Company
    description: Retrieve company info
  - name: Pilots
    description: Retrieve assignable pilots for an operation
  - name: Observers
    description: Retrieve assignable observers for an operation
paths:
  /uas/{serialNumber}/takeoff:
    post:
      tags:
        - Flight Status
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
      description: Performs a takeoff
      responses:
        '200':
          description: Take off successfully registered
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TakeOff'
        '401':
          description: The API key is missing.
        '403':
          description: The API key was not recognized or you're not allowed to perform a takeoff for that UAS.
        '404':
          description: The given serial number could not be found or the UAS does not belong to your operator company.
        '409':
          description: The UAS could not be put in flight
          content:
            application/json:
              schema:
                type: object
                properties:
                  reason:
                    type: string
                    enum:
                      - ALREADY_IN_FLIGHT
                      - ACTIVATION_REJECTED
                  operationId:
                    type: string
                    description: The unique identifier of the operation that was detected for the attempted flight.
  /uas/{serialNumber}/landing:
    post:
      tags:
        - Flight Status
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
      description: Indicate that the UAS has landed
      responses:
        '200':
          description: Landing successfully registered
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Landing'
        '401':
          description: The API key is missing.
        '403':
          description: The API key was not recognized or you're not allowed to perform a landing for that UAS.
        '404':
          description: The given serial number could not be found or the UAS does not belong to your operator company.
        '409':
          description: The UAS could not be landed
          content:
            application/json:
              schema:
                type: object
                properties:
                  reason:
                    type: string
                    enum:
                      - ALREADY_LANDED
                  operationId:
                    type: string
                    description: The unique identifier of the operation that was detected for the attempted landing.
  /uas/{serialNumber}/operations:
    post:
      tags:
        - Operations
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
      description: Create a new operation
      operationId: createOperation
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/operationCreateFeature'
      responses:
        '201':
          description: Operation successfully created
          content:
            application/json:
              schema:
                type: object
                properties:
                  operationId:
                    type: string
                    description: The unique identifier of the operation that was created
                  portalUrl:
                    type: string
                    description: URL the user can use to complete and publish the operation.
                    format: uri
        '400':
          description: Bad request, invalid data provided.
        '401':
          description: The API key is missing.
        '403':
          description: The API key was not recognized or you're not allowed to create an operation for that UAS.
        '404':
          description: The given serial number could not be found or the UAS does not belong to your operator company.
    get:
      tags:
        - Operations
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
        - $ref: '#/components/parameters/activeAfter'
        - $ref: '#/components/parameters/activeBefore'
        - in: query
          name: activeAfter
          schema:
            type: string
            format: date-time
          description: Only return operations that are active after specified date-time
        - in: query
          name: activeBefore
          schema:
            type: string
            format: date-time
          description: Only return operations that are active before specified date-time
      description: Retrieve operations for the given UAS
      responses:
        '200':
          description: The list of operations.
          content:
            application/vnd.geo+json:
              schema:
                $ref: '#/components/schemas/operationFeaturesWithUrl'
        '400':
          description: Bad request, invalid data provided
        '403':
          description: The API key was not recognized or you're not allowed to retrieve operations for that UAS.
  /uas/{serialNumber}/operations/{operationId}:
    get:
      tags:
        - Operations
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
        - in: path
          name: operationId
          schema:
            type: string
          required: true
      responses:
        '200':
          description: The operation details
          content:
            application/vnd.geo+json:
              schema:
                $ref: '#/components/schemas/operationFeatureWithUrl'
  /uas/{serialNumber}:
    get:
      tags:
        - UAS
      summary: Retrieve an UAS
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
      responses:
        '200':
          description: Returns the UAS object
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Uas'
  /uas/{serialNumber}/flightstatus:
    get:
      tags:
        - Flight Status
      description: Retrieve the flight status of the given UAS
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
      responses:
        '200':
          description: Returns the flight status of the given UAS
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UasFlight'
  /uasoperations/{operationId}/requestAcceptance:
    post:
      tags:
        - Operations
      parameters:
        - $ref: '#/components/parameters/apiKey'
        - name: operationId
          in: path
          required: true
          schema:
            type: string
          description: The unique identifier of the operation.
      description: Request acceptance for the specified operation.
      responses:
        '200':
          description: Acceptance requested successfully.
        '401':
          description: The API key is missing.
        '403':
          description: The API key was not recognized or you're not allowed to request acceptance for this operation.
        '409':
          description: The acceptance request is not allowed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Acceptance request is not allowed due to [specific reason].
  /uasoperations/{operationId}/requestActivation:
    post:
      tags:
        - Operations
      parameters:
        - $ref: '#/components/parameters/apiKey'
        - name: operationId
          in: path
          required: true
          schema:
            type: string
          description: The unique identifier of the operation.
      description: Request activation for the specified operation.
      responses:
        '200':
          description: Activation requested successfully.
        '401':
          description: The API key is missing.
        '403':
          description: The API key was not recognized or you're not allowed to request activation for this operation.
        '409':
          description: The activation request is not allowed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Activation request is not allowed due to [specific reason].
  /uasoperations/{operationId}/requestWithdrawal:
    post:
      tags:
        - Operations
      parameters:
        - $ref: '#/components/parameters/apiKey'
        - name: operationId
          in: path
          required: true
          schema:
            type: string
          description: The unique identifier of the operation.
      description: Request withdrawal for the specified operation.
      responses:
        '200':
          description: Withdrawal requested successfully.
        '401':
          description: The API key is missing.
        '403':
          description: The API key was not recognized or you're not allowed to request withdrawal for this operation.
        '409':
          description: The withdrawal request is not allowed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Withdrawal request is not allowed due to [specific reason].
  /uasoperations/{operationId}/requestEnd:
    post:
      tags:
        - Operations
      parameters:
        - $ref: '#/components/parameters/apiKey'
        - name: operationId
          in: path
          required: true
          schema:
            type: string
          description: The unique identifier of the operation.
      description: Request the end for the specified operation.
      responses:
        '200':
          description: End requested successfully.
        '401':
          description: The API key is missing.
        '403':
          description: The API key was not recognized or you're not allowed to request cancel for this operation.
        '409':
          description: The end request is not allowed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: End request is not allowed due to [specific reason].
  /uasoperations/{operationId}/permissionrequests/submitall:
    post:
      tags:
        - PermissionRequests
      summary: Submits all permission requests of an operation.
      parameters:
        - $ref: '#/components/parameters/apiKey'
        - name: operationId
          in: path
          required: true
          schema:
            type: string
          description: The unique identifier of the operation.
      operationId: submitAllPermissionRequests
      responses:
        '200':
          description: Submit of all permission requests of an operation successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PermissionRequestsResponse'
        '401':
          description: The API key is missing.
        '403':
          description: The API key was not recognized or you're not allowed to submit permission requests for this operation.
        '409':
          description: The submit of permission requests is not allowed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Submit of permission requests is not allowed due to [specific reason].
  /uas/{serialNumber}/geofences:
    post:
      tags:
        - Geofences
      summary: Retrieve geofences
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
                - timeWindow
              properties:
                bbox:
                  $ref: '#/components/schemas/bbox'
                identifier:
                  type: string
                  description: Unique identifier of a specific geofence to fetch. Useful for when you receive an event about a new geofence and you want to fetch extra information.
                timeWindow:
                  $ref: '#/components/schemas/timeWindow'
      responses:
        '200':
          description: The applicable geofences.
          content:
            application/vnd.geo+json:
              schema:
                $ref: '#/components/schemas/GeofenceFeatureCollection'
  /uas:
    post:
      tags:
        - UAS
      summary: Create a new UAS
      parameters:
        - $ref: '#/components/parameters/apiKey'
      description: Create a new UAS with the given details.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Uas'
      responses:
        '201':
          description: UAS created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  uasId:
                    type: string
                    description: The unique identifier of the uas that was created
                  portalUrl:
                    type: string
                    description: URL the user can use to complete the UAS.
                    format: uri
        '400':
          description: Bad request, invalid data provided
        '401':
          description: The API key is missing or invalid
        '403':
          description: The API key was not recognized or you're not allowed to create an UAS.
        '409':
          description: The UAS serial number is already in use for the company..
  /company:
    get:
      tags:
        - Company
      summary: Retrieve the company information associated with the provided API key
      parameters:
        - $ref: '#/components/parameters/apiKey'
      responses:
        '200':
          description: Company information retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  companyUuid:
                    type: string
                    description: The unique identifier of the company
                    example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        '401':
          description: The API key is missing or invalid
        '403':
          description: You are not authorized to access this resource
  /uas/{serialNumber}/pilots:
    get:
      tags:
        - Pilots
      summary: List assignable pilots
      operationId: listPilots
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
      responses:
        '200':
          description: Array of users that can be selected as Pilot.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
        '401':
          description: Missing or invalid API key
        '403':
          description: UAS not linked to the company behind the API key
  /uas/{serialNumber}/observers:
    get:
      tags:
        - Observers
      summary: List assignable observers
      operationId: listObservers
      parameters:
        - $ref: '#/components/parameters/serialNumber'
        - $ref: '#/components/parameters/apiKey'
      responses:
        '200':
          description: Array of users that can be selected as observers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
        '401':
          description: Missing or invalid API key
        '403':
          description: UAS not linked to the company behind the API key
components:
  parameters:
    apiKey:
      in: header
      schema:
        type: string
      name: apikey
      required: true
      description: The API key for the user. The user can obtain this from their "profile" page.
    serialNumber:
      in: path
      schema:
        type: string
      name: serialNumber
      description: The unique serial number for the UAS
      required: true
    activeAfter:
      in: path
      schema:
        type: string
        format: date-time
      name: activeAfter
      description: The start time to filter operations
      required: true
    activeBefore:
      in: path
      schema:
        type: string
        format: date-time
      name: activeBefore
      description: The end time to filter operations
      required: true
  schemas:
    altitude:
      type: object
      properties:
        wgs84:
          description: The altitude above the WGS84 ellipsoid, in meters.
          type: number
          example: 10
        amsl:
          description: The altitude above mean sea level, in meters.
          type: number
          example: 10
        sfc:
          description: The altitude above the surface, in meters.
          type: number
          example: 3
    lineOfSightType:
      type: string
      description: |
        Classification of how visual contact with the drone is maintained during the operation. * **VLOS**  – Visual Line-Of-Sight (pilot keeps the drone in sight) * **EVLOS** – Extended VLOS via one or more qualified observers * **BVLOS** – Beyond Visual Line-Of-Sight (no continuous visual contact)
      example: VLOS
    operationFeature:
      type: object
      description: A GeoJSON Feature containing the ground projection geometry of the operation and additional properties
      properties:
        type:
          type: string
          enum:
            - Feature
        properties:
          $ref: '#/components/schemas/operationProperties'
        geometry:
          $ref: '#/components/schemas/Polygon'
    operationFeatureWithUrl:
      type: object
      description: A GeoJSON Feature containing the ground projection geometry of the operation and additional properties
      required:
        - type
        - properties
        - geometry
      properties:
        type:
          type: string
          enum:
            - Feature
        properties:
          allOf:
            - $ref: '#/components/schemas/operationPropertiesWithUrl'
          example:
            description: Roof inspection at the train station
            volume:
              start: '2022-05-23T15:04:04.812Z'
              end: '2022-05-23T15:04:04.812Z'
              maxAltitude: 0
            markers:
              - longitude: 0
                latitude: 0
                type: LANDING
        geometry:
          $ref: '#/components/schemas/Polygon'
    operationCreateFeature:
      type: object
      required:
        - type
        - properties
        - geometry
      properties:
        type:
          type: string
          enum:
            - Feature
        properties:
          $ref: '#/components/schemas/operationCreateProperties'
        geometry:
          $ref: '#/components/schemas/Polygon'
    operationFeaturesWithUrl:
      type: object
      description: A GeoJSON FeatureCollection of operations
      properties:
        type:
          type: string
          enum:
            - FeatureCollection
        features:
          type: array
          items:
            $ref: '#/components/schemas/operationFeatureWithUrl'
    operationProperties:
      allOf:
        - $ref: '#/components/schemas/operationCreateProperties'
        - type: object
          properties:
            operationId:
              type: string
              description: The unique identifier of the operation.
            operationStatus:
              type: string
              description: The status of the operation
            isInFlight:
              type: boolean
              description: Indicates if the operation is currently in flight.
              example: false
            isAllowedToTakeOff:
              type: boolean
              description: Indicates if the operation is in a state where it can start.
              example: true
    operationCreateProperties:
      type: object
      required:
        - description
        - volume
      properties:
        operationName:
          type: string
          example: Site-A July morning
        rulesetCode:
          type: string
          description: |
            Code of the operational ruleset. Known values include: certified, opena1, opena2, opena3, specific-sail2, specific-sail3, specific-sail4, specific-sail5, specific-sail6. Other values may appear depending on implementation and legislation.
          example: opena1
        description:
          type: string
          minLength: 1
          maxLength: 255
          description: Something that describes the operation
          example: Roof inspection at the train station
        lineOfSightType:
          $ref: '#/components/schemas/lineOfSightType'
        pilotUuid:
          type: string
          format: uuid
          description: UUID of the pilot-in-command
          example: 45bf1aef-20f4-4a46-9011-a4a1bf9b7f82
        observerUuids:
          type: array
          description: UUIDs of observers, the same UUID of the pilot is not allowed as observer (optional)
          items:
            type: string
            format: uuid
          example:
            - b42d5c3e-bef2-44fb-9508-358fe8a2020a
            - b42d5c3e-bef2-44fb-9508-358fe8a2020b
        volume:
          type: object
          required:
            - start
            - end
            - maxAltitude
          properties:
            start:
              description: When the operation starts
              type: string
              format: date-time
            end:
              description: When the operation ends
              type: string
              format: date-time
            maxAltitude:
              description: The maximum altitude of the operation in meter, above ground level.
              type: number
        markers:
          type: array
          items:
            type: object
            properties:
              longitude:
                type: number
              latitude:
                type: number
              type:
                type: string
                enum:
                  - LANDING
                  - TAKEOFF
                  - EMERGENCY_LANDING
            required:
              - longitude
              - latitude
              - type
    operationPropertiesWithUrl:
      allOf:
        - $ref: '#/components/schemas/operationProperties'
        - type: object
          properties:
            portalUrl:
              type: string
              description: URL to the detail page of the operation
              format: uri
              example: https://portal.uniflydemo35-dev.unifly.tech/#/operator_uuid/operation/operation_uuid
    TakeOff:
      type: object
      properties:
        flightId:
          type: string
          description: The unique identifier of the particular flight that started as the result of this takeoff
        operationId:
          type: string
          description: The unique identifier of the operation that is linked to this flight, if applicable.
    Landing:
      type: object
      properties:
        flightId:
          type: string
          description: The unique identifier of the particular flight that was ended as the result of this landing
        operationId:
          type: string
          description: The unique identifier of the operation that was linked to this flight, if applicable.
    bbox:
      description: Bounding box coordinates for which to fetch geofences, in GeoJSON bbox format ([west, south, east, north]).
      example:
        - 4.338
        - 51.06
        - 4.629
        - 51.236
      type: array
      minItems: 4
      maxItems: 4
      items:
        type: number
        minimum: -180
        maximum: 180
    timeWindow:
      description: Start and end time of the time window for which to fetch geofences, in format [start, end].
      example:
        - '2022-11-03T09:00:00Z'
        - '2022-11-03T11:00:00Z'
      type: array
      minItems: 2
      maxItems: 2
      items:
        type: string
        format: date-time
    geofenceFeature:
      type: object
      properties:
        properties:
          type: object
          properties:
            restriction:
              description: Indicates whether the geofence applies a restriction or requires an authorization.
              type: string
              enum:
                - NO_RESTRICTION
                - PROHIBITED
                - AUTHORIZATION_REQUIRED
            description:
              type: string
              description: The name or description of the geofence.
              example: Emergency UAS Zone / fire fighting
            type:
              type: string
              description: The type of geofence
              enum:
                - OPERATION
                - GEOZONE
                - USPACE
                - DAR
              example: GEOZONE
            lowerLimit:
              $ref: '#/components/schemas/altitude'
            upperLimit:
              $ref: '#/components/schemas/altitude'
    GeofenceFeatureCollection:
      allOf:
        - $ref: '#/components/schemas/FeatureCollection'
        - type: object
          properties:
            features:
              type: array
              items:
                $ref: '#/components/schemas/geofenceFeature'
    Uas:
      type: object
      required:
        - serialNumber
      properties:
        generalFeatures:
          type: object
          required:
            - weight
          properties:
            brand:
              type: string
              description: Brand of the UAS
              example: GCS MANU
            model:
              type: string
              description: Model of the UAS
              example: GCS model
            type:
              type: string
              description: Type of the UAS
              enum:
                - FIXED_WING
                - ROTARY_WING
                - FLAPPING_WING
                - POWERED_LIFT
                - AEROSTAT
                - PARAFOIL
                - HYBRID
                - OTHER
              example: ROTARY_WING
            numberOfRotors:
              type: integer
              description: Number of rotors
              example: 4
            weight:
              type: number
              description: Weight of the UAS in kilograms
              example: 2
            width:
              type: number
              description: Width of the UAS in mm
              example: 2
            height:
              type: number
              description: Height of the UAS in mm
              example: 2
            length:
              type: number
              description: Length of the UAS in mm
              example: 2
            wingspan:
              type: number
              description: Wingspan of the UAS in mm
              example: 2
            bodyMaterial:
              type: string
              description: Material of the UAS body
              enum:
                - Plastic/Carbon Fiber
                - Magnesium
                - Carbon Fiber
                - Plastic
                - Aluminum
                - Aluminum/Carbon Fiber
              example: Aluminum
            uasClass:
              type: string
              description: The classification of the UAS as defined by EU 2019/945
              enum:
                - C0
                - C1
                - C2
                - C3
                - C4
                - C5
                - C6
                - Legacy
              example: C0
        flightFeatures:
          type: object
          required:
            - mtom
          properties:
            maxFlightTime:
              type: number
              description: Maximum flight time in minutes
              example: 2
            payloadCapacity:
              type: number
              description: Payload capacity in kilograms
              example: 1.99
            mtom:
              type: number
              description: Maximum Takeoff Mass in kilograms
              example: 2
            maximumAltitude:
              type: number
              description: Maximum altitude in meters
              example: 200
            maximumSpeed:
              type: number
              description: Maximum speed in meters per second
              example: 2
            minimumOperatingTemperature:
              type: number
              description: Minimum operating temperature in Celsius
              example: 0
            maximumOperatingTemperature:
              type: number
              description: Maximum operating temperature in Celsius
              example: 32
            maxNoise:
              type: number
              description: the maximum noise the UAS will make in dB(A)
              example: 25.5
        controllerFeatures:
          type: object
          properties:
            operatingRange:
              type: number
              description: Operating range in meters
              example: 50
            controllerFrequency:
              type: number
              description: Controller frequency in GHz
              example: 2
            controlSystem:
              type: string
              description: Control system type
              example: Remote Control + Phone/Tablet
        nickname:
          type: string
          description: Nickname of the UAS
        serialNumber:
          type: string
          description: Serial number of the UAS
        registrationRef:
          type: string
          description: Registration reference of the UAS
    UasFlight:
      type: object
      properties:
        flightStatus:
          type: string
          enum:
            - LANDED
            - IN_FLIGHT
    PermissionRequestsResponse:
      type: object
      properties:
        permissionRequests:
          type: array
          items:
            $ref: '#/components/schemas/PermissionRequestResponse'
    PermissionRequestResponse:
      type: object
      properties:
        permissionRequestId:
          type: string
        submitStatus:
          type: string
          enum:
            - OK
            - FAILED
        message:
          type: string
    User:
      type: object
      description: Minimal representation of a user.
      required:
        - userUuid
        - name
      properties:
        userUuid:
          type: string
          format: uuid
          example: 46b7dd76-0b4a-4629-a711-d0f6a4d4dacd
          description: UUID.
        userMail:
          type: string
          example: fred.jansen@unifly.aero
          description: User full name.
    Polygon:
      $schema: http://json-schema.org/draft-07/schema#
      $id: https://geojson.org/schema/Polygon.json
      title: GeoJSON Polygon
      type: object
      required:
        - type
        - coordinates
      properties:
        type:
          type: string
          enum:
            - Polygon
        coordinates:
          type: array
          items:
            type: array
            minItems: 4
            items:
              type: array
              minItems: 2
              items:
                type: number
        bbox:
          type: array
          minItems: 4
          items:
            type: number
    FeatureCollection:
      $schema: http://json-schema.org/draft-07/schema#
      $id: https://geojson.org/schema/FeatureCollection.json
      title: GeoJSON FeatureCollection
      type: object
      required:
        - type
        - features
      properties:
        type:
          type: string
          enum:
            - FeatureCollection
        features:
          type: array
          items:
            title: GeoJSON Feature
            type: object
            required:
              - type
              - properties
              - geometry
            properties:
              type:
                type: string
                enum:
                  - Feature
              id:
                type: string
              properties:
                type: object
              geometry:
                oneOf:
                  - title: GeoJSON Point
                    type: object
                    required:
                      - type
                      - coordinates
                    properties:
                      type:
                        type: string
                        enum:
                          - Point
                      coordinates:
                        type: array
                        minItems: 2
                        items:
                          type: number
                      bbox:
                        type: array
                        minItems: 4
                        items:
                          type: number
                  - title: GeoJSON LineString
                    type: object
                    required:
                      - type
                      - coordinates
                    properties:
                      type:
                        type: string
                        enum:
                          - LineString
                      coordinates:
                        type: array
                        minItems: 2
                        items:
                          type: array
                          minItems: 2
                          items:
                            type: number
                      bbox:
                        type: array
                        minItems: 4
                        items:
                          type: number
                  - title: GeoJSON Polygon
                    type: object
                    required:
                      - type
                      - coordinates
                    properties:
                      type:
                        type: string
                        enum:
                          - Polygon
                      coordinates:
                        type: array
                        items:
                          type: array
                          minItems: 4
                          items:
                            type: array
                            minItems: 2
                            items:
                              type: number
                      bbox:
                        type: array
                        minItems: 4
                        items:
                          type: number
                  - title: GeoJSON MultiPoint
                    type: object
                    required:
                      - type
                      - coordinates
                    properties:
                      type:
                        type: string
                        enum:
                          - MultiPoint
                      coordinates:
                        type: array
                        items:
                          type: array
                          minItems: 2
                          items:
                            type: number
                      bbox:
                        type: array
                        minItems: 4
                        items:
                          type: number
                  - title: GeoJSON MultiLineString
                    type: object
                    required:
                      - type
                      - coordinates
                    properties:
                      type:
                        type: string
                        enum:
                          - MultiLineString
                      coordinates:
                        type: array
                        items:
                          type: array
                          minItems: 2
                          items:
                            type: array
                            minItems: 2
                            items:
                              type: number
                      bbox:
                        type: array
                        minItems: 4
                        items:
                          type: number
                  - title: GeoJSON MultiPolygon
                    type: object
                    required:
                      - type
                      - coordinates
                    properties:
                      type:
                        type: string
                        enum:
                          - MultiPolygon
                      coordinates:
                        type: array
                        items:
                          type: array
                          items:
                            type: array
                            minItems: 4
                            items:
                              type: array
                              minItems: 2
                              items:
                                type: number
                      bbox:
                        type: array
                        minItems: 4
                        items:
                          type: number
                  - title: GeoJSON GeometryCollection
                    type: object
                    required:
                      - type
                      - geometries
                    properties:
                      type:
                        type: string
                        enum:
                          - GeometryCollection
                      geometries:
                        type: array
                        items:
                          oneOf:
                            - title: GeoJSON Point
                              type: object
                              required:
                                - type
                                - coordinates
                              properties:
                                type:
                                  type: string
                                  enum:
                                    - Point
                                coordinates:
                                  type: array
                                  minItems: 2
                                  items:
                                    type: number
                                bbox:
                                  type: array
                                  minItems: 4
                                  items:
                                    type: number
                            - title: GeoJSON LineString
                              type: object
                              required:
                                - type
                                - coordinates
                              properties:
                                type:
                                  type: string
                                  enum:
                                    - LineString
                                coordinates:
                                  type: array
                                  minItems: 2
                                  items:
                                    type: array
                                    minItems: 2
                                    items:
                                      type: number
                                bbox:
                                  type: array
                                  minItems: 4
                                  items:
                                    type: number
                            - title: GeoJSON Polygon
                              type: object
                              required:
                                - type
                                - coordinates
                              properties:
                                type:
                                  type: string
                                  enum:
                                    - Polygon
                                coordinates:
                                  type: array
                                  items:
                                    type: array
                                    minItems: 4
                                    items:
                                      type: array
                                      minItems: 2
                                      items:
                                        type: number
                                bbox:
                                  type: array
                                  minItems: 4
                                  items:
                                    type: number
                            - title: GeoJSON MultiPoint
                              type: object
                              required:
                                - type
                                - coordinates
                              properties:
                                type:
                                  type: string
                                  enum:
                                    - MultiPoint
                                coordinates:
                                  type: array
                                  items:
                                    type: array
                                    minItems: 2
                                    items:
                                      type: number
                                bbox:
                                  type: array
                                  minItems: 4
                                  items:
                                    type: number
                            - title: GeoJSON MultiLineString
                              type: object
                              required:
                                - type
                                - coordinates
                              properties:
                                type:
                                  type: string
                                  enum:
                                    - MultiLineString
                                coordinates:
                                  type: array
                                  items:
                                    type: array
                                    minItems: 2
                                    items:
                                      type: array
                                      minItems: 2
                                      items:
                                        type: number
                                bbox:
                                  type: array
                                  minItems: 4
                                  items:
                                    type: number
                            - title: GeoJSON MultiPolygon
                              type: object
                              required:
                                - type
                                - coordinates
                              properties:
                                type:
                                  type: string
                                  enum:
                                    - MultiPolygon
                                coordinates:
                                  type: array
                                  items:
                                    type: array
                                    items:
                                      type: array
                                      minItems: 4
                                      items:
                                        type: array
                                        minItems: 2
                                        items:
                                          type: number
                                bbox:
                                  type: array
                                  minItems: 4
                                  items:
                                    type: number
                      bbox:
                        type: array
                        minItems: 4
                        items:
                          type: number
              bbox:
                type: array
                minItems: 4
                items:
                  type: number
        bbox:
          type: array
          minItems: 4
          items:
            type: number
