Quickstart

The Skyfora API provides access to GNSS measurement data, reference station metadata, and network information for integration into your applications and workflows.

This guide walks you through creating an API key, discovering available stations, and pulling measurement data.

1. Create an API key

Sign in to the Skyfora Portal and create an API key under your organization settings. The key is scoped to your organization and grants access to the stations and networks you are entitled to.

Include the key in every API request:

X-API-Key: your-api-key-here

2. List your stations

Before querying measurements, find out which stations are available to you. The stations endpoint returns metadata for all stations your organization is entitled to, including the mountpoint identifier you will need for measurement queries.

curl https://api.skyfora.com/api/v1/stations \
  -H "X-API-Key: your-api-key-here"

Response:

{
  "stations": [
    {
      "id": "a1b2c3d4-...",
      "mountpoint": "STATION_A",
      "display_name": "Bergstadt",
      "country_code": "DE",
      "latitude": 50.94,
      "longitude": 6.96
    },
    {
      "id": "e5f6a7b8-...",
      "mountpoint": "STATION_B",
      "display_name": "Seedorf",
      "country_code": "DE",
      "latitude": 52.52,
      "longitude": 13.41
    }
  ],
  "pagination": { "page": 1, "page_size": 20, "total_count": 2 }
}

Use the mountpoint values (e.g. STATION_A) when querying measurements in the next step.

You can filter stations by country, network, bounding box, or search term — see the Stations API reference for details.

3. Query measurements

Use the measurements endpoint to retrieve observation data for your stations. Specify a time range, one or more mountpoints, and the variables you want.

Available variables

Most variables are derived from GNSS observations and updated every 30 seconds on standard receivers, or every 1 second on Skyfora StreamGNSS receivers. PWV is updated every 5 minutes.

Variable Description Unit Update interval (standard) Update interval (Skyfora StreamGNSS)¹
ztd Zenith Total Delay mm 30 s 1 s
ztd_sigma ZTD uncertainty (standard deviation) mm 30 s 1 s
pwv Precipitable Water Vapour mm 5 min 5 min
snr Signal-to-noise ratio (per satellite, per signal band) dB-Hz 30 s 1 s
el Satellite elevation (per satellite) degrees 30 s 1 s
az Satellite azimuth (per satellite) degrees 30 s 1 s
prn Satellite PRN identifiers 30 s 1 s

¹ For stations served by Skyfora StreamGNSS receivers, variables other than pwv are currently produced at 1 s cadence. This rate will be reduced to 30 s in a future release to align with other stations.

How PWV is derived: Precipitable Water Vapour (PWV) is estimated from GNSS zenith total delay (ZTD) using surface pressure, air temperature at 2 m, and relative humidity from the nearest suitable meteorological observation or a numerical weather prediction (NWP) model, depending on availability, with values height-adjusted to the GNSS site. These meteorological inputs are not returned in the API response and are not necessarily measured at the GNSS station itself.

Response formats

The API supports two response formats via content negotiation:

  • NetCDF-4 (default) — binary scientific data format with CF-1.8 conventions. Returned when no Accept header is set, or with Accept: application/x-netcdf.
  • JSON — returned when Accept: application/json is set.

NetCDF-4 is the recommended format for data analysis workflows. It can be read directly by Python xarray, MATLAB, R ncdf4, and other NetCDF-compatible tools.

Download a NetCDF file

curl -X POST https://api.skyfora.com/api/v1/measurements/query \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-api-key-here" \
  -o measurements.nc \
  -d '{
    "start_time": "2026-03-20T00:00:00Z",
    "end_time": "2026-03-21T00:00:00Z",
    "mountpoints": ["STATION_A"],
    "data_vars": ["ztd", "ztd_sigma", "pwv"]
  }'

Fetch measurements as JSON

curl -X POST https://api.skyfora.com/api/v1/measurements/query \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "X-API-Key: your-api-key-here" \
  -d '{
    "start_time": "2026-03-20T00:00:00Z",
    "end_time": "2026-03-20T01:00:00Z",
    "mountpoints": ["STATION_A"],
    "data_vars": ["ztd", "ztd_sigma", "pwv"]
  }'

Response:

{
  "data": [
    {
      "timestamp": "2026-03-20T00:00:00.000Z",
      "receiver_id": "STATION_A",
      "ztd": 2353.5,
      "ztd_sigma": 4.0,
      "pwv": 12.3
    },
    {
      "timestamp": "2026-03-20T00:15:00.000Z",
      "receiver_id": "STATION_A",
      "ztd": 2354.0,
      "ztd_sigma": 4.0,
      "pwv": 12.4
    }
  ],
  "count": 2
}

4. Analyze the data

Read NetCDF with Python

import xarray as xr

ds = xr.open_dataset("measurements.nc")

# Inspect the dataset
print(ds)

# Access ZTD values for a specific station
ztd = ds.sel(station="STATION_A").ztd
print(ztd.values)

# Convert to a pandas DataFrame
df = ds.to_dataframe().reset_index()
print(df.head())

Query multiple stations

curl -X POST https://api.skyfora.com/api/v1/measurements/query \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-api-key-here" \
  -o measurements.nc \
  -d '{
    "start_time": "2026-03-20T00:00:00Z",
    "end_time": "2026-03-21T00:00:00Z",
    "mountpoints": ["STATION_A", "STATION_B"],
    "data_vars": ["ztd", "pwv"]
  }'

Access control

Your API key is scoped to your organization. You can only access stations and measurement data for networks your organization is entitled to. Requests for stations outside your entitlements will return a 403 error.

Limits

The API returns all observations matching your query in a single response. If the resulting file exceeds 150 MB, the request will return a 413 error.

As a rough guide, querying all 7 variables for 50 stations over 30 days produces approximately 60 MB. At 100 stations with the same parameters and time range, you would approach the limit. Numeric-only queries (ztd, ztd_sigma, pwv) are much smaller and can cover more stations and longer time ranges in a single request.

If your query exceeds the limit, split it into multiple requests — for example by time range or by groups of mountpoints — and combine the results on your side.

Insight dashboard

All measurement variables available through the API — ZTD, ZTD uncertainty, PWV, satellite elevation, azimuth, and SNR — are also visualized in the Skyfora Insight dashboard, provided your organization has access to the corresponding parameters.