Nova-CIF v0.4

This is the offical API documentation for the Nova Common Information Function (Nova-CIF) developed by Nova Systems. The Nova-CIF currently provides four core services:

  • Authorization: To provide USSs federal authorizations for airspace access, this service implements the NASA UTM FIMS-Authz workflow with OAuth2 authentication.
  • Constraint Management: To provide dynamic restrictions (UVRs/Geozones) for airspace management, this service expands upon the ASTM interUSS Standards v0.3.4.
  • Supplemental Data Service Provider: To provide critical situational awareness data (population & buildings) for operators to assist with their flight planning process.
  • ATM Interface: To provide near-realtime air traffic state information (ADS-B) for enhanced situational awareness in the low level airspace.

To access the Nova-CIF API, please contact Nova Systems to obtain a valid Client ID. Refer to the authentication process to obtain a valid JWT to start your session.

API Change Logs

The latest version of the Nova-CIF API is v0.4, last updated on September 17, 2020. This section tracks the key changes made during its development. Note, the version number of the Nova-CIF may not be the same as the version number of the CIF Interface (GUI).

Version Status Description
v0.1 Released Nova-CIF UVRs and Geozones implementation.
v0.2 Released Nova-CIF Authentication implementation.
v0.3 Released Nova-CIF Constraints Manager and Nova-DSS integration.
v0.4 Released Nova-CIF Buildings and Populations SDSP implementation.
v0.5 Development Nova-CIF CIF-ATM Operations implementation and Nova-DSS integration.
Future Nova-CIF Population Density SDSP and NOTAMS support.

CIF Interface

The CIF Interface is a simple web-based graphical user interface developed to allow authorized users to manage Constraint references and visualize airspace information by leveraging the capabilities provided by CIF-Core and CIF-ATM.

You must register a new user account to access this service. To register for an account, you will need to supply a valid email address.

3D Constraints Air Traffic Data
Polygon Definition 3D Buildings Display

A1. Authentication

This section defines the Authentication API. You can use this API to request an OAuth2 JSON Web Token (JWT) from the Nova-CIF authentication server.

A1.1 Obtain an access token

Request a new access token for the Nova-CIF by submitting a HTTP POST request to the Nova-CIF authentication server with a valid URL query. See the Python code snippet for an example.

  • The access token provided will expire 60 minutes after the user authenticates.
  • A new access token must be obtained once every 60 minutes to extend the current session.
Property Description
grant_type (required) Authorization grant type for this API, must be set as "authorization_code".
client_id (required) The client ID as provided by Nova.
client_secret (required) The client secret key as provided by Nova.
scope (required) List of scopes to request for the generated token.
POST
{auth_url}

Example request

curl -X POST {auth_url}

Example request body

{
  "grant_type": "client_credentials",
  "scope": "constraints/read+constraints/write",
  "client_id": client_id,
  "client_secret": client_secret
}

Example response

{
  "access_token": "eyJraWQi...",
  "expires_in": 3600,
  "token_type": "Bearer"
}

A1.2 Using the access token

The access token must be supplied in the HTTP request header when making a request to the Nova-CIF. See the Python code snippet for details about how to supply the access token.

For example, you can retrieve all existing constraint references in the Nova-CIF by submitting a HTTP POST request to /constraints/query/global.

  • JSON body content does not need to be supplied for this request.

(This example is extracted from Section C3.3)

POST
/constraints/query/global

Example request

curl -X POST {base_url}/constraints/query/global

Example response

[
  {
    "constraint_id": "e85bbd66-d739-4477-befe-ee5eaea6e06d",
    "time_created": "2020-06-29T02:32:12.693Z",
    "extents": [
      {"$Volume4D"}
    ],
    "old_version": 2,
    "state": "Accepted",
    "uss_base_url": "https://fims.novautm.net",
    "constraint_type": "STC"
  },
  {
    "constraint_id": "648fcd3d-d36d-444e-9143-3d5cd41b964d",
    "time_created": "2020-06-29T02:32:12.693Z",
    "extents": [
      {"$Volume4D"}
    ],
    "old_version": 1,
    "state": "Accepted",
    "uss_base_url": "https://fims.novautm.net",
    "constraint_type": "LTC"
  }
]

C1. UVRs

This section defines the UVR endpoints within the Constraints API. You can use these endpoints to create or update Constraint objects of type UVR or STC within the Nova-CIF.

STCs must adhere to the additional limitations stipulated by the Federal Authority, the following rules are enforced by the Nova-CIF as part of its constraint validation process:

  • Constraints must be made available at least 10 minutes prior to their effective time.
  • Constraints can be made available up to 56 days before their effective time.
  • Proposed constraint adheres to the minimum effective time buffer of 5 minutes.
  • Proposed constraint adheres to the minimum duration of 5 minutes.
  • Proposed constraint adheres to the maximum duration of 24 hours.

C1.1 Create a new UVR reference

Submit a new constraint reference to the Nova-CIF by submitting a HTTP POST request to /constraints/create/uvr with valid JSON body content.

  • Scope of cif/constraints.write is required for API access.
  • The state in the response will show Accepted if the request is successful, otherwise a Rejected state will be shown.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
  • A version number old_version of 1 is automatically assigned to the constraint when a new constraint is successfully created.
Property Description
extents (required) Volume4D entity which defines the extent of the Constraint entity.
old_version (required) Version number used by the DSS, must be set to 0 for a new constraint.
uss_base_url (required) The base URL of a USS implementation of the USS-USS API.
POST
/constraints/create/uvr

Example request

curl -X POST {base_url}/constraints/create/uvr

Example request body

{
  "extents": [
    {
      "time_end": {
        "format": "RFC3339",
        "value": "2020-07-21T04:26:24Z"
      },
      "time_start": {
        "format": "RFC3339",
        "value": "2020-07-20T04:26:24Z"
      },
      "volume": {
        "altitude_lower": {
          "reference": "W84",
          "units": "M",
          "value": 0
        },
        "altitude_upper": {
          "reference": "W84",
          "units": "M",
          "value": 100
        },
        "outline_polygon": {
          "coordinates": [
            [
              [103.85495497971431, 1.2886965146831955],
              [103.85349357666604, 1.2828751821136281],
              [103.85529602112451, 1.2804725240958277],
              [103.85495497971431, 1.2886965146831955]
            ]
          ],
          "type": "Polygon"
        }
      }
    }
  ],
  "old_version": 0,
  "uss_base_url": "https://fims.novautm.net"
}

Example response

{
  "constraint_id": "e85bbd66-d739-4477-befe-ee5eaea6e06d",
  "time_created": "2020-06-29T02:32:12.693Z",
  "extents": [{"$Volume4D"}],
  "old_version": 1,
  "state": "Accepted",
  "uss_base_url": "https://fims.novautm.net",
  "constraint_type": "STC",
  "message": "Submitted constraint is conflict-free, a new constraint e85bbd66-d739-4477-befe-ee5eaea6e06d is successfully created."
}

C1.2 Update a UVR reference

Update an existing UVR constraint reference in the Nova-CIF by submitting a HTTP POST request to /constraints/update/uvr with valid JSON body content.

  • Scope of cif/constraints.update is required for API access.
  • The constraint_id of the targeted constraint reference must be supplied in the request body, otherwise the request will fail.
  • The state in the response will show Accepted if the request is successful, otherwise a Rejected state will be shown.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
  • The version number old_versionis automatically incremented by 1 when the constraint is successfully updated.
Property Description
constraint_id (required) UUID of the Constraint entity.
extents (required) Volume4D entity which defines the extent of the Constraint entity.
old_version (required) Version number used by the DSS, incremented by 1 after update.
uss_base_url (required) The base URL of a USS implementation of the USS-USS API.
POST
/constraints/update/uvr

Example request

curl -X POST {base_url}/constraints/update/uvr

Example request body

{
  "constraint_id": "e85bbd66-d739-4477-befe-ee5eaea6e06d",
  "extents": [
    {
      "time_end": {
        "format": "RFC3339",
        "value": "2020-07-21T04:26:24Z"
      },
      "time_start": {
        "format": "RFC3339",
        "value": "2020-07-20T04:26:24Z"
      },
      "volume": {
        "altitude_lower": {
          "reference": "W84",
          "units": "M",
          "value": 0
        },
        "altitude_upper": {
          "reference": "W84",
          "units": "M",
          "value": 100
        },
        "outline_polygon": {
          "coordinates": [
            [
              [103.85495497971431, 1.2886965146831955],
              [103.85349357666604, 1.2828751821136281],
              [103.85529602112451, 1.2804725240958277],
              [103.85495497971431, 1.2886965146831955]
            ]
          ],
          "type": "Polygon"
        }
      }
    }
  ],
  "old_version": 1,
  "uss_base_url": "https://fims.novautm.net"
}

Example response

{
  "constraint_id": "e85bbd66-d739-4477-befe-ee5eaea6e06d",
  "time_created": "2020-06-29T02:32:12.693Z",
  "extents": [{"$Volume4D"}],
  "old_version": 2,
  "state": "Accepted",
  "uss_base_url": "https://fims.novautm.net",
  "constraint_type": "STC",
  "message": "Successfully updated constraint e85bbd66-d739-4477-befe-ee5eaea6e06d."
}

C2. Geozones

This section defines the Geozone endpoints within the Constraints API. You can use these endpoints to create or update Constraint objects of type Geozone or LTC within the Nova-CIF.

C2.1 Create a new geozone reference

Submit a new geozone reference to the Nova-CIF by submitting a HTTP POST request to /constraints/create/gz with valid JSON body content.

  • Scope of cif/constraints.write is required for API access.
  • The state in the response will show Accepted if the request is successful, otherwise a Rejected state will be shown.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
  • A version number old_version of 1 is automatically assigned to the constraint when a new constraint is successfully created.
Property Description
extents (required) Volume4D entity which defines the extent of the Constraint entity.
old_version (required) Version number used by the DSS, must be set to 0 for a new constraint.
uss_base_url (required) The base URL of a USS implementation of the USS-USS API.
POST
/constraints/create/gz

Example request

curl -X POST {base_url}/constraints/create/gz

Example request body

{
  "extents": [
    {
      "time_end": {
        "format": "RFC3339",
        "value": "2020-07-21T04:26:24Z"
      },
      "time_start": {
        "format": "RFC3339",
        "value": "2020-07-20T04:26:24Z"
      },
      "volume": {
        "altitude_lower": {
          "reference": "W84",
          "units": "M",
          "value": 0
        },
        "altitude_upper": {
          "reference": "W84",
          "units": "M",
          "value": 100
        },
        "outline_polygon": {
          "coordinates": [
            [
              [103.85495497971431, 1.2886965146831955],
              [103.85349357666604, 1.2828751821136281],
              [103.85529602112451, 1.2804725240958277],
              [103.85495497971431, 1.2886965146831955]
            ]
          ],
          "type": "Polygon"
        }
      }
    }
  ],
  "old_version": 0,
  "uss_base_url": "https://fims.novautm.net"
}

Example response

{
  "constraint_id": "648fcd3d-d36d-444e-9143-3d5cd41b964d",
  "time_created": "2020-06-29T02:32:12.693Z",
  "extents": [{"$Volume4D"}],
  "old_version": 1,
  "state": "Accepted",
  "uss_base_url": "https://fims.novautm.net",
  "constraint_type": "LTC",
  "message": "Submitted constraint is conflict-free, a new constraint 648fcd3d-d36d-444e-9143-3d5cd41b964d is successfully created."
}

C2.2 Update a geozone reference

Update an existing geozone constraint reference in the Nova-CIF by submitting a HTTP POST request to /constraints/update/gz with valid JSON body content.

  • Scope of cif/constraints.update is required for API access.
  • The constraint_id of the targeted constraint reference must be supplied in the request body, otherwise the request will fail.
  • The state in the response will show Accepted if the request is successful, otherwise a Rejected state will be shown.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
  • The version number old_versionis automatically incremented by 1 when the constraint is successfully updated.
Property Description
constraint_id (required) UUID of the Constraint entity.
extents (required) Volume4D entity which defines the extent of the Constraint entity.
old_version (required) Version number used by the DSS, incremented by 1 after update.
uss_base_url (required) The base URL of a USS implementation of the USS-USS API.
POST
/constraints/update/gz

Example request

curl -X POST {base_url}/constraints/update/gz

Example request body

{
  "constraint_id": "648fcd3d-d36d-444e-9143-3d5cd41b964d",
  "extents": [
    {
      "time_end": {
        "format": "RFC3339",
        "value": "2020-07-21T04:26:24Z"
      },
      "time_start": {
        "format": "RFC3339",
        "value": "2020-07-20T04:26:24Z"
      },
      "volume": {
        "altitude_lower": {
          "reference": "W84",
          "units": "M",
          "value": 0
        },
        "altitude_upper": {
          "reference": "W84",
          "units": "M",
          "value": 100
        },
        "outline_polygon": {
          "coordinates": [
            [
              [103.85495497971431, 1.2886965146831955],
              [103.85349357666604, 1.2828751821136281],
              [103.85529602112451, 1.2804725240958277],
              [103.85495497971431, 1.2886965146831955]
            ]
          ],
          "type": "Polygon"
        }
      }
    }
  ],
  "old_version": 1,
  "uss_base_url": "https://fims.novautm.net"
}

Example response

{
  "constraint_id": "648fcd3d-d36d-444e-9143-3d5cd41b964d",
  "time_created": "2020-06-29T02:32:12.693Z",
  "extents": [{"$Volume4D"}],
  "old_version": 2,
  "state": "Accepted",
  "uss_base_url": "https://fims.novautm.net",
  "message": "Successfully updated constraint 648fcd3d-d36d-444e-9143-3d5cd41b964d.",
  "constraint_type": "LTC"
}

C3. CM-Queries

This section defines the query methods within the Constraints API. You can use these endpoints to query or remove Constraint objects within the Nova-CIF.

Note Constraint objects can be of type UVR or Geozone. A geozone reference is a long-term constraint (LTC). A UVR reference is a short-term constraint (STC).

C3.1 Query an existing constraint

Query an existing constraint reference in the Nova-CIF by submitting a HTTP GET request to /constraints/query/{constraint_id}.

  • Scope of cif/constraints.read is required for API access.
  • constraint_id must be specified in the URL parameter /{constraint_id}.
  • JSON body content does not need to be supplied for this request.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
Property Description
constraint_id (required) UUID of the Constraint entity.
GET
/constraints/query/{constraint_id}

Example request

curl -X GET {base_url}/constraints/query/{constraint_id}

Example response

{
  "constraint_id": "648fcd3d-d36d-444e-9143-3d5cd41b964d",
  "time_created": "2020-06-29T02:32:12.693Z",
  "extents": [
    {
      "volume": {
        "outline_polygon": {
          "coordinates": [
            [
              [103.85495497971431, 1.2886965146831955],
              [103.85349357666604, 1.2828751821136282],
              [103.85529602112452, 1.2804725240958277],
              [103.85495497971431, 1.2886965146831955]
            ]
          ],
          "type": "Polygon"
        },
        "altitude_upper": {
          "reference": "W84",
          "value": 100,
          "units": "M"
        },
        "altitude_lower": {
          "reference": "W84",
          "value": 0,
          "units": "M"
        }
      },
      "time_start": {
        "format": "RFC3339",
        "value": "2020-07-20T04:26:24Z"
      },
      "time_end": {
        "format": "RFC3339",
        "value": "2020-07-21T04:26:24Z"
      }
    }
  ],
  "old_version": 2,
  "state": "Accepted",
  "uss_base_url": "https://fims.novautm.net",
  "constraint_type": "LTC",
  "message": "Constraint 648fcd3d-d36d-444e-9143-3d5cd41b964d retrieved."
}

C3.2 Query active constraints by type

Retrieve all active constraint references by type in the Nova-CIF by submitting a HTTP GET request to /constraints/type/{constraint_type}. Active constraint references are defined as constraint entities with a valid time horizon.

  • Scope of cif/constraints.read is required for API access.
  • type must be specified in the URL parameter /{constraint_type} as a valid string.
  • JSON body content does not need to be supplied for this request.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
Property Description
constraint_type (required) Type of constraint (UVR or Geozone), i.e. STC or LTC
GET
/constraints/query/type/{constraint_type}

Example request

curl -X GET {base_url}/constraints/query/type/{constraint_type}

Example response

[
  {
    "constraint_id": "e85bbd66-d739-4477-befe-ee5eaea6e06d",
    "time_created": "2020-06-29T02:32:12.693Z",
    "extents": [{"$Volume4D"}],
    "old_version": 2,
    "state": "Accepted",
    "uss_base_url": "https://fims.novautm.net",
    "constraint_type": "STC"
  }
]

C3.3 Retrieve all active constraints

Retrieve all active constraint references relative to a time reference in the Nova-CIF by submitting a HTTP GET request to /constraints/active/{time}. Active constraint references are defined as constraint entities with a valid time horizon.

  • Scope of cif/constraints.read is required for API access.
  • time must be specified in the URL parameter /{time} as a Unix timestamp.
  • JSON body content does not need to be supplied for this request.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
Property Description
time (required) Time reference used to form the query, specified as a Unix timestamp.
GET
/constraints/query/active/{time}

Example request

curl -X GET {base_url}/constraints/query/active/{time}

Example response

[
  {
    "constraint_id": "e85bbd66-d739-4477-befe-ee5eaea6e06d",
    "time_created": "2020-06-29T02:32:12.693Z",
    "extents": [{"$Volume4D"}],
    "old_version": 2,
    "state": "Accepted",
    "uss_base_url": "https://fims.novautm.net",
    "constraint_type": "STC"
  },
  {
    "constraint_id": "648fcd3d-d36d-444e-9143-3d5cd41b964d",
    "time_created": "2020-06-29T02:32:12.693Z",
    "extents": [{"$Volume4D"}],
    "old_version": 1,
    "state": "Accepted",
    "uss_base_url": "https://fims.novautm.net",
    "constraint_type": "LTC"
  }
]

C3.4 Retrieve all existing constraints

Retrieve all existing constraint references in the Nova-CIF by submitting a HTTP POST request to /constraints/query/global.

  • Scope of cif/constraints.read is required for API access.
  • JSON body content does not need to be supplied for this request.
POST
/constraints/query/global

Example request

curl -X POST {base_url}/constraints/query/global

Example response

[
  {
    "constraint_id": "e85bbd66-d739-4477-befe-ee5eaea6e06d",
    "time_created": "2020-06-29T02:32:12.693Z",
    "extents": [{"$Volume4D"}],
    "old_version": 2,
    "state": "Accepted",
    "uss_base_url": "https://fims.novautm.net",
    "constraint_type": "STC"
  },
  {
    "constraint_id": "648fcd3d-d36d-444e-9143-3d5cd41b964d",
    "time_created": "2020-06-29T02:32:12.693Z",
    "extents": [{"$Volume4D"}],
    "old_version": 1,
    "state": "Accepted",
    "uss_base_url": "https://fims.novautm.net",
    "constraint_type": "LTC"
  }
]

C3.5 Remove an existing constraint

Remove an existing constraint reference from the Nova-CIF by submitting a HTTP DELETE request to /constraints/remove/{constraint_id}.

  • Scope of cif/constraints.delete is required for API access.
  • constraint_id must be specified in the URL parameter /{constraint_id}.
  • JSON body content does not need to be supplied for this request.
  • The state in the response will show Accepted if the request is successful, otherwise a Rejected state will be shown.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
Property Description
constraint_id (required) UUID of the Constraint entity.
DELETE
/constraints/remove/{constraint_id}

Example request

curl -X DELETE {base_url}/constraints/remove/{constraint_id}

Example response

{
  "message": "Constraint 648fcd3d-d36d-444e-9143-3d5cd41b964d deleted."
}

C4. Operations

This section defines the Operations endpoints within the Operations API. You can use these endpoints to create or update Operation objects of type Drone or Aircraft within the Nova-CIF.

(TBA)

C5. interUSS*

This section defines the set of methods from the Constraints API configured for external use. You can use these endpoints to query Constraint objects within the Nova-CIF.

Note the differences in data structure between the HTTP responses given here as compared to that given by the query methods defined in Section C3.

C5.1 Retrieve constraint details

Query an existing constraint reference in the Nova-CIF by submitting a HTTP GET request to /constraints/{constraint_id}.

  • Scope of cif/constraints.read is required for API access.
  • constraint_id must be specified in the URL parameter /{constraint_id}.
  • JSON body content does not need to be supplied for this request.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.

URL parameters:

Property Description
constraint_id (required) UUID of the Constraint entity.

HTTP response status codes:

Code Description
200 Constraint details were retrieved successfully.
400 One or more parameters were missing or invalid.
401 Access token was not provided in Authorization header, token could not be decoded, or token was invalid.
403 The access token was decoded successfully but did not include a scope appropriate to this endpoint.
404 The requested entity could not be found.
GET
/uss/v1/constraints/{constraint_id}

Example request

curl -X GET {base_url}/uss/v1/constraints/{constraint_id}

Example response

{
  "constraint": {
    "reference": {
      "id": "7d37307f-92f2-4f07-8a26-eb3fcac3636c",
      "owner": "1hlc4etfl7fp8tv11r11rclij3",
      "version": 3,
      "time_start": {
        "format": "RFC3339",
        "value": "2020-07-17T12:00:00Z"
      },
      "time_end": {
        "format": "RFC3339",
        "value": "2020-07-17T13:00:00Z"
      },
      "uss_base_url": "https://fims.novautm.net"
    },
    "details": {
      "volumes": [
        {
          "volume": {
            "altitude_upper": {
              "reference": "W84",
              "value": 100,
              "units": "M"
            },
            "altitude_lower": {
              "reference": "W84",
              "value": 0,
              "units": "M"
            },
            "outline_polygon": {
              "coordinates": [
                [
                  [103.85495497971431, 1.2886965146831955],
                  [103.85349357666604, 1.2828751821136281],
                  [103.85529602112451, 1.2804725240958277],
                  [103.85495497971431, 1.2886965146831955]
                ]
              ],
              "type": "Polygon"
            }
          },          
          "time_start": {
            "format": "RFC3339",
            "value": "2020-07-17T12:00:00Z"
          },
          "time_end": {
            "format": "RFC3339",
            "value": "2020-07-17T13:00:00Z"
          }
        },
      ],
      "type": "STC",
      "state": "Accepted"
    }
  }
}

C5.2 Notify updated constraint details

Notify Nova-CIF directly of changed constraint details by submitting a HTTP POST request to /constraints with valid JSON body content.

  • Scope of cif/constraints.write is required for API access.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.

HTTP request parameters:

Property Description
constraint_id (required) UUID of the Constraint entity.
constraint (required) Full specification of a UTM Constraint.
subscriptions (required) Subscription(s) from DSS prompting this notification.

HTTP response status codes:

Code Description
204 New or updated full Constraint information received successfully.
400 The Entity could not be parsed, or contains illegal data.
401 Access token was not provided in Authorization header, token could not be decoded, or token was invalid.
403 The access token was decoded successfully but did not include a scope appropriate to this endpoint.
POST
/uss/v1/constraints

Example request

curl -X POST {base_url}/uss/v1/constraints

Example request body

{
  "constraint_id": "7d37307f-92f2-4f07-8a26-eb3fcac3636c",
  "constraint": {
    "reference": {
      "id": "7d37307f-92f2-4f07-8a26-eb3fcac3636c",
      "owner": "1hlc4etfl7fp8tv11r11rclij3",
      "version": 3,
      "time_start": {
        "format": "RFC3339",
        "value": "2020-07-17T12:00:00Z"
      },
      "time_end": {
        "format": "RFC3339",
        "value": "2020-07-17T13:00:00Z"
      },
      "uss_base_url": "https://fims.novautm.net"
    },
    "details": {
      "volumes": [
        {
          "volume": {
            "altitude_upper": {
              "reference": "W84",
              "value": 100,
              "units": "M"
            },
            "altitude_lower": {
              "reference": "W84",
              "value": 0,
              "units": "M"
            },
            "outline_polygon": {
              "coordinates": [
                [
                  [103.85495497971431, 1.2886965146831955],
                  [103.85349357666604, 1.2828751821136281],
                  [103.85529602112451, 1.2804725240958277],
                  [103.85495497971431, 1.2886965146831955]
                ]
              ],
              "type": "Polygon"
            }
          },
          "time_start": {
            "format": "RFC3339",
            "value": "2020-07-17T12:00:00Z"
          },
          "time_end": {
            "format": "RFC3339",
            "value": "2020-07-17T13:00:00Z"
          }
        }
      ]
    }
  },
  "subscriptions": [
    {
      "notification_index": 1,
      "subscription_id": "282c196e-c707-41d2-a94d-b03cf39127c9"
    }
  ]
}

Example response

{
  "message": "Constraint information received successfully."
}

C5.3 Subscribe to notifications

Subscribe to Nova-CIF for updates by submitting a HTTP PUT request to /subscriptions with valid JSON body content. Subscription notifications are only triggered by changes to, creation of, or deletion of Constraint or Operation entities in the DSS.

  • Scope of cif/subscriptions is required for API access.
  • This endpoint is a proxy to the DSS, note subscription area cannot be too large.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.

HTTP request parameters:

Property Description
extents (required) Volume4D entity which defines the extent of the subscription area.
old_version (required) Version number must be set to 0 for a new subscription.
uss_base_url (required) The base URL where notifications will be pushed to.
notify_for_operations (optional) Subscribe for Operation notifications. Default is "false".
notify_for_constraints (optional) Subscribe for Constraint notifications. Default is "false".

HTTP response status codes:

Code Description
200 A new Subscription was created successfully.
400 The request attempted to mutate the Subscription in a disallowed way.
401 Access token was not provided in Authorization header, token could not be decoded, or token was invalid.
403 The access token was decoded successfully but did not include a scope appropriate to this endpoint.
PUT
/uss/v1/subscriptions

Example request

curl -X PUT {base_url}/uss/v1/subscriptions

Example request body

{
   "extents": {
      "time_end": {
         "format": "RFC3339",
         "value": "2020-08-12T14:26:24Z"
      },
      "time_start": {
         "format": "RFC3339",
         "value": "2020-08-12T10:26:24Z"
      },
      "volume": {
         "altitude_lower": {
            "reference": "W84",
            "units": "M",
            "value": 0
         },
         "altitude_upper": {
            "reference": "W84",
            "units": "M",
            "value": 100
         },
         "outline_polygon": {
            "coordinates": [
               [
                  [103.84313131960306, 1.2884812239473575],
                  [103.83284296993344, 1.2574632207548007],
                  [103.90566519493661, 1.2222661763030516],
                  [103.93508344477397, 1.2889633660872732],
                  [103.84313131960306, 1.2884812239473575]
               ]
            ],
            "type": "Polygon"
         }
      }
   },
   "old_version": 0,
   "uss_base_url": "https://fims.novautm.net",
   "notify_for_operations": "true",
   "notify_for_constraints": "true"
}

Example response

{
  "constraints": [
    {
      "id": "1713c11a-2957-4665-acd6-0687ea410412",
      "ovn": "1OxgePtMiHqHgGraLLSXy2sXQOeKoMqSbY0BWFkdkFE=",
      "owner": "1hlc4etfl7fp8tv11r11rclij3",
      "time_end": {
        "format": "RFC3339",
        "value": "2020-08-12T13:00:00Z"
      },
      "time_start": {
        "format": "RFC3339",
        "value": "2020-08-12T12:00:00Z"
      },
      "uss_base_url": "https://fims.novautm.net",
      "version": 1
    }
  ],
  "operations": [],
  "subscription": {
    "dependent_operations": [],
    "id": "a0ad441b-f016-4cad-b4ae-b7ed26ba5be0",
    "implicit_subscription": false,
    "notification_index": 0,
    "notify_for_constraints": true,
    "notify_for_operations": true,
    "time_end": {
      "format": "RFC3339",
      "value": "2020-08-12T14:26:24Z"
    },
    "time_start": {
      "format": "RFC3339",
      "value": "2020-08-12T10:26:24Z"
    },
    "uss_base_url": "https://fims.novautm.net",
    "version": 1
  }
}

S1. Buildings

This section defines the Building Data Service within the CIF-SDSP. You can use these endpoints to query Building objects within the CIF-SDSP.

Buildings

S1.1 Query data with box selection

Define a box to query a geographical area to retrieve building data by submitting a HTTP POST request to /buildings/query/box.

  • Scope of sdsp/buildings.read is required for API access.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
Property Description
box_lower (required) Lower bounds of the geographical query area given as a lon-lat pair.
box_upper (required) Upper bounds of the geographical query area given as a lon-lat pair.
POST
/buildings/query/box

Example request

curl -X POST {base_url}/buildings/query/box

Example request body

{
   "box": {
	  "box_lower": [103.866288, 1.314993],
	  "box_upper": [103.871510, 1.314044]
   }
}

Example response

{
  "data": [
    {
      "building_id": "way/295367545",
      "residents": 21,
      "centroid": {
        "type": "Point",
        "coordinates": [103.87169677997852, 1.3151087000293904]
      },
      "volume": {
        "outline_polygon": {
          "coordinates": [
            [
              [103.87194759999971, 1.3153839000000036],
              [103.87209839999971, 1.3150074000000036],
              [103.87132059999972, 1.3146959000000038],
              [103.87116969999971, 1.3150724000000034],
              [103.87194759999971, 1.3153839000000036]
            ]
          ],
          "type": "Polygon"
        },
        "altitude_upper": {
          "reference": "W84",
          "value": 4.1,
          "units": "M"
        },
        "altitude_lower": {
          "reference": "W84",
          "value": 0,
          "units": "M"
        }
      },
      "description": "Building data provided by Nova-CIF SDSP.",
      "date_created": "2020-07-23T06:28:58Z"
    }
  ],
  "message": "Request is successful.",
  "state": "Success"
}

S1.2 Query data with polygon

Define a polygon to query a geographical area to retrieve building data by submitting a HTTP POST request to /buildings/query/polygon.

  • Scope of sdsp/buildings.read is required for API access.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
Property Description
coordinates (required) Coordinates which define the polygon in GeoJSON format.
type (required) Must be defined as "Polygon".
POST
/buildings/query/polygon

Example request

curl -X POST {base_url}/buildings/query/polygon

Example request body

{
  "coordinates": [
    [
      [103.866288, 1.314993],
      [103.871510, 1.314044],
      [103.869494, 1.309757],
      [103.866288, 1.314993]
    ]
  ],
  "type": "Polygon"
}

Example response

{
  "data": [
    {
      "building_id": "way/295367545",
      "residents": 21,
      "centroid": {
        "type": "Point",
        "coordinates": [103.87169677997852, 1.3151087000293904]
      },
      "volume": {"$Volume3D"},
      "description": "Building data provided by Nova-CIF SDSP.",
      "date_created": "2020-07-23T06:28:58Z"
    }
  ],
  "message": "Request is successful.",
  "state": "Success"
}

S1.3 Query data along path

Define a path to retrieve coinciding building data by submitting a HTTP POST request to /buildings/query/path. A path is made up of sequential line segments of the type LineString.

  • Scope of sdsp/buildings.read is required for API access.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
Property Description
coordinates (required) Coordinates which define the path in GeoJSON format.
type (required) Must be defined as "LineString".
POST
/buildings/query/path

Example request

curl -X POST {base_url}/buildings/query/path

Example request body

{
  "coordinates": [
    [103.866288, 1.314993],
    [103.871510, 1.314044],
    [103.869494, 1.309757]
  ],
  "type": "LineString"
}

Example response

{
  "data": [
    {
      "building_id": "way/295367545",
      "residents": 21,
      "centroid": {
        "type": "Point",
        "coordinates": [103.87169677997852, 1.3151087000293904]
      },
      "volume": {
        "outline_polygon": {"$Volume3D"},
      "description": "Building data provided by Nova-CIF SDSP.",
      "date_created": "2020-07-23T06:28:58Z"
    }
  ],
  "message": "Request is successful.",
  "state": "Success"
}

S2. Population

This section defines the Population Data Service within the CIF-SDSP. You can use these endpoints to query population data such as urban population density information.

(TBA)

M1. Air Traffic

This section defines the Air Traffic Data Service within the CIF-SDSP. You can use these endpoints to query live aircraft state information (ADS-B) from the CIF-ATM server.

Air Traffic

M1.1 Query latest air traffic states

Retrieve all active airborne air traffic state information within the Singapore Airspace by submitting a HTTP GET request to /traffic/query/active. Air traffic states within a 1 minute time interval from the time of the request are classified as active.

  • Scope of cif/traffic.read is required for API access. (TBA)
  • JSON body content does not need to be supplied for this request.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
Property Description
time (required) Time reference used to form the query, specified as a Unix timestamp.
GET
/traffic/query/active

Example request

curl -X GET {base_url}/traffic/query/active

Example response

[
  {
    "reference": {
      "icao24": "780a6f",
      "origin_country": "China",
      "callsign": "CPA2074 ",
      "state": "airborne"
    },
    "details": {
      "ground_speed": {
        "reference": "GROUND",
        "units": "MetersPerSecond",
        "value": 152.66
      },
      "position": {
        "coordinates": [104.0187, 1.4536],
        "type": "Point"
      },
      "last_contact": {
        "format": "UNIX",
        "value": 1599642060
      },
      "baro_altitude": {
        "reference": "BAROMETRIC",
        "units": "M",
        "value": 2118.36
      },
      "geo_altitude": {
        "reference": "AGL",
        "units": "M",
        "value": 2194.56
      },
      "heading": {
        "reference": "NORTH",
        "units": "DEG",
        "value": 4.06
      }
    }
  }
]

M1.2 Query air traffic states by time

Retrieve all active airborne air traffic state information within the Singapore Airspace by specifying a time origin in a HTTP GET request to /traffic/query/active/{time}. Air traffic states within a time interval measured from the specified time origin and the time of the request are classified as active.

  • Scope of cif/traffic.read is required for API access. (TBA)
  • JSON body content does not need to be supplied for this request.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.
GET
/traffic/query/active/{time}

Example request

curl -X GET {base_url}/traffic/query/active/{time}

Example response

[
  {
    "reference": {
      "icao24": "780a6f",
      "origin_country": "China",
      "callsign": "CPA2074 ",
      "state": "airborne"
    },
    "details": {
      "ground_speed": {
        "reference": "GROUND",
        "units": "MetersPerSecond",
        "value": 152.66
      },
      "position": {
        "coordinates": [104.0187, 1.4536],
        "type": "Point"
      },
      "last_contact": {
        "format": "UNIX",
        "value": 1599642060
      },
      "baro_altitude": {
        "reference": "BAROMETRIC",
        "units": "M",
        "value": 2118.36
      },
      "geo_altitude": {
        "reference": "AGL",
        "units": "M",
        "value": 2194.56
      },
      "heading": {
        "reference": "NORTH",
        "units": "DEG",
        "value": 4.06
      }
    }
  }
]

M2. Operations

The CIF-ATM service automagically creates Operation references from near-realtime air traffic data (manned air operations) and injects them into the DSS for discovery and synchronization within the local UTM ecosystem.

These manned Operation references are created at a certain frequency which is based on the update rate of the near-realtime air traffic telemetry information. This update rate is approximately 10-15 seconds.

All manned Operation references are treated as NonConforming flights in the DSS. New Operation references created by the CIF-ATM will trigger a notification which notifies the relevant USS who is subscribed to an area in the proximity of the flight.

Upon receiving a notification, the USS should query the CIF-ATM to retrieve specific information about the Operation and establish a connection to receive telemetry updates from the NonConforming flight. This is done IAW the ASTM interUSS Standards.

The ASTM-compliant Operation endpoints are provided in the Section M3.

M3. interUSS*

This section defines Operation API witin the CIF-ATM service. This API is reserved for handling of manned air operations and should not to be confused with the Operation API within the CIF-USS service, which is restricted to UA operations.

You can use these endpoints to query Operation details and telemetry updates within the CIF-ATM service.

M3.1 Retrieve operation details

Query an existing operation reference in the CIF-ATM by submitting a HTTP GET request to /operations/{operation_id}.

  • Scope of cif/traffic.read is required for API access. (TBA)
  • operation_id must be specified in the URL parameter /{operation_id}.
  • JSON body content does not need to be supplied for this request.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.

URL parameters:

Property Description
operation_id (required) UUID of the Operation entity.

HTTP response status codes:

Code Description
200 Operation details were retrieved successfully.
400 One or more parameters were missing or invalid.
401 Access token was not provided in Authorization header, token could not be decoded, or token was invalid.
403 The access token was decoded successfully but did not include a scope appropriate to this endpoint.
404 The requested entity could not be found.
GET
/uss/v1/operations/{operation_id}

Example request

curl -X GET {base_url}/uss/v1/operations/{operation_id}

Example response

{
  "operation": {
    "reference": {
      "subscribers": [
        {
          "subscriptions": [
            {
              "subscription_id": "04057eb0-ce6a-4862-adba-6ce3c30498f7",
              "notification_index": 2
            },
            {
              "subscription_id": "3b182833-2c22-485a-8adf-ab406e378891",
              "notification_index": 1
            }
          ],
          "uss_base_url": "https://atm.fims.novautm.net"
        }
      ],
      "operation_reference": {
        "owner": "1hlc4etfl7fp8tv11r11rclij3",
        "subscription_id": "3b182833-2c22-485a-8adf-ab406e378891",
        "uss_base_url": "https://atm.fims.novautm.net",
        "time_start": {
          "format": "RFC3339",
          "value": "2020-09-14T09:31:29Z"
        },
        "ovn": "Fp/YVC/6mvzV5afSaU8yYN5CHHcA/OPuNlGxTzUX/lI=",
        "id": "0acf0517-5e02-40e7-a6d3-f6ff92de00ff",
        "time_end": {
          "format": "RFC3339",
          "value": "2020-09-14T09:41:29Z"
        },
        "version": 2
      }
    },
    "details": {
      "volumes": [
        {
          "volume": {
            "outline_circle": {
              "type": "Feature",
              "geometry": {
                "coordinates": [104.0379, 1.4541]
              },
              "properties": {
                "radius": {
                  "value": 100,
                  "units": "M"
                }
              }
            },
            "altitude_upper": {
              "reference": "W84",
              "value": 1132.46,
              "units": "M"
            },
            "altitude_lower": {
              "reference": "W84",
              "value": 132.46000000000004,
              "units": "M"
            }
          },
          "time_start": {
            "format": "RFC3339",
            "value": "2020-09-14T09:31:29.000Z"
          },
          "time_end": {
            "format": "RFC3339",
            "value": "2020-09-14T09:41:29.000Z"
          }
        }
      ],
      "state": "NonConforming",
      "vlos": false
    }
  }
}

M3.2 Retrieve operation telemetry

Query telemetry data from an existing operation in the CIF-ATM by submitting a HTTP GET request to /operations/{operation_id}/telemetry.

  • Scope of cif/traffic.read is required for API access. (TBA)
  • operation_id must be specified in the URL parameter /{operation_id}.
  • JSON body content does not need to be supplied for this request.
  • If the request is unsuccessful, refer to the response message for information on how to rectify the request.

URL parameters:

Property Description
operation_id (required) UUID of the Operation entity.

HTTP response status codes:

Code Description
200 Operation telemetry details were retrieved successfully.
400 One or more parameters were missing or invalid.
401 Access token was not provided in Authorization header, token could not be decoded, or token was invalid.
403 The access token was decoded successfully but did not include a scope appropriate to this endpoint.
404 The requested entity could not be found.
409 Operation is not in a state that provides telemetry.
GET
/uss/v1/operations/{operation_id}/telemetry

Example request

curl -X GET {base_url}/uss/v1/operations/{operation_id}/telemetry

Example response

{
  "telemetry": {
    "id": "0acf0517-5e02-40e7-a6d3-f6ff92de00ff",
    "position": {
      "longitude": 103.9883,
      "latitude": 1.3445,
      "accuracy_h": "HAUnknown",
      "accuracy_v": "VAUnknown",
      "extrapolated": false,
      "altitude": {
        "value": 632.46,
        "reference": "AGL",
        "units": "M"
      }
    },
    "velocity": {
      "speed": 6.17,
      "units_speed": "MetersSecond",
      "track": 292.5
    },
    "time_measured": {
      "value": "2020-09-14T09:36:15.000Z",
      "format": "RFC3339"
    }
  }
}

Data Formats

This section defines the data schemas used by Nova-CIF. The current API implements the ASTM interUSS Standards v0.3.4 data schemas.

$ UUID

Universally-unique identifier (version 4). Given as constraint_id.

Example schema

"648fcd3d-d36d-444e-9143-3d5cd41b964d"

$ UTC Time

RFC3339-formatted datetime object. The time zone must be 'Z'.

Property Description
format (required) Must be "RFC3339".
value (required) Time string in RFC3339 format.

Example schema

{
  "format": "RFC3339",
  "value": "2020-05-21T04:26:24Z"
}

$ LonLatPair

Pair of longitude and latitude used for specifying geographical vertex. Specified as an array. Note the exact order is important!

  • Longitude given as degrees east of the Prime Meridian with reference to W84
  • Latitude given as degrees north of the equator with reference to W84

Example schema

[
  103.87169677997852, 
  1.3151087000293904
]

$ Altitude

Altitude reference object.

Property Description
reference (required) UTM currently only allows "W84".
units (required) UTM only allows meters, "M".
value (required) Numeric value of the altitude.

Example schema

{
  "reference": "W84",
  "units": "M",
  "value": 0
}

$ GeoPoint

Point GeoJSON geometry. Note that coordinates is validated to be be an array of size two.

Property Description
coordinates (required) Longitude latitude pair.
type (required) Must be 'Polygon' per GeoJSON spec.

Example schema

{
  "coordinates": [
    103.87169677997852, 1.3151087000293904
  ],
  "type": "Point"
}

$ GeoPolygon

Polygon GeoJSON geometry. Note that coordinates is validated to be be an array of size one. This implies there are no interior rings allowed currently.

Property Description
coordinates (required) Polygon coordinates per GeoJSON spec.
type (required) Must be 'Polygon' per GeoJSON spec.

Example schema

{
  "coordinates": [
    [
      [103.85495497971431, 1.2886965146831955],
      [103.85349357666604, 1.2828751821136281],
      [103.85529602112451, 1.2804725240958277],
      [103.85495497971431, 1.2886965146831955]
    ]
  ],
  "type": "Polygon"
}

$ GeoPath

LineString GeoJSON geometry. Note that coordinates is an array of LonLatPair vertices.

Property Description
coordinates (required) Array of vertices.
type (required) Must be 'Polygon' per GeoJSON spec.

Example schema

{
  "coordinates": [
    [103.866288, 1.314993],
    [103.871510, 1.314044],
    [103.869494, 1.309757]
  ],
  "type": "LineString"
}

$ Volume3D

Three-dimensional geographic volume consisting of a vertically-extruded shape.

Property Description
altitude_lower (required) Lower bounding altitude of this volume.
altitude_upper (required) Upper bounding altitude of this volume.
outline_polygon (required) Polygon object per GeoJSON spec.

Example schema

{
  "altitude_lower": {"$Altitude"},
  "altitude_upper": {"$Altitude"},
  "outline_polygon": {"$Polygon"}
}

$ Volume4D

Four-dimensional geographic volume consisting of a vertically-extruded shape and a finite time horizon.

Property Description
time_start (required) Start time of this volume.
time_end (required) End time of this volume.
volume (required) Volume3D object.

Example schema

{
  "time_end": {"$Time"},
  "time_start": {"$Time"},
  "volume": {"$Volume3D"}
}

$ CIFConstraint

A constraint reference entity defines the geographical airspace restriction in spacetime. Refer to the ASTM interUSS Standards for more details on its usage.

  • Note the extents property is an array which contains a single Volume4D object.
  • Note the CIFConstraint schema is not the same as the DSSConstraint schema.
Property Description
constraint_id (required) UUID of the Constraint entity.
extents (required) Volume4D entity which defines the extent of the Constraint entity.
old_version (required) Version number used by the DSS.
uss_base_url (required) The base URL of a USS implementation of the USS-USS API.

Example schema

{
  "constraint_id": {"$UUID"},
  "extents": [{"$Volume4D"}],
  "time_created": {"$Time"},
  "old_version": 1,
  "uss_base_url": "https://fims.novautm.net",
}

$ DSSConstraint

A constraint reference entity defines the geographical airspace restriction in spacetime. Refer to the ASTM interUSS Standards for more details on its usage.

  • A DSSConstraint is made up of a ConstraintReference and ConstraintDetails.
  • Note the volumes property is an array which contains a single Volume4D object.
Property Description
constraint_id (required) UUID of the Constraint entity.
constraint (required) Full specification of a UTM Constraint.
subscriptions (required) Subscription(s) from DSS prompting this notification.

Example schema

{
  "constraint_id": {"$UUID"},
  "constraint": {
    "reference": {
      "id": {"$UUID"},
      "owner": "1hlc4etfl7fp8tv11r11rclij3",
      "version": 3,
      "time_start": {"$Time"},
      "time_end": {"$Time"},
      "uss_base_url": "https://fims.novautm.net"
    },
    "details": {
      "volumes": [{"$Volume4D"}],
      "type": "STC"
    }
  },
  "subscriptions": [
    {
      "notification_index": 1,
      "subscription_id": {"$UUID"}
    }
  ]
}

$ CReference

A ConstraintReference (area in which a Constraint is present, along with other high-level information, but no details). The DSS reports only these references, no ConstraintDetails are provided.

Property Description
id (required) UUID of the Constraint entity.
owner (required) Created by the DSS based on creating client's ID.
version (required) Sequential version of the Constraint managed by the DSS.
time_start (required) Start time of Constraint as RFC3339-formatted time/date string.
time_end (required) End time of Constraint as RFC3339-formatted time/date string.
uss_base_url (required) The base URL of a USS implementation of the USS-USS API.

Example schema

{
  "id": {"$UUID"},
  "owner": "1hlc4etfl7fp8tv11r11rclij3",
  "version": 3,
  "time_start": {"$Time"},
  "time_end": {"$Time"},
  "uss_base_url": "https://fims.novautm.net"
}

$ CDetails

Details of a Constraint which are stored within the Nova-CIF. USSs exchange ConstraintDetails and additional information peer-to-peer after initial discovery via the DSS.

Property Description
volumes (required) Volume4D entity which defines the extent of the Constraint entity.
type (optional) Type of constraint (UVR or Geozone), i.e. STC or LTC

Example schema

{
  "volumes": [{"$Volume4D"}],
  "type": "STC"
}

$ CType

Constraint type given as a string. Supported types include short-term constraints or UVRs denoted by STC, and long-term constraints or Geozones denoted by LTC.

  • constraint_type is automatically allocated by the CIF.
Property Description
constraint_type (required) Type of constraint (UVR or Geozone), i.e. STC or LTC

Example schema

{
  "constraint_type": "STC"
}
Show examples in:
Nova-CIF API Documentation