# Weather: API reference

14 endpoints. Base URL `https://princegeorgepulse.ca/api/v1`. Conventions (envelope, paging, fields, formats, limits) are on the [overview](https://princegeorgepulse.ca/developers/). [All endpoints](https://princegeorgepulse.ca/developers/reference/).

## GET /api/v1/weather {#get-weather}

Full weather payload: now, official ECCC forecast, today, yesterday, model hourly and daily, normals, alerts, almanac.

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)](https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750)
- Licence: CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather"
```

**Example response** (trimmed)

```json
{
  "data": {
    "now": {
      "temp": 11,
      "feelsLike": 11,
      "feelsKind": null,
      "humidity": 51,
      "dewpoint": 1.3,
      "code": 3,
      "isDay": true,
      "condition": "Sunny",
      "icon": "Sun",
      "windKmh": 26,
      "windDir": 190,
      "gustKmh": 48,
      "…": "12 more keys"
    },
    "official": {
      "issued": "2026-10-16T13:03:00Z",
      "hourlyIssued": "2026-10-16T06:03:00Z",
      "periods": [
        {
          "name": "Today",
          "summary": "A mix of sun and cloud. Becoming cloudy this afternoon with 40 percent chance of showers late this afternoon. Wind south 30 km/h gusting to 50. High 15. UV index 2 or low.",
          "short": "Chance of showers",
          "night": false,
          "icon": "CloudRain",
          "high": 15,
          "low": null,
          "pop": 40,
          "uv": 2
        },
        {
          "name": "Tonight",
          "summary": "Cloudy. 40 percent chance of showers this evening. Showers beginning near midnight. Risk of a thunderstorm before morning. Wind south 20 km/h becoming light near midnight. Wind becoming west 40 gusting to 60 before mo…",
          "short": "Chance of showers",
          "night": true,
          "icon": "CloudRain",
          "high": null,
          "low": 6,
          "pop": 40,
          "uv": null
        },
        "… 11 more"
      ],
      "hourly": [
        {
          "t": "2026-10-16T16:00:00Z",
          "temp": 11,
          "condition": "A mix of sun and cloud",
          "pop": 0,
          "windKmh": 30,
          "windDir": "S",
          "gustKmh": 50,
          "uv": 1,
          "isDay": true,
          "icon": "CloudSun"
        },
        {
          "t": "2026-10-16T17:00:00Z",
          "temp": 12,
          "condition": "A mix of sun and cloud",
          "pop": 0,
          "windKmh": 30,
          "windDir": "S",
          "gustKmh": 50,
          "uv": 1,
          "isDay": true,
          "icon": "CloudSun"
        },
        "… 22 more"
      ]
    },
    "today": {
      "observedHigh": 12.9,
      "observedLow": 10.5,
      "observedPrecipMm": 0,
      "mode": "day",
      "forecastHigh": 15,
      "tonightLow": 6,
      "tomorrowHigh": 10,
      "tomorrowName": "Saturday",
      "high": 15,
      "low": 10.5
    },
    "yesterday": {
      "high": 14.2,
      "low": -3,
      "precipMm": 0,
      "precipTrace": false,
      "gustKmh": 32,
      "gustDir": "SSE"
    },
    "hourly": {
      "time": [
        "2026-10-16T08:00:00-07:00",
        "2026-10-16T09:00:00-07:00",
        "… 46 more"
      ],
      "temp": [
        10.8,
        11.4,
        "… 46 more"
      ],
      "feels": [
        5.7,
        6.3,
        "… 46 more"
      ],
      "pop": [
        0,
        2,
        "… 46 more"
      ],
      "precip": [
        0,
        0,
        "… 46 more"
      ],
      "code": [
        3,
        3,
        "… 46 more"
      ],
      "wind": [
        21.2,
        21.3,
        "… 46 more"
      ],
      "gust": [
        43.2,
        44.6,
        "… 46 more"
      ],
      "dir": [
        185,
        184,
        "… 46 more"
      ],
      "uv": [
        0,
        0.3,
        "… 46 more"
      ],
      "isDay": [
        1,
        1,
        "… 46 more"
      ]
    },
    "daily": [
      {
        "date": "2026-10-16",
        "code": 80,
        "max": 15,
        "min": 10.5,
        "precip": 2.7,
        "pop": 59,
        "snow": 0,
        "wind": 21.3,
        "gust": 45.7,
        "dir": 188,
        "uv": 2.7,
        "sunshineH": 8.9,
        "…": "3 more keys"
      },
      {
        "date": "2026-10-17",
        "code": 81,
        "max": 11.5,
        "min": 4.1,
        "precip": 5.2,
        "pop": 94,
        "snow": 0,
        "wind": 33.5,
        "gust": 68.8,
        "dir": 226,
        "uv": 2.2,
        "sunshineH": 8.5,
        "…": "3 more keys"
      },
      "… 14 more"
    ],
    "textForecast": [
      {
        "name": "Today",
        "summary": "A mix of sun and cloud. Becoming cloudy this afternoon with 40 percent chance of showers late this afternoon. Wind south 30 km/h gusting to 50. High 15. UV index 2 or low."
      },
      {
        "name": "Tonight",
        "summary": "Cloudy. 40 percent chance of showers this evening. Showers beginning near midnight. Risk of a thunderstorm before morning. Wind south 20 km/h becoming light near midnight. Wind becoming west 40 gusting to 60 before mo…"
      },
      "… 11 more"
    ],
    "normals": {
      "high": 8,
      "low": -1
    },
    "alerts": [
      {
        "title": "Special weather",
        "type": "statement",
        "text": "Fall Storm Bringing Mixed Weather Conditions this Saturday.\n\nWhat:\n- Sudden gusty winds of 60 to 80 km/h.\n- Snow levels lowering to 1500 metres over southern B.C.\n- Snow levels lowering to 1200 metres over central B.C…",
        "issued": "2026-10-16T13:55:03.579Z",
        "expires": "2026-10-18T03:00:00.000Z"
      }
    ],
    "sun": {
      "sunrise": "2026-10-16T14:41:00Z",
      "sunset": "2026-10-17T01:12:00Z"
    },
    "almanac": {
      "date": "2026-10-16",
      "records": {
        "high": 23.9,
        "highYear": 1929,
        "low": -13.1,
        "lowYear": 1992,
        "coldestHigh": -3.9,
        "coldestHighYear": 1930,
        "warmestLow": 13.3,
        "warmestLowYear": 1929,
        "precipMm": 17.5,
        "precipYear": 2020,
        "snowCm": 6.8,
        "snowYear": 1991,
        "…": "3 more keys"
      },
      "month": {
        "index": 9,
        "period": "1991–2020",
        "station": "Prince George Airport",
        "source": "Environment and Climate Change Canada, Canadian Climate Normals 1991–2020, Prince George (climate ID 1096439)",
        "sourceUrl": "https://climate.weather.gc.ca/climate_normals/results_1991_2020_e.html?searchType=stnName&txtStationName=prince+george&searchMethod=contains&txtCentralLatMin=0&txtCentralLatSec=0&txtCentralLongMin=0&txtCentralLongSec=…",
        "values": {
          "meanMax": 9.2,
          "meanMin": -0.6,
          "meanTemp": 4.4,
          "precipMm": 66.4,
          "rainMm": 58.7,
          "snowCm": 9.8,
          "precipDays": 16.3,
          "daysPrecip1mm": 12.2,
          "rainDays": 15.1,
          "snowDays": 2.2,
          "snowDepthCm": 0,
          "rhMorning": 87.2,
          "…": "15 more keys"
        },
        "extremes": {
          "maxTemp": "{…}",
          "minTemp": "{…}",
          "humidex": "{…}",
          "windChill": "{…}",
          "gustKmh": "{…}",
          "snowDepthCm": "{…}",
          "precipMm": "{…}"
        }
      },
      "frost": {
        "lastSpringFrost": "May 22",
        "firstFallFrost": "Sep 7",
        "frostFreeDays": 107
      }
    }
  },
  "meta": {
    "source": "Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)",
    "sourceUrl": "https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750",
    "updatedAt": "2026-10-16T15:40:20.687Z",
    "ageSec": 536,
    "license": "CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Open-Meteo.com and Environment and Climate Change Canada, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather"
  }
}
```

## GET /api/v1/weather/now {#get-weather-now}

Current conditions (official observation), today so far and yesterday.

`feelsLike` is the wind chill (at or below 0 °C with wind of at least 5 km/h) or the humidex (20 °C or warmer, humidex 25 or more), named in `feelsKind`; otherwise it equals `temp` and `feelsKind` is null. `gustKmh` is an observed gust only (`gustSource` ECCC or METAR); `modelGustKmh` is the model forecast for the hour. `visibilityKm`, `fog` and `presentWeather` come from the city page and the airport METAR.

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)](https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750)
- Licence: CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/now"
```

**Example response** (trimmed)

```json
{
  "data": {
    "temp": 11,
    "feelsLike": 11,
    "feelsKind": null,
    "humidity": 51,
    "dewpoint": 1.3,
    "code": 3,
    "isDay": true,
    "condition": "Sunny",
    "icon": "Sun",
    "windKmh": 26,
    "windDir": 190,
    "gustKmh": 48,
    "…": "16 more keys"
  },
  "meta": {
    "source": "Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)",
    "sourceUrl": "https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750",
    "updatedAt": "2026-10-16T15:40:20.687Z",
    "ageSec": 536,
    "license": "CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Open-Meteo.com and Environment and Climate Change Canada, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather/now",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-now"
  }
}
```

## GET /api/v1/weather/official {#get-weather-official}

Environment Canada forecast: text periods (today, tonight, ...) with high/low, POP and UV, and the official 24-hour hourly forecast.

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada, city page weather bc-79](https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750)
- Licence: Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/official"
```

**Example response** (trimmed)

```json
{
  "data": {
    "issued": "2026-10-16T13:03:00Z",
    "hourlyIssued": "2026-10-16T06:03:00Z",
    "periods": [
      {
        "name": "Today",
        "summary": "A mix of sun and cloud. Becoming cloudy this afternoon with 40 percent chance of showers late this afternoon. Wind south 30 km/h gusting to 50. High 15. UV index 2 or low.",
        "short": "Chance of showers",
        "night": false,
        "icon": "CloudRain",
        "high": 15,
        "low": null,
        "pop": 40,
        "uv": 2
      },
      {
        "name": "Tonight",
        "summary": "Cloudy. 40 percent chance of showers this evening. Showers beginning near midnight. Risk of a thunderstorm before morning. Wind south 20 km/h becoming light near midnight. Wind becoming west 40 gusting to 60 before mo…",
        "short": "Chance of showers",
        "night": true,
        "icon": "CloudRain",
        "high": null,
        "low": 6,
        "pop": 40,
        "uv": null
      },
      "… 11 more"
    ],
    "hourly": [
      {
        "t": "2026-10-16T16:00:00Z",
        "temp": 11,
        "condition": "A mix of sun and cloud",
        "pop": 0,
        "windKmh": 30,
        "windDir": "S",
        "gustKmh": 50,
        "uv": 1,
        "isDay": true,
        "icon": "CloudSun"
      },
      {
        "t": "2026-10-16T17:00:00Z",
        "temp": 12,
        "condition": "A mix of sun and cloud",
        "pop": 0,
        "windKmh": 30,
        "windDir": "S",
        "gustKmh": 50,
        "uv": 1,
        "isDay": true,
        "icon": "CloudSun"
      },
      "… 22 more"
    ]
  },
  "meta": {
    "source": "Environment and Climate Change Canada, city page weather bc-79",
    "sourceUrl": "https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750",
    "updatedAt": "2026-10-16T15:40:20.687Z",
    "ageSec": 536,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Environment and Climate Change Canada, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather/official",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-official"
  }
}
```

## GET /api/v1/weather/observations {#get-weather-observations}

Past 24 hours observed at the airport, hour by hour: temperature, dew point, humidity, wind, precipitation, snow depth, pressure, visibility, fog.

Hourly SWOB observations from the airport auto station, with the lowest METAR visibility, present weather and highest gust in each hour. `today` is the observed high, low and precipitation since local midnight.

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada (SWOB realtime observations, stations 1096453 and 1096454); NOAA Aviation Weather Center (METAR CYXS)](https://api.weather.gc.ca/collections/swob-realtime)
- Licence: Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/); Public domain (US Government work, NOAA Aviation Weather Center)
- Paginated: `limit` (default 25, max 30) and `offset`; also `format=csv`

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `limit` | query | integer | Items per page (default 50, max 500 unless noted). Example: `20`. |
| `offset` | query | integer | Items to skip. Use `links.next` to page. Example: `0`. |

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`, `csv`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/observations"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "t": "2026-10-16T15:00:00.000Z",
      "temp": 11,
      "tempMax": 11.3,
      "tempMin": 10.7,
      "dewpoint": 1.4,
      "humidity": 51,
      "windKmh": 24,
      "windMaxKmh": 38.7,
      "windDir": 182,
      "precipMm": 0,
      "snowDepthCm": 0,
      "pressureKpa": 101.7,
      "…": "4 more keys"
    },
    {
      "t": "2026-10-16T14:00:00.000Z",
      "temp": 10.9,
      "tempMax": 11.3,
      "tempMin": 10.5,
      "dewpoint": 1.4,
      "humidity": 52,
      "windKmh": 24.5,
      "windMaxKmh": 37.1,
      "windDir": 174,
      "precipMm": 0,
      "snowDepthCm": 0,
      "pressureKpa": 101.8,
      "…": "4 more keys"
    },
    "… 23 more"
  ],
  "meta": {
    "source": "Environment and Climate Change Canada (SWOB realtime observations, stations 1096453 and 1096454); NOAA Aviation Weather Center (METAR CYXS)",
    "sourceUrl": "https://api.weather.gc.ca/collections/swob-realtime",
    "updatedAt": "2026-10-16T15:47:21.168Z",
    "ageSec": 116,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/); Public domain (US Government work, NOAA Aviation Weather Center)",
    "attribution": "Environment and Climate Change Canada and NOAA Aviation Weather Center, via PG Pulse (princegeorgepulse.ca)",
    "total": 25,
    "count": 25,
    "limit": 25,
    "offset": 0
  },
  "links": {
    "self": "/api/v1/weather/observations",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-observations"
  }
}
```

## GET /api/v1/weather/observations/summary {#get-weather-observations-summary}

Observed today so far, pressure trend, snow depth, latest METAR and hours of fog in the past 24 hours.

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada (SWOB realtime observations, stations 1096453 and 1096454); NOAA Aviation Weather Center (METAR CYXS)](https://api.weather.gc.ca/collections/swob-realtime)
- Licence: Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/); Public domain (US Government work, NOAA Aviation Weather Center)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/observations/summary"
```

**Example response** (trimmed)

```json
{
  "data": {
    "airport": {
      "name": "Prince George Airport (auto)",
      "id": "1096453",
      "elevationM": 680
    },
    "today": {
      "high": 12.9,
      "highAt": "2026-10-16T09:00:00.000Z",
      "low": 10.5,
      "lowAt": "2026-10-16T14:00:00.000Z",
      "precipMm": 0,
      "hours": 8
    },
    "pressureTrend": {
      "trend": "falling",
      "changeKpa": -0.1,
      "t": "2026-10-16T15:00:00.000Z"
    },
    "snowDepthCm": 0,
    "metar": {
      "t": "2026-10-16T15:00:00.000Z",
      "visibilityKm": 14.5,
      "weather": null,
      "gustKmh": 48,
      "raw": "METAR CYXS 161500Z AUTO 19014G26KT 9SM CLR 11/01 A3000 RMK SLP175"
    },
    "fogHours24": 1
  },
  "meta": {
    "source": "Environment and Climate Change Canada (SWOB realtime observations, stations 1096453 and 1096454); NOAA Aviation Weather Center (METAR CYXS)",
    "sourceUrl": "https://api.weather.gc.ca/collections/swob-realtime",
    "updatedAt": "2026-10-16T15:47:21.168Z",
    "ageSec": 116,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/); Public domain (US Government work, NOAA Aviation Weather Center)",
    "attribution": "Environment and Climate Change Canada and NOAA Aviation Weather Center, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather/observations/summary",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-observations-summary"
  }
}
```

## GET /api/v1/weather/inversion {#get-weather-inversion}

Inversion watch: the airport (plateau) vs a valley station, now and for the past 24 hours.

`diff` is valley minus airport in °C. In well-mixed air the lower valley station is slightly warmer; when it is colder, cold air is pooling in the valley (a temperature inversion), which traps smoke and pollution. `state`: strong (≤ −3), inversion (≤ −1), weak (below 0), mixed.

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada (SWOB realtime observations, stations 1096453 and 1096454); NOAA Aviation Weather Center (METAR CYXS)](https://api.weather.gc.ca/collections/swob-realtime)
- Licence: Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/); Public domain (US Government work, NOAA Aviation Weather Center)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/inversion"
```

**Example response** (trimmed)

```json
{
  "data": {
    "airport": {
      "name": "Prince George Airport (auto)",
      "id": "1096453",
      "elevationM": 680,
      "t": "2026-10-16T15:46:00.000Z",
      "temp": 11.3,
      "humidity": 50,
      "windKmh": 25.4,
      "snowDepthCm": 0
    },
    "valley": {
      "name": "Massey (downtown, in the Bowl)",
      "id": "1096454",
      "elevationM": 602,
      "t": "2026-10-16T15:46:00.000Z",
      "temp": 13.6,
      "humidity": 42,
      "windKmh": 19.4,
      "snowDepthCm": null
    },
    "diff": 2.3,
    "state": "mixed",
    "hours": [
      {
        "t": "2026-10-15T15:00:00.000Z",
        "airport": -0.4,
        "valley": 2,
        "diff": 2.4
      },
      {
        "t": "2026-10-15T16:00:00.000Z",
        "airport": -0.2,
        "valley": 2.5,
        "diff": 2.7
      },
      "… 23 more"
    ]
  },
  "meta": {
    "source": "Environment and Climate Change Canada (SWOB realtime observations, stations 1096453 and 1096454); NOAA Aviation Weather Center (METAR CYXS)",
    "sourceUrl": "https://api.weather.gc.ca/collections/swob-realtime",
    "updatedAt": "2026-10-16T15:47:21.168Z",
    "ageSec": 116,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/); Public domain (US Government work, NOAA Aviation Weather Center)",
    "attribution": "Environment and Climate Change Canada and NOAA Aviation Weather Center, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather/inversion",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-inversion"
  }
}
```

## GET /api/v1/weather/radar {#get-weather-radar}

Radar and lightning frame times (last 3 hours) for the ECCC GeoMet WMS layers, with the map bounding box.

Request a frame with a WMS GetMap call to `wms` (version 1.3.0, CRS EPSG:4326, bbox lat/lng order) with `layers` set to a layer id and `time` to one of its times. Tiles are served by ECCC; this endpoint only lists what is available.

- Cache: 5 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada, MSC GeoMet (1 km radar composite and lightning density)](https://eccc-msc.github.io/open-data/msc-geomet/readme_en/)
- Licence: Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/radar"
```

**Example response** (trimmed)

```json
{
  "data": {
    "wms": "https://geo.weather.gc.ca/geomet",
    "bbox": [
      51.7171,
      -126.3497,
      "… 2 more"
    ],
    "layers": [
      {
        "id": "RADAR_1KM_RRAI",
        "label": "Rain",
        "times": [
          "2026-10-16T12:42:00Z",
          "2026-10-16T12:48:00Z",
          "… 29 more"
        ]
      },
      {
        "id": "RADAR_1KM_RSNO",
        "label": "Snow",
        "times": [
          "2026-10-16T12:42:00Z",
          "2026-10-16T12:48:00Z",
          "… 29 more"
        ]
      }
    ],
    "lightning": {
      "id": "Lightning_2.5km_Density",
      "times": [
        "2026-10-16T12:30:00Z",
        "2026-10-16T12:40:00Z",
        "… 17 more"
      ]
    }
  },
  "meta": {
    "source": "Environment and Climate Change Canada, MSC GeoMet (1 km radar composite and lightning density)",
    "sourceUrl": "https://eccc-msc.github.io/open-data/msc-geomet/readme_en/",
    "updatedAt": "2026-10-16T15:49:17.609Z",
    "ageSec": 0,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Environment and Climate Change Canada (MSC GeoMet), via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather/radar",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-radar"
  }
}
```

## GET /api/v1/weather/almanac {#get-weather-almanac}

Today in Prince George weather history: records for the date and this month's 1991–2020 normals and extremes.

- Cache: 1 h (live source, cached on our server)
- Source: [Environment and Climate Change Canada, daily climate records (LTCE) and Canadian Climate Normals 1991–2020](https://climate.weather.gc.ca/)
- Licence: Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/almanac"
```

**Example response** (trimmed)

```json
{
  "data": {
    "date": "2026-10-16",
    "records": {
      "high": 23.9,
      "highYear": 1929,
      "low": -13.1,
      "lowYear": 1992,
      "coldestHigh": -3.9,
      "coldestHighYear": 1930,
      "warmestLow": 13.3,
      "warmestLowYear": 1929,
      "precipMm": 17.5,
      "precipYear": 2020,
      "snowCm": 6.8,
      "snowYear": 1991,
      "…": "3 more keys"
    },
    "month": {
      "index": 9,
      "period": "1991–2020",
      "station": "Prince George Airport",
      "source": "Environment and Climate Change Canada, Canadian Climate Normals 1991–2020, Prince George (climate ID 1096439)",
      "sourceUrl": "https://climate.weather.gc.ca/climate_normals/results_1991_2020_e.html?searchType=stnName&txtStationName=prince+george&searchMethod=contains&txtCentralLatMin=0&txtCentralLatSec=0&txtCentralLongMin=0&txtCentralLongSec=…",
      "values": {
        "meanMax": 9.2,
        "meanMin": -0.6,
        "meanTemp": 4.4,
        "precipMm": 66.4,
        "rainMm": 58.7,
        "snowCm": 9.8,
        "precipDays": 16.3,
        "daysPrecip1mm": 12.2,
        "rainDays": 15.1,
        "snowDays": 2.2,
        "snowDepthCm": 0,
        "rhMorning": 87.2,
        "…": "15 more keys"
      },
      "extremes": {
        "maxTemp": {
          "value": 25.2,
          "date": "1987-10-01"
        },
        "minTemp": {
          "value": -26.5,
          "date": "1984-10-31"
        },
        "humidex": {
          "value": 25.1,
          "date": "1987-10-01"
        },
        "windChill": {
          "value": -31.8,
          "date": "1984-10-31"
        },
        "gustKmh": {
          "value": 129,
          "date": "1961-10-31",
          "dir": "W"
        },
        "snowDepthCm": {
          "value": 26,
          "date": "2012-10-30"
        },
        "precipMm": {
          "value": 38.9,
          "date": "1962-10-03"
        }
      }
    },
    "frost": {
      "lastSpringFrost": "May 22",
      "firstFallFrost": "Sep 7",
      "frostFreeDays": 107
    },
    "normalToday": {
      "high": 8,
      "low": -1
    },
    "sun": {
      "sunrise": "2026-10-16T14:41:00Z",
      "sunset": "2026-10-17T01:12:00Z"
    }
  },
  "meta": {
    "source": "Environment and Climate Change Canada, daily climate records (LTCE) and Canadian Climate Normals 1991–2020",
    "sourceUrl": "https://climate.weather.gc.ca/",
    "updatedAt": "2026-10-16T15:40:20.687Z",
    "ageSec": 537,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Environment and Climate Change Canada, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather/almanac",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-almanac"
  }
}
```

## GET /api/v1/weather/hourly {#get-weather-hourly}

Hourly forecast (one row per hour: temp, feels, pop, precip, code, wind, gust, dir, uv, isDay).

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)](https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750)
- Licence: CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)
- Paginated: `limit` (default 48, max 400) and `offset`; also `format=csv`

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `limit` | query | integer | Items per page (default 50, max 500 unless noted). Example: `20`. |
| `offset` | query | integer | Items to skip. Use `links.next` to page. Example: `0`. |

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`, `csv`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/hourly?limit=3"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "time": "2026-10-16T08:00:00-07:00",
      "temp": 10.8,
      "feels": 5.7,
      "pop": 0,
      "precip": 0,
      "code": 3,
      "wind": 21.2,
      "gust": 43.2,
      "dir": 185,
      "uv": 0,
      "isDay": 1
    },
    {
      "time": "2026-10-16T09:00:00-07:00",
      "temp": 11.4,
      "feels": 6.3,
      "pop": 2,
      "precip": 0,
      "code": 3,
      "wind": 21.3,
      "gust": 44.6,
      "dir": 184,
      "uv": 0.3,
      "isDay": 1
    },
    "… 1 more"
  ],
  "meta": {
    "source": "Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)",
    "sourceUrl": "https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750",
    "updatedAt": "2026-10-16T15:40:20.687Z",
    "ageSec": 537,
    "license": "CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Open-Meteo.com and Environment and Climate Change Canada, via PG Pulse (princegeorgepulse.ca)",
    "total": 48,
    "count": 3,
    "limit": 3,
    "offset": 0
  },
  "links": {
    "self": "/api/v1/weather/hourly?limit=3",
    "next": "/api/v1/weather/hourly?limit=3&offset=3",
    "docs": "/developers/reference/weather/#get-weather-hourly"
  }
}
```

## GET /api/v1/weather/daily {#get-weather-daily}

Daily forecast (up to 14 days) plus the ECCC text forecast.

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)](https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750)
- Licence: CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/daily"
```

**Example response** (trimmed)

```json
{
  "data": {
    "days": [
      {
        "date": "2026-10-16",
        "code": 80,
        "max": 15,
        "min": 10.5,
        "precip": 2.7,
        "pop": 59,
        "snow": 0,
        "wind": 21.3,
        "gust": 45.7,
        "dir": 188,
        "uv": 2.7,
        "sunshineH": 8.9,
        "…": "3 more keys"
      },
      {
        "date": "2026-10-17",
        "code": 81,
        "max": 11.5,
        "min": 4.1,
        "precip": 5.2,
        "pop": 94,
        "snow": 0,
        "wind": 33.5,
        "gust": 68.8,
        "dir": 226,
        "uv": 2.2,
        "sunshineH": 8.5,
        "…": "3 more keys"
      },
      "… 14 more"
    ],
    "textForecast": [
      {
        "name": "Today",
        "summary": "A mix of sun and cloud. Becoming cloudy this afternoon with 40 percent chance of showers late this afternoon. Wind south 30 km/h gusting to 50. High 15. UV index 2 or low."
      },
      {
        "name": "Tonight",
        "summary": "Cloudy. 40 percent chance of showers this evening. Showers beginning near midnight. Risk of a thunderstorm before morning. Wind south 20 km/h becoming light near midnight. Wind becoming west 40 gusting to 60 before mo…"
      },
      "… 11 more"
    ]
  },
  "meta": {
    "source": "Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)",
    "sourceUrl": "https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750",
    "updatedAt": "2026-10-16T15:40:20.687Z",
    "ageSec": 537,
    "license": "CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Open-Meteo.com and Environment and Climate Change Canada, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather/daily",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-daily"
  }
}
```

## GET /api/v1/weather/alerts {#get-weather-alerts}

Active ECCC weather alerts for Prince George.

- Cache: 10 min (live source, cached on our server)
- Source: [Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)](https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750)
- Licence: CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/alerts"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "title": "Special weather",
      "type": "statement",
      "text": "Fall Storm Bringing Mixed Weather Conditions this Saturday.\n\nWhat:\n- Sudden gusty winds of 60 to 80 km/h.\n- Snow levels lowering to 1500 metres over southern B.C.\n- Snow levels lowering to 1200 metres over central B.C…",
      "issued": "2026-10-16T13:55:03.579Z",
      "expires": "2026-10-18T03:00:00.000Z"
    }
  ],
  "meta": {
    "source": "Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)",
    "sourceUrl": "https://weather.gc.ca/en/location/index.html?coords=53.917,-122.750",
    "updatedAt": "2026-10-16T15:40:20.687Z",
    "ageSec": 537,
    "license": "CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Open-Meteo.com and Environment and Climate Change Canada, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/weather/alerts",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-alerts"
  }
}
```

## GET /api/v1/airport {#get-airport}

Prince George airport (CYXS) flying conditions: latest METAR, recent observations and the TAF.

- Cache: 10 min (live source, cached on our server)
- Source: [NOAA Aviation Weather Center (METAR and TAF for CYXS)](https://aviationweather.gov/data/metar/?ids=CYXS)
- Licence: Public domain (US Government work, NOAA Aviation Weather Center)

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/airport"
```

**Example response** (trimmed)

```json
{
  "data": {
    "metar": {
      "time": "2026-10-16T15:00:00.000Z",
      "raw": "METAR CYXS 161500Z AUTO 19014G26KT 9SM CLR 11/01 A3000 RMK SLP175",
      "category": "VFR",
      "tempC": 11,
      "windDir": 190,
      "windKt": 14,
      "gustKt": 26,
      "visSm": 9,
      "ceilingFt": null,
      "clouds": "clear"
    },
    "history": [
      {
        "time": "2026-10-16T15:00:00.000Z",
        "category": "VFR",
        "raw": "METAR CYXS 161500Z AUTO 19014G26KT 9SM CLR 11/01 A3000 RMK SLP175",
        "tempC": 11,
        "windKt": 14,
        "gustKt": 26,
        "visSm": 9,
        "ceilingFt": null
      },
      {
        "time": "2026-10-16T14:00:00.000Z",
        "category": "VFR",
        "raw": "METAR CYXS 161400Z AUTO 19014G24KT 9SM CLR 11/01 A3000 RMK SLP177",
        "tempC": 11,
        "windKt": 14,
        "gustKt": 24,
        "visSm": 9,
        "ceilingFt": null
      },
      "… 4 more"
    ],
    "taf": {
      "issued": "2026-10-16T12:40:00.000Z",
      "raw": "TAF CYXS 161240Z 1613/1701 18012G22KT P6SM SCT220 FM162000 18015G25KT P6SM SCT120 RMK FCST BASED ON AUTO OBS. NXT FCST BY 161900Z"
    }
  },
  "meta": {
    "source": "NOAA Aviation Weather Center (METAR and TAF for CYXS)",
    "sourceUrl": "https://aviationweather.gov/data/metar/?ids=CYXS",
    "updatedAt": "2026-10-16T15:47:23.115Z",
    "ageSec": 115,
    "license": "Public domain (US Government work, NOAA Aviation Weather Center)",
    "attribution": "NOAA Aviation Weather Center, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/airport",
    "next": null,
    "docs": "/developers/reference/weather/#get-airport"
  }
}
```

## GET /api/v1/weather/history {#get-weather-history}

Recorded weather observations: temperature, feels like, humidity, dew point, wind, gusts, pressure, precipitation, visibility, snow depth, valley temperature and the inversion.

- Cache: 5 min
- Source: [PG Pulse live history: readings recorded from Open-Meteo, ECCC, Water Survey of Canada, BC Hydro, BC Wildfire Service, DriveBC, NOAA SWPC and NOAA AWC on every refresh](https://princegeorgepulse.ca/dashboard/)
- Licence: Mixed: see each item’s source

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `series` | query | string | Only some of: weather.temp, weather.feels_like, weather.humidity, weather.wind, weather.gust, weather.pressure, weather.precip, weather.dewpoint, weather.visibility, weather.snow_depth, weather.valley_temp, weather.inversion. |
| `from` | query | string | Start: ISO date/datetime, or a span back from `to` such as 48h, 7d or 30d (default 7d). Example: `7d`. |
| `to` | query | string | End: ISO date/datetime (default now). |
| `interval` | query | string | `raw` (every recorded reading; kept 90 days), `hour` or `day` (hourly rollups, kept indefinitely), or `auto` (raw up to 3 days, hourly up to 120 days, then daily). One of: `auto`, `raw`, `hour`, `day`. |

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/weather/history?from=48h"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "series": "weather.temp",
      "label": "Temperature",
      "unit": "°C",
      "interval": "raw",
      "truncated": false,
      "points": [
        {
          "t": "2026-10-14T16:00:00.000Z",
          "value": 8.3
        },
        {
          "t": "2026-10-14T17:00:00.000Z",
          "value": 9.6
        },
        "… 69 more"
      ]
    },
    {
      "series": "weather.feels_like",
      "label": "Feels like",
      "unit": "°C",
      "interval": "raw",
      "truncated": false,
      "points": [
        {
          "t": "2026-10-14T16:00:00.000Z",
          "value": 8.3
        },
        {
          "t": "2026-10-14T17:00:00.000Z",
          "value": 9.6
        },
        "… 69 more"
      ]
    },
    "… 10 more"
  ],
  "meta": {
    "source": "PG Pulse live history: readings recorded from Open-Meteo, ECCC, Water Survey of Canada, BC Hydro, BC Wildfire Service, DriveBC, NOAA SWPC and NOAA AWC on every refresh",
    "sourceUrl": "https://princegeorgepulse.ca/dashboard/",
    "updatedAt": "2026-10-16T15:00:00.000Z",
    "ageSec": 2958,
    "license": "Mixed: see each item’s source",
    "attribution": "The upstream named in each series (`meta.series.source`), via PG Pulse (princegeorgepulse.ca)",
    "from": "2026-10-14T15:49:17.000Z",
    "to": "2026-10-16T15:49:17.000Z",
    "interval": "raw",
    "series": [
      {
        "id": "weather.temp",
        "source": "Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)"
      },
      {
        "id": "weather.feels_like",
        "source": "Environment and Climate Change Canada (city page weather bc-79, weather alerts, SWOB observations); NOAA Aviation Weather Center (METAR); Open-Meteo forecast API (model detail)"
      },
      "… 10 more"
    ]
  },
  "links": {
    "self": "/api/v1/weather/history?from=48h",
    "next": null,
    "docs": "/developers/reference/weather/#get-weather-history"
  }
}
```

## GET /api/v1/airport/history {#get-airport-history}

Recorded CYXS METAR values: temperature, wind, gusts, visibility, ceiling, flight category.

- Cache: 5 min
- Source: [PG Pulse live history: readings recorded from Open-Meteo, ECCC, Water Survey of Canada, BC Hydro, BC Wildfire Service, DriveBC, NOAA SWPC and NOAA AWC on every refresh](https://princegeorgepulse.ca/dashboard/)
- Licence: Mixed: see each item’s source

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `series` | query | string | Only some of: airport.temp, airport.wind, airport.gust, airport.visibility, airport.ceiling, airport.category. |
| `from` | query | string | Start: ISO date/datetime, or a span back from `to` such as 48h, 7d or 30d (default 7d). Example: `7d`. |
| `to` | query | string | End: ISO date/datetime (default now). |
| `interval` | query | string | `raw` (every recorded reading; kept 90 days), `hour` or `day` (hourly rollups, kept indefinitely), or `auto` (raw up to 3 days, hourly up to 120 days, then daily). One of: `auto`, `raw`, `hour`, `day`. |

Also accepts `fields` (sparse fieldset) and `format` (`json`, `md`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/airport/history?from=48h"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "series": "airport.temp",
      "label": "Airport temperature (METAR)",
      "unit": "°C",
      "interval": "raw",
      "truncated": false,
      "points": [
        {
          "t": "2026-10-14T16:00:00.000Z",
          "value": 8
        },
        {
          "t": "2026-10-14T17:00:00.000Z",
          "value": 10
        },
        "… 87 more"
      ]
    },
    {
      "series": "airport.wind",
      "label": "Airport wind (METAR)",
      "unit": "kt",
      "interval": "raw",
      "truncated": false,
      "points": [
        {
          "t": "2026-10-14T16:00:00.000Z",
          "value": 3
        },
        {
          "t": "2026-10-14T17:00:00.000Z",
          "value": 8
        },
        "… 87 more"
      ]
    },
    "… 4 more"
  ],
  "meta": {
    "source": "NOAA Aviation Weather Center (METAR and TAF for CYXS)",
    "sourceUrl": "https://aviationweather.gov/data/metar/?ids=CYXS",
    "updatedAt": "2026-10-16T15:00:00.000Z",
    "ageSec": 2958,
    "license": "Public domain (US Government work, NOAA Aviation Weather Center)",
    "attribution": "The upstream named in each series (`meta.series.source`), via PG Pulse (princegeorgepulse.ca)",
    "from": "2026-10-14T15:49:17.000Z",
    "to": "2026-10-16T15:49:17.000Z",
    "interval": "raw",
    "series": [
      {
        "id": "airport.temp",
        "source": "NOAA Aviation Weather Center (METAR and TAF for CYXS)"
      },
      {
        "id": "airport.wind",
        "source": "NOAA Aviation Weather Center (METAR and TAF for CYXS)"
      },
      "… 4 more"
    ]
  },
  "links": {
    "self": "/api/v1/airport/history?from=48h",
    "next": null,
    "docs": "/developers/reference/weather/#get-airport-history"
  }
}
```
