BYTETOOLS

Environment Canada GeoMet API

Free Canadian weather API with no key: OGC API - Features access to climate stations, daily and hourly records, and forecasts, as standards-compliant GeoJSON. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the Environment Canada GeoMet API?

Environment and Climate Change Canada's GeoMet platform serves climate and weather data through a standards-compliant OGC API - Features interface with no key. Collections are queried as GeoJSON FeatureCollections, with climate stations returning full metadata and identifiers.

Rather than inventing a bespoke interface, ECCC implemented OGC API - Features, the modern OGC standard. That means the same request grammar — `/collections`, `/collections/{id}/items`, `bbox`, `datetime`, `limit` — works here and against any other conformant server, and existing GIS clients can consume it without a custom driver. It is a more disciplined design than most national weather APIs manage.

One quirk will catch you immediately: latitude and longitude in the station properties are integers scaled by 10⁷. `485500000` is 48.55 degrees, and `-1234200000` is -123.42. The GeoJSON `geometry` on each feature carries the properly formatted decimal coordinates, so use that for mapping and treat the properties versions as an internal encoding. Every field is also duplicated in English and French, following federal bilingualism requirements, which roughly doubles the payload but means you get both languages for free. `CLIMATE_IDENTIFIER` is the key that links a station into the daily and hourly observation collections.

Quick facts

Base URL
https://api.weather.gc.ca
Authentication
No API key and no registration. Canadian federal government open data.
Rate limit
No published limit. Use `limit` and paging rather than requesting whole collections.
Pricing
Free under the Open Government Licence - Canada.
CORS
Enabled — callable directly from browser JavaScript
Official docs
Read the docs

How to use the Environment Canada GeoMet API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Fetch a climate station record

GET https://api.weather.gc.ca/collections/climate-stations/items?limit=1&f=json

curl
curl 'https://api.weather.gc.ca/collections/climate-stations/items?limit=1&f=json'
JavaScript (fetch)
const res = await fetch("https://api.weather.gc.ca/collections/climate-stations/items?limit=1&f=json");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://api.weather.gc.ca/collections/climate-stations/items?limit=1&f=json", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "STN_ID": 2,
        "STATION_NAME": "CHEMAINUS BARE POINT",
        "PROV_STATE_TERR_CODE": "BC",
        "ENG_PROV_NAME": "BRITISH COLUMBIA",
        "FRE_PROV_NAME": "COLOMBIE-BRITANNIQUE",
        "COUNTRY": "CAN",
        "LATITUDE": 485500000,
        "LONGITUDE": -1234200000,
        "TIMEZONE": "PST",
        "ELEVATION": "3.00",
        "CLIMATE_IDENTIFIER": "101AE00",
        "TC_IDENTIFIER": null,
        "WMO_IDENTIFIER": null,
        "STATION_TYPE": "N/A",
        "NORMAL_CODE": "G",
        "PUBLICATION_CODE": 1,
        "DISPLAY_CODE": 9,
        "ENG_STN_OPERATOR_ACRONYM": null,
        "FRE_STN_OPERATOR_ACRONYM": null,
        "ENG_STN_OPERATOR_NAME": null,
        "FRE_STN_OPERATOR_NAME": null,
        "FIRST_DATE": "1979-01-01 00:00:00",
        "LAST_DATE": "1979-12-31 00:00:00",
        "HLY_FIRST_DATE": null,
        "HLY_LAST_DATE": null,
        "DLY_FIRST_DATE": "1979-11-01 00:00:00",
        "DLY_LAST_DATE": "1979-12-31 00:00:00",
        "MLY_FIRST_DATE": "1979-01-01 00:00:00",
        "MLY_LAST_DATE": "1979-12-01 00:00:00",
        "HAS_MONTHLY_SUMMARY": "Y",
        "HAS_NORMALS_DATA": "N",
        "HAS_HOURLY_DATA": "N"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -123.7,
          48.916666666666664
        ]
      },
      "id": "101AE00"
    }
  ],
  "numberMatched": 8615,
  "numberReturned": 1,
  "links": [
    {
      "type": "application/geo+json",
      "rel": "self",
      "title": "T

Parameters

ParameterTypeRequiredDescription
(collection)pathRequiredCollection id, such as `climate-stations`, `climate-daily` or `climate-hourly`. List them at `/collections`. climate-stations
limitqueryOptionalMaximum features to return. Always set it — collections are large. 1
fqueryOptionalOutput format, `json` for GeoJSON or `html` for a browsable page. json
bboxqueryOptionalSpatial filter as `minLon,minLat,maxLon,maxLat` in decimal degrees. -125,48,-122,50
datetimequeryOptionalTemporal filter, a single instant or an interval, in RFC 3339. 2026-01-01/2026-01-31
CLIMATE_IDENTIFIERqueryOptionalFilter observation collections to one station. 101AE00

Response fields

typestring
Always `FeatureCollection` — this is standard GeoJSON.
features[].geometryobject
Point geometry with properly formatted decimal coordinates. Use this for mapping, not the scaled properties.
features[].properties.STN_IDinteger
Internal station identifier.
features[].properties.STATION_NAMEstring
Station name, in uppercase.
features[].properties.LATITUDE / LONGITUDEinteger
Coordinates scaled by 10⁷ — `485500000` means 48.55 degrees. Divide, or use the geometry instead.
features[].properties.CLIMATE_IDENTIFIERstring
The key that links this station to the daily and hourly observation collections.
features[].properties.PROV_STATE_TERR_CODE / ENG_PROV_NAME / FRE_PROV_NAMEstring
Province code plus its English and French names.
features[].properties.ELEVATIONstring
Elevation in metres, serialised as a string.
features[].properties.TIMEZONEstring
Station timezone abbreviation such as `PST`.
features[].properties.TC_IDENTIFIER / WMO_IDENTIFIERstring
Transport Canada and World Meteorological Organization identifiers, often null.
features[].properties.NORMAL_CODE / STATION_TYPEstring
Whether climate normals are computed for the station, and its operational classification.

What you can build with the Environment Canada GeoMet API

  • Find Canadian climate stations within a bounding box
  • Pull historical daily or hourly observations for a station
  • Feed a GIS client that already speaks OGC API - Features
  • Build a bilingual weather product using the paired English and French fields

Common errors and how to fix them

Stations plot in the wrong hemisphere

`LATITUDE` and `LONGITUDE` in properties are scaled by 10⁷.

Fix: Divide by ten million, or simply use the GeoJSON `geometry`, which is already correct.

Enormous response

Collections contain thousands of features.

Fix: Always send `limit`, and filter with `bbox` or `datetime`. Requesting a whole collection is never the right move.

Unknown collection id

Collection names differ from what you might guess.

Fix: Fetch `/collections` first and use the ids it lists.

Null identifiers

Not every station has a Transport Canada or WMO identifier.

Fix: Use `CLIMATE_IDENTIFIER` as the join key — that one is always present.

Environment Canada GeoMet API — frequently asked questions

Is the Environment Canada API free?

Yes, free with no key, published under the Open Government Licence - Canada.

Why are the coordinates such large numbers?

The properties store latitude and longitude as integers scaled by ten million, an internal encoding. The GeoJSON geometry on each feature carries the ordinary decimal coordinates, so use that.

What is OGC API - Features?

An open standard for serving geospatial features over HTTP. Because ECCC implemented it, the same query grammar and existing GIS clients work here without any custom integration.

How do I get actual observations rather than station metadata?

Query the `climate-daily` or `climate-hourly` collections, filtering by the `CLIMATE_IDENTIFIER` you got from the stations collection.

Tools that pair with this API

Environment Canada GeoMet is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.