Skip to content
PG Pulse
PG Pulse

Try searching for

Local knowledge for your AI tools

Connect Cursor, VS Code, Codex or Claude Code. Free MCP access, no key needed.

Connect your AI assistant
View as MarkdownFree, no key needed

Air & water: API reference

8 endpoints. Base URL https://princegeorgepulse.ca/api/v1. Conventions (envelope, paging, fields, formats, limits) are on the overview. All endpoints.

GET /api/v1/air #

Air quality: AQHI now/history/forecast, PM2.5 model, monitoring stations.

Station readings in µg/m³ (ppb for gases). stations[].pm25Avg24h is the 24-hour PM2.5 average; pm25_24 is the same value under its original name, kept for existing clients.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/air"

Example response (trimmed)

json
{
  "data": {
    "aqhi": {
      "value": 1.3,
      "observedAt": "2026-10-16T10:00:00Z",
      "history": [
        {
          "t": "2026-10-14T11:00:00Z",
          "v": 1
        },
        {
          "t": "2026-10-14T12:00:00Z",
          "v": 1.03
        },
        "… 46 more"
      ],
      "forecast": [
        {
          "t": "2026-10-16T10:00:00Z",
          "v": 2
        },
        {
          "t": "2026-10-16T11:00:00Z",
          "v": 2
        },
        "… 25 more"
      ]
    },
    "model": {
      "usAqi": 30,
      "pm25": 6.4,
      "pm10": 6.7,
      "o3": 69,
      "no2": 2.1,
      "time": "2026-10-16T03:00:00-07:00"
    },
    "pm25": {
      "time": [
        "2026-09-15T00:00:00-07:00",
        "2026-09-15T01:00:00-07:00",
        "… 838 more"
      ],
      "value": [
        12.2,
        11.2,
        "… 838 more"
      ],
      "forecastFrom": "2026-10-16T03:00:00-07:00"
    },
    "daily": [
      {
        "date": "2026-09-15",
        "pm25": 6.3,
        "maxAqi": 51
      },
      {
        "date": "2026-09-16",
        "pm25": 1.8,
        "maxAqi": 38
      },
      "… 33 more"
    ],
    "stations": [
      {
        "name": "Exploration Place",
        "lat": 53.905139,
        "lng": -122.734049,
        "pm25": null,
        "pm25_24": null,
        "pm10": null,
        "o3": null,
        "no2": null,
        "so2": null,
        "trs": 0.2,
        "windKmh": 26.3,
        "updated": "2026-10-16T10:00:00.000Z",
        "…": "2 more keys"
      },
      {
        "name": "Glenview School",
        "lat": 53.996,
        "lng": -122.776,
        "pm25": null,
        "pm25_24": null,
        "pm10": null,
        "o3": null,
        "no2": null,
        "so2": null,
        "trs": null,
        "windKmh": 22.8,
        "updated": "2026-10-16T10:00:00.000Z",
        "…": "2 more keys"
      },
      "… 4 more"
    ]
  },
  "meta": {
    "source": "Environment and Climate Change Canada AQHI (Prince George); Open-Meteo air quality model; BC Ministry of Environment air monitoring stations",
    "sourceUrl": "https://weather.gc.ca/airquality/pages/bcaq-009_e.html",
    "updatedAt": "2026-10-16T10:37:26.347Z",
    "ageSec": 655,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/); CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Open Government Licence – Br…",
    "attribution": "Environment and Climate Change Canada, Open-Meteo.com and BC Ministry of Environment, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/air",
    "next": null,
    "docs": "/developers/reference/air-and-water/#get-air"
  }
}

GET /api/v1/rivers #

Fraser and Nechako river gauges: latest level/flow, 24h change, hourly series.

ParameterInTypeDescription
hourlyquerybooleanInclude the hourly series (default true).

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/rivers"

Example response (trimmed)

json
{
  "data": [
    {
      "id": "08KE018",
      "name": "Fraser River at South Fort George",
      "short": "Fraser (in town)",
      "river": "Fraser",
      "lat": 53.90078,
      "lng": -122.73494,
      "primary": "level",
      "latest": {
        "t": "2026-10-07T21:30:00Z",
        "level": 4.297,
        "discharge": null
      },
      "change24h": {
        "level": 0.169,
        "discharge": null
      },
      "direction": {
        "level": "rising",
        "discharge": null
      },
      "hourly": [
        {
          "t": "2026-09-17T00:00:00Z",
          "level": 4.275,
          "discharge": null
        },
        {
          "t": "2026-09-17T01:00:00Z",
          "level": 4.271,
          "discharge": null
        },
        "… 500 more"
      ]
    },
    {
      "id": "08KB001",
      "name": "Fraser River at Shelley",
      "short": "Fraser at Shelley",
      "river": "Fraser",
      "lat": 54.00367,
      "lng": -122.62475,
      "primary": "discharge",
      "latest": {
        "t": "2026-10-16T10:05:00Z",
        "level": 3.289,
        "discharge": 954
      },
      "change24h": {
        "level": 0.172,
        "discharge": 82
      },
      "direction": {
        "level": "falling",
        "discharge": "falling"
      },
      "hourly": [
        {
          "t": "2026-09-16T08:00:00Z",
          "level": 2.005,
          "discharge": 429.3
        },
        {
          "t": "2026-09-16T09:00:00Z",
          "level": 1.999,
          "discharge": 427.3
        },
        "… 721 more"
      ]
    },
    "… 2 more"
  ],
  "meta": {
    "source": "Environment and Climate Change Canada, Water Survey of Canada real-time hydrometric data (provisional)",
    "sourceUrl": "https://wateroffice.ec.gc.ca/search/real_time_e.html",
    "updatedAt": "2026-10-16T10:37:26.486Z",
    "ageSec": 655,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Water Survey of Canada (provisional data), via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/rivers",
    "next": null,
    "docs": "/developers/reference/air-and-water/#get-rivers"
  }
}

GET /api/v1/rivers/stations #

Gauge stations used by PG Pulse.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/rivers/stations"

Example response (trimmed)

json
{
  "data": [
    {
      "id": "08KE018",
      "name": "Fraser River at South Fort George",
      "short": "Fraser (in town)",
      "river": "Fraser",
      "lat": 53.90078,
      "lng": -122.73494,
      "primary": "level"
    },
    {
      "id": "08KB001",
      "name": "Fraser River at Shelley",
      "short": "Fraser at Shelley",
      "river": "Fraser",
      "lat": 54.00367,
      "lng": -122.62475,
      "primary": "discharge"
    },
    "… 2 more"
  ],
  "meta": {
    "source": "Environment and Climate Change Canada, Water Survey of Canada real-time hydrometric data (provisional)",
    "sourceUrl": "https://wateroffice.ec.gc.ca/search/real_time_e.html",
    "updatedAt": null,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Water Survey of Canada (provisional data), via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/rivers/stations",
    "next": null,
    "docs": "/developers/reference/air-and-water/#get-rivers-stations"
  }
}

GET /api/v1/rivers/history #

Historical daily statistics and records for each gauge.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/rivers/history"

Example response (trimmed)

json
{
  "data": {
    "source": "Environment and Climate Change Canada, Water Survey of Canada, HYDAT daily means (hydrometric-daily-mean)",
    "sourceUrl": "https://api.weather.gc.ca/collections/hydrometric-daily-mean",
    "pageUrl": "https://wateroffice.ec.gc.ca/",
    "asOf": "2025-11-06",
    "notes": "dailyStats has 366 entries (day of year, leap-year indexed) of [min, 25th percentile, median, 75th percentile, max] of approved daily means across all years of record. Approved data lag real-time by up to a year.",
    "stations": {
      "08KB001": {
        "name": "Fraser River at Shelley",
        "measure": "discharge",
        "unit": "m³/s",
        "description": "Fraser upstream of the Nechako confluence, about 12 km northeast of downtown",
        "firstYear": 1950,
        "lastDate": "2025-10-01",
        "yearsOfRecord": 76,
        "recordHigh": {
          "date": "1972-06-14",
          "value": 4980
        },
        "recordLow": {
          "date": "2024-01-13",
          "value": 59.6
        },
        "dailyStats": [
          [
            114,
            168.5,
            "… 3 more"
          ],
          [
            113,
            165.5,
            "… 3 more"
          ],
          "… 364 more"
        ],
        "latestYear": {
          "year": 2025,
          "series": [
            "{…}",
            "{…}",
            "… 266 more"
          ]
        },
        "annualPeaks": [
          "{…}",
          "{…}",
          "… 72 more"
        ]
      },
      "08JC002": {
        "name": "Nechako River at Isle Pierre",
        "measure": "discharge",
        "unit": "m³/s",
        "description": "Nechako about 40 km west of the city, above the confluence",
        "firstYear": 1950,
        "lastDate": "2024-12-31",
        "yearsOfRecord": 75,
        "recordHigh": {
          "date": "2007-06-30",
          "value": 1170
        },
        "recordLow": {
          "date": "1953-04-15",
          "value": 40.8
        },
        "dailyStats": [
          [
            50.4,
            97.6,
            "… 3 more"
          ],
          [
            51.5,
            98.125,
            "… 3 more"
          ],
          "… 364 more"
        ],
        "latestYear": {
          "year": 2024,
          "series": [
            "{…}",
            "{…}",
            "… 364 more"
          ]
        },
        "annualPeaks": [
          "{…}",
          "{…}",
          "… 72 more"
        ]
      },
      "08KE018": {
        "name": "Fraser River at South Fort George",
        "measure": "level",
        "unit": "m",
        "description": "Fraser in the city, just below the Nechako confluence (water level only)",
        "firstYear": 1968,
        "lastDate": "2025-11-06",
        "yearsOfRecord": 58,
        "recordHigh": {
          "date": "1972-06-15",
          "value": 10.354
        },
        "recordLow": {
          "date": "1980-12-03",
          "value": 2.769
        },
        "dailyStats": [
          [
            3.241,
            3.483,
            "… 3 more"
          ],
          [
            3.217,
            3.536,
            "… 3 more"
          ],
          "… 364 more"
        ],
        "latestYear": {
          "year": 2025,
          "series": [
            "{…}",
            "{…}",
            "… 308 more"
          ]
        },
        "annualPeaks": [
          "{…}",
          "{…}",
          "… 55 more"
        ]
      }
    }
  },
  "meta": {
    "source": "Environment and Climate Change Canada, Water Survey of Canada, HYDAT daily means (hydrometric-daily-mean)",
    "sourceUrl": "https://api.weather.gc.ca/collections/hydrometric-daily-mean",
    "updatedAt": "2026-10-01T04:27:44.873Z",
    "ageSec": 1318837,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Water Survey of Canada (HYDAT), via PG Pulse (princegeorgepulse.ca)",
    "dataset": "river-history",
    "asOf": "2025-11-06"
  },
  "links": {
    "self": "/api/v1/rivers/history",
    "next": null,
    "docs": "/developers/reference/air-and-water/#get-rivers-history"
  }
}

GET /api/v1/water-quality #

City drinking water: wells, quality summary and monthly production.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/water-quality"

Example response (trimmed)

json
{
  "data": {
    "source": "City of Prince George, 2024 Annual Water System Report (released July 15, 2025)",
    "sourceUrl": "https://www.princegeorge.ca/city-hall/reports-publications/2024-city-prince-george-annual-water-system-report",
    "pageUrl": "https://www.princegeorge.ca/water",
    "rawWaterReportsUrl": "https://www.princegeorge.ca/water",
    "asOf": "2024",
    "summary": [
      "Prince George's drinking water is groundwater drawn from wells along the Nechako and Fraser rivers. The gravel layer between the rivers and the well intakes acts as natural filtration; the City has no additional filtr…",
      "Water is chlorinated to Northern Health guidelines, with a minimum free chlorine residual of 0.2 ppm maintained throughout the distribution system.",
      "… 2 more"
    ],
    "facts": {
      "annualProductionM3": 10734683,
      "samplesPerMonthRequired": 74,
      "samplesPerMonthAverage": 120,
      "boilWaterAdvisories": 0,
      "waterMainBreaks": 5,
      "serviceConnectionsRepaired": 143,
      "hydrantInspections": 620,
      "consumerWaterMeters": 4796,
      "minimumFreeChlorinePpm": 0.2
    },
    "wells": [
      {
        "name": "PW605",
        "source": "Groundwater (Nechako River)",
        "type": "Radial collector",
        "sharePct": 49
      },
      {
        "name": "PW601",
        "source": "Groundwater (Nechako River)",
        "type": "Radial collector",
        "sharePct": 26.4
      },
      "… 4 more"
    ],
    "monthlyProductionM3": [
      817951,
      751040,
      "… 10 more"
    ]
  },
  "meta": {
    "source": "City of Prince George, 2024 Annual Water System Report (released July 15, 2025)",
    "sourceUrl": "https://www.princegeorge.ca/city-hall/reports-publications/2024-city-prince-george-annual-water-system-report",
    "updatedAt": "2026-10-01T04:26:58.363Z",
    "ageSec": 1318883,
    "license": "Open Government Licence – City of Prince George (https://pgmapinfo.princegeorge.ca/OpenData/CityofPrinceGeorge_Open_Government_License_Open_Data.pdf)",
    "attribution": "City of Prince George, via PG Pulse (princegeorgepulse.ca)",
    "dataset": "water-quality",
    "asOf": "2024"
  },
  "links": {
    "self": "/api/v1/water-quality",
    "next": null,
    "docs": "/developers/reference/air-and-water/#get-water-quality"
  }
}

GET /api/v1/wildlife #

Recent research-grade iNaturalist sightings within 25 km, with photo credits.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/wildlife"

Example response (trimmed)

json
{
  "data": {
    "recent": [
      {
        "id": 408563646,
        "observedOn": "2026-10-14",
        "common": "Bufflehead",
        "scientific": "Bucephala albeola",
        "group": "Aves",
        "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/751044955/small.jpg",
        "attribution": "(c) peterbug, some rights reserved (CC BY-NC)",
        "license": "CC-BY-NC",
        "url": "https://www.inaturalist.org/observations/408563646"
      },
      {
        "id": 408561922,
        "observedOn": "2026-10-14",
        "common": "Mallard",
        "scientific": "Anas platyrhynchos",
        "group": "Aves",
        "photo": "https://inaturalist-open-data.s3.amazonaws.com/photos/751041264/small.jpg",
        "attribution": "(c) peterbug, some rights reserved (CC BY-NC)",
        "license": "CC-BY-NC",
        "url": "https://www.inaturalist.org/observations/408561922"
      },
      "… 10 more"
    ],
    "speciesLast30": 157,
    "observationsLast30": 49,
    "top": [
      {
        "common": "thimbleberry",
        "scientific": "Rubus parviflorus",
        "count": 9,
        "url": "https://www.inaturalist.org/taxa/51646"
      },
      {
        "common": "common yarrow",
        "scientific": "Achillea millefolium",
        "count": 7,
        "url": "https://www.inaturalist.org/taxa/52821"
      },
      "… 6 more"
    ]
  },
  "meta": {
    "source": "iNaturalist research-grade observations within 25 km of Prince George",
    "sourceUrl": "https://www.inaturalist.org/observations?lat=53.9171&lng=-122.7497&radius=25&quality_grade=research",
    "updatedAt": "2026-10-16T10:02:26.698Z",
    "ageSec": 2755,
    "license": "Each photo under the Creative Commons licence named in `license`, credited in `attribution`; observation data CC BY-NC (iNaturalist)",
    "attribution": "iNaturalist observers, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/wildlife",
    "next": null,
    "docs": "/developers/reference/air-and-water/#get-wildlife"
  }
}

GET /api/v1/air/history #

Recorded air quality: AQHI and PM2.5 (model and monitoring stations).

ParameterInTypeDescription
seriesquerystringOnly some of: air.aqhi, air.pm25, air.pm25_stations.
fromquerystringStart: ISO date/datetime, or a span back from to such as 48h, 7d or 30d (default 7d). Example: 7d.
toquerystringEnd: ISO date/datetime (default now).
intervalquerystringraw (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/air/history?from=48h"

Example response (trimmed)

json
{
  "data": [
    {
      "series": "air.aqhi",
      "label": "Air Quality Health Index",
      "unit": "AQHI",
      "interval": "raw",
      "truncated": false,
      "points": [
        {
          "t": "2026-10-14T11:00:00.000Z",
          "value": 1
        },
        {
          "t": "2026-10-14T12:00:00.000Z",
          "value": 1.03
        },
        "… 46 more"
      ]
    },
    {
      "series": "air.pm25",
      "label": "Fine particulate (PM2.5), model",
      "unit": "µg/m³",
      "interval": "raw",
      "truncated": false,
      "points": [
        {
          "t": "2026-10-14T11:00:00.000Z",
          "value": 0.7
        },
        {
          "t": "2026-10-14T12:00:00.000Z",
          "value": 0.4
        },
        "… 46 more"
      ]
    },
    "… 1 more"
  ],
  "meta": {
    "source": "Environment and Climate Change Canada AQHI (Prince George); Open-Meteo air quality model; BC Ministry of Environment air monitoring stations",
    "sourceUrl": "https://weather.gc.ca/airquality/pages/bcaq-009_e.html",
    "updatedAt": "2026-10-16T10:00:00.000Z",
    "ageSec": 2901,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/); CC BY 4.0, Open-Meteo.com (https://open-meteo.com/en/licence); Open Government Licence – Br…",
    "attribution": "The upstream named in each series (`meta.series.source`), via PG Pulse (princegeorgepulse.ca)",
    "from": "2026-10-14T10:48:21.000Z",
    "to": "2026-10-16T10:48:21.000Z",
    "interval": "raw",
    "series": [
      {
        "id": "air.aqhi",
        "source": "Environment and Climate Change Canada AQHI (Prince George); Open-Meteo air quality model; BC Ministry of Environment air monitoring stations"
      },
      {
        "id": "air.pm25",
        "source": "Environment and Climate Change Canada AQHI (Prince George); Open-Meteo air quality model; BC Ministry of Environment air monitoring stations"
      },
      "… 1 more"
    ]
  },
  "links": {
    "self": "/api/v1/air/history?from=48h",
    "next": null,
    "docs": "/developers/reference/air-and-water/#get-air-history"
  }
}

GET /api/v1/rivers/{id}/history #

Recorded water level and flow for one gauge (hourly from the real-time feed).

ParameterInTypeDescription
idpathstringStation id from /rivers/stations. Required. One of: 08KE018, 08KB001, 08JC002, 08KC001. Example: 08KE018.
fromquerystringStart: ISO date/datetime, or a span back from to such as 48h, 7d or 30d (default 7d). Example: 7d.
toquerystringEnd: ISO date/datetime (default now).
intervalquerystringraw (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/rivers/08KE018/history?from=30d"

Example response (trimmed)

json
{
  "data": [
    {
      "series": "river.08KE018.level",
      "label": "Fraser River at South Fort George: water level",
      "unit": "m",
      "interval": "hour",
      "truncated": false,
      "points": [
        {
          "t": "2026-09-16T10:00:00.000Z",
          "value": 4.337,
          "min": 4.337,
          "max": 4.337,
          "n": 1
        },
        {
          "t": "2026-09-16T11:00:00.000Z",
          "value": 4.332,
          "min": 4.332,
          "max": 4.332,
          "n": 1
        },
        "… 514 more"
      ]
    },
    {
      "series": "river.08KE018.discharge",
      "label": "Fraser River at South Fort George: flow",
      "unit": "m³/s",
      "interval": "hour",
      "truncated": false,
      "points": []
    }
  ],
  "meta": {
    "source": "Environment and Climate Change Canada, Water Survey of Canada real-time hydrometric data (provisional)",
    "sourceUrl": "https://wateroffice.ec.gc.ca/search/real_time_e.html",
    "updatedAt": "2026-10-07T21:00:00.000Z",
    "ageSec": 740901,
    "license": "Environment and Climate Change Canada Data Servers End-use Licence (https://eccc-msc.github.io/open-data/licence/readme_en/)",
    "attribution": "Water Survey of Canada (provisional data), via PG Pulse (princegeorgepulse.ca)",
    "from": "2026-09-16T10:48:21.000Z",
    "to": "2026-10-16T10:48:21.000Z",
    "interval": "hour",
    "series": [
      {
        "id": "river.08KE018.level",
        "source": "Environment and Climate Change Canada, Water Survey of Canada real-time hydrometric data (provisional)"
      },
      {
        "id": "river.08KE018.discharge",
        "source": "Environment and Climate Change Canada, Water Survey of Canada real-time hydrometric data (provisional)"
      }
    ]
  },
  "links": {
    "self": "/api/v1/rivers/08KE018/history?from=30d",
    "next": null,
    "docs": "/developers/reference/air-and-water/#get-rivers-id-history"
  }
}

Add PG Pulse to your home screen

Your browser installs apps from its Share menu.

  1. Tap Share in the browser toolbar (at the bottom of the screen on iPhone, at the top on iPad).
  2. Scroll down and tap Add to Home Screen.
  3. Tap Add. PG Pulse opens from its icon like any other app.