← Back to Data Access

API Documentation

Energy Labs North Business API — 1,565 Canadian FSAs, 16 data dimensions.

Overview

The Energy Labs North API provides structured neighbourhood intelligence data for all Canadian forward sortation areas (FSAs). Coverage spans all 13 provinces and territories.

PropertyValue
Base URLhttps://api.energylabsnorth.com/v1
ProtocolHTTPS only
FormatJSON
API versionv1 — fields are additive; existing fields are never removed or renamed
Geographic scopeCanada-wide — 1,565 FSAs across all provinces and territories
Data vintage2021–2024 depending on dimension (see each endpoint)

Authentication

All API requests require a Business-tier API key passed in the X-API-Key header. Generate your key from the Data Access page.

GET https://api.energylabsnorth.com/v1/demographics/V8W X-API-Key: enl_live_your_key_here

Keys are prefixed enl_live_ followed by 32 hex characters. The full key is shown only once at generation — store it in a secure environment variable.

Keep your API key secret. Do not commit it to source control or expose it in client-side JavaScript. If compromised, regenerate it immediately from the Data Access page.

Rate limits

Business accounts receive 10,000 API calls per calendar month. The counter resets on the first of each month (UTC).

HeaderDescription
X-RateLimit-LimitMonthly call limit (10,000)
X-RateLimit-RemainingCalls remaining this month
X-RateLimit-ResetISO 8601 timestamp when the counter resets

When the limit is reached the API returns HTTP 429 Too Many Requests with error code QUOTA_EXCEEDED. CSV downloads via the API also count against this quota.

Response format

Every successful response wraps dimension data in a standard envelope:

{ "geo_id": "V8W", "geo_type": "fsa", "geo_name": "Victoria — Downtown", "province": "BC", "parent_geographies": { "csd": "5917034", "cd": "5917", "cma": "935", "province": "BC" }, "centroid_lat": 48.4284, "centroid_lng": -123.3656, "data_vintage": "2021–2024", "attribution": ["Statistics Canada 2021 Census"], "data": { /* dimension-specific fields */ } }

Envelope fields

FieldTypeDescription
geo_idstringForward Sortation Area code, e.g. V8W
geo_typestringAlways "fsa" in v1
geo_namestringHuman-readable name for the FSA
provincestringTwo-letter province abbreviation, e.g. BC, ON, QC
parent_geographiesobjectStatCan codes for the enclosing CSD, CD, CMA, and province
centroid_lat/lngnumberApproximate geographic centre of the FSA
data_vintagestringYear range the data covers
attributionarrayRequired data source credits — display these when redistributing
dataobjectDimension-specific fields (see each endpoint below)

Error responses follow a separate structure — see Error codes.

Geographic IDs

The API currently operates at the FSA (Forward Sortation Area) level — the first three characters of a Canadian postal code. FSAs are not Canada Post IP; they are freely usable without a postal code licence.

FormatExampleCoverage
[A-Z][0-9][A-Z]V8W, M5V, H2Y1,565 FSAs across all 13 provinces/territories

Pass geo_id as the last path segment of any dimension endpoint. The value is case-insensitive — v8w and V8W both work.

To find the FSA for an address, use the geocoding endpoint or extract the first three characters of a postal code.

Demographics

GET /v1/demographics/{geo_id} StatCan 2021 Census
FieldTypeDescription
population_sizeintegerTotal population in the FSA
income_bandstringMedian household income band, e.g. "$70K–$90K"
income_medianintegerExact median total household income (CAD)
age_group_dominantstringLargest age cohort: youth, working_age, or senior
education_bachelors_pctfloatShare of population 25+ with a bachelor's degree or higher
owner_pct / renter_pctfloatShare of occupied dwellings that are owner- or renter-occupied
household_avg_sizefloatAverage persons per private dwelling
cwb_overallintegerISC Community Well-Being Index (0–100); also cwb_education, cwb_labour_force, cwb_income, cwb_housing

Housing

GET /v1/housing/{geo_id} CMHC + BC Assessment
FieldTypeDescription
median_price_bandstringPrice range band, e.g. "$600K–$800K"
price_trendstringup, flat, or down
starts_trendstringHousing starts trend: up, flat, or down
building_age_bandstringDominant construction era, e.g. "pre-1980"
buildings_pre_1980_pctfloatShare of dwellings built before 1980
buildings_1981_2000_pctfloatShare built 1981–2000
buildings_post_2000_pctfloatShare built after 2000
core_housing_need_pctfloatShare of households in core housing need (StatCan 2021)

Rental

GET /v1/rental/{geo_id} CMHC Rental Market Survey
FieldTypeDescription
avg_rent_1br_bandstring1-bedroom rent band, e.g. "$1,400–$1,600"
avg_rent_2br_bandstring2-bedroom rent band
avg_rent_1brintegerAverage 1-bedroom monthly rent (CAD)
avg_rent_2brintegerAverage 2-bedroom monthly rent (CAD)
vacancy_descriptorstringtight (<2%), balanced (2–4%), or soft (>4%)

Natural Hazards

GET /v1/hazards/{geo_id} NRCan CanadaSHM6 · BC Wildfire · NRCan Flood · BC Emergency Management
Hazard data is for general informational purposes only. It is not a substitute for professional engineering or insurance assessment.
FieldTypeDescription
seismic_riskstringlow, moderate, high, or severe (NRCan CanadaSHM6)
wildfire_riskstringWildfire interface risk label (BC Wildfire Service WUI)
flood_riskstringFlood plain exposure label (NRCan)
tsunami_riskstringTsunami zone label (BC Emergency Management)
seismic_pgafloatPeak Ground Acceleration (g) from CanadaSHM6
seismic_pgvfloatPeak Ground Velocity (cm/s)
wui_risk_classstringWildland-Urban Interface risk class from BC Wildfire Service
hail_riskstringHail exposure label
active_flood_advisorystringCurrent ECCC flood advisory status, updated daily

Climate

GET /v1/climate/{geo_id} ECCC Climate Normals 1991–2020
FieldTypeDescription
mean_annual_temp_cfloatMean annual temperature (°C), 1991–2020 normal
annual_precip_mmintegerTotal annual precipitation (mm)
annual_sunshine_hrsintegerMean annual bright sunshine hours
aqhi_labelstringAir Quality Health Index category: good, fair, or poor
aqhi_valuefloatNumeric AQHI value (1–10+)
extreme_heat_daysintegerDays per year exceeding 30°C
extreme_cold_days_per_yearintegerDays per year below −20°C
smoke_days_per_yrintegerEstimated wildfire smoke days per year
pm25_annual_avgfloatAnnual mean fine particulate matter (µg/m³)

Crime

GET /v1/crime/{geo_id} Statistics Canada Crime Severity Index
FieldTypeDescription
csi_valuefloatCrime Severity Index. National baseline = 100 (Canada in 2006). Lower is safer.
csi_vs_citystringRelative to city average: below, at, or above
csi_colourstringTraffic-light indicator: green, yellow, or red
csi_violentfloatViolent Crime Severity sub-index
csi_propertyfloatProperty Crime Severity sub-index
suppressedbooleantrue when StatCan has suppressed data due to small population
Never display CSI data at a precision that could identify individuals. Respect StatCan suppression rules — when suppressed: true, do not interpolate or estimate the value.

Infrastructure

GET /v1/infrastructure/{geo_id} StatCan Proximity Measures Database 2021
FieldTypeDescription
grocery_accessstringProximity label: good, fair, or poor (top/mid/bottom third in province)
transit_accessstringTransit proximity label
healthcare_accessstringHealthcare proximity label
pharmacy_accessstringPharmacy proximity label
parks_accessstringParks / recreation proximity label
education_accessstringSchool proximity label
hospital_within_25kmbooleanWhether a hospital is within 25 km
school_within_5kmbooleanWhether a school is within 5 km
transit_availablebooleanWhether any public transit serves the FSA
pmd_groceryfloatRaw PMD proximity index for grocery (0–1)
pmd_transitfloatRaw PMD proximity index for transit
pmd_healthcarefloatRaw PMD proximity index for healthcare
pmd_pharmacy / pmd_parksfloatPMD indices for pharmacy and parks
pmd_employmentfloatEmployment access index
walkability_scoreinteger0–100 walkability score derived from PMD grocery, transit, healthcare, and pharmacy indices
ev_chargers_l2integerLevel 2 EV chargers within the FSA (NREL AFVSE)
ev_chargers_dcfcintegerDC fast chargers within the FSA
ev_charging_access_labelstringEV access label: good, fair, or poor

Environmental Quality

GET /v1/environment/{geo_id} ECCC NPRI · Health Canada Radon Survey
FieldTypeDescription
radon_risk_bandstringFSA-level radon risk: low, moderate, or high
npri_nearest_facility_typestringIndustry type of the nearest NPRI-reporting facility
npri_nearest_facility_kmfloatDistance to nearest NPRI facility (km)
npri_facility_countintegerNumber of NPRI facilities within 25 km
ndvi_meanfloatMean NDVI (Normalized Difference Vegetation Index, 0–1)
ndvi_categorystringUrban greenness: high, moderate, or low

Land Use

GET /v1/landuse/{geo_id} BC ALC · ECCC CPCAD · Crown-Indigenous Relations · Metro Vancouver
FieldTypeDescription
alr_statusbooleanWhether the FSA overlaps the BC Agricultural Land Reserve
protected_areabooleanWhether a protected area (CPCAD / BC Parks) is present
indigenous_reservebooleanWhether a federal Indian Reserve boundary intersects the FSA
indigenous_reserve_namestringName of the reserve (legislated boundary only)
ucb_statusstringMetro Vancouver Urban Containment Boundary: inside, outside, or not_applicable
crown_landbooleanWhether Crown land is present in the FSA
energy_step_code_requiredbooleanBC only — whether BC Energy Step Code applies (null outside BC)
energy_step_code_levelstringBC only — minimum step level required
farm_operations_countintegerNumber of farm operations (Census of Agriculture)
The indigenous_reserve field reflects legislated boundaries only — federal Indian Reserves and modern treaty settlement lands. It does not represent traditional territories, asserted title lands, or the full scope of Indigenous rights. Display with appropriate context.

Transportation

GET /v1/transportation/{geo_id} Statistics Canada 2021 Journey to Work
FieldTypeDescription
top_destination_1stringMost common commute destination (CSD name)
top_destination_2stringSecond most common destination
top_destination_3stringThird most common destination
dominant_modestringPrimary commute mode: drive, transit, walk, cycle, or wfh
commute_duration_bandstringAverage commute duration band, e.g. "15–29 min"
mode_drive_pctfloatShare of commuters driving (0–100)
mode_transit_pctfloatShare using public transit
mode_walk_pctfloatShare walking to work
mode_cycle_pctfloatShare cycling to work
mode_wfh_pctfloatShare working from home

Broadband

GET /v1/broadband/{geo_id} CRTC National Broadband Internet Service Availability Map
FieldTypeDescription
service_50_10string50/10 Mbps availability: yes, no, or partial
fibre_availablebooleanFibre-to-the-premises available
cable_availablebooleanCable broadband available
dsl_availablebooleanDSL available
fixed_wireless_availablebooleanFixed wireless available
provider_countintegerNumber of ISPs serving the FSA

Economy

GET /v1/economy/{geo_id} Statistics Canada Labour Force Survey
FieldTypeDescription
employment_ratefloatEmployment rate as a percentage
unemployment_ratefloatUnemployment rate as a percentage
employment_vs_provincialstringRelative to provincial average: above, at, or below
dominant_industrystringLargest employment sector (NAICS description)
dominant_industry_2/3stringSecond and third largest sectors
labour_participation_ratefloatLabour force participation rate
mortgage_arrears_ratefloatShare of mortgages in arrears (CMHC, CMA level)

Solar

GET /v1/solar/{geo_id} Natural Resources Canada CanmetENERGY
FieldTypeDescription
solar_potential_labelstringQualitative potential: excellent, good, moderate, or low
annual_ghi_kwh_m2floatAnnual global horizontal irradiance (kWh/m²)
annual_pv_yield_kwh_kwpfloatEstimated annual PV yield (kWh per kWp installed)
avg_panel_output_kwh_yrfloatEstimated annual output for a typical 6 kW residential system (kWh)
estimated_annual_savings_cadfloatEstimated annual bill savings (CAD, based on local utility rate)

Electrification Readiness

GET /v1/electrification/{geo_id} Energy Labs North composite from open data sources
FieldTypeDescription
scoreintegerComposite electrification readiness index (0–100)
labelstringReady (≥70), Developing (50–69), or Early Stage (<50)
score_ev_infrastructurefloatEV charging infrastructure sub-score
score_incomefloatIncome capacity sub-score
score_heating_electrificationfloatHeating electrification adoption sub-score
score_building_agefloatBuilding age suitability sub-score
score_housing_typefloatHousing type sub-score (detached homes easier to retrofit)
score_climate_hddfloatHeating degree day climate suitability sub-score

NorthScore

GET /v1/score/{geo_id} Energy Labs North composite livability index

NorthScore is a composite 0–100 livability index. It measures quality of place for residents — not investment potential. Housing prices and affordability are intentionally excluded.

FieldTypeDescription
composite_scoreintegerOverall NorthScore (0–100)
score_labelstringLabel: Exceptional, Very Good, Good, Fair, Below Average, or Challenging
amenity_access_scoreintegerDaily amenity access (weight: 30%)
safety_scoreintegerCrime severity-derived safety score (weight: 25%)
environmental_health_scoreintegerAir quality + pollution + radon (weight: 15%)
hazard_resilience_scoreintegerNatural hazard exposure (weight: 15%)
climate_comfort_scoreintegerTemperature, sunshine, precipitation (weight: 10%)
infrastructure_scoreintegerHospital, transit frequency, school vitality (weight: 5%)
province_percentilefloatPercentile rank within the FSA's province (0–100)
national_percentilefloatPercentile rank across all Canadian FSAs (0–100)

Full methodology: NorthScore methodology page.

CSV exports

Full-table CSV exports cover all 1,565 Canadian FSAs for each dataset. Files are cached for 24 hours.

List available datasets

GET /v1/export/datasets Returns slug, label, and description for each exportable dataset
GET https://api.energylabsnorth.com/v1/export/datasets X-API-Key: enl_live_your_key_here // Response { "datasets": [ { "slug": "demographics", "label": "Demographics", "description": "..." }, { "slug": "housing", "label": "Housing", "description": "..." }, ... ] }

Download a dataset

GET /v1/export/csv/{slug} Returns a CSV file download
GET https://api.energylabsnorth.com/v1/export/csv/demographics X-API-Key: enl_live_your_key_here # Response: text/csv with Content-Disposition: attachment # Columns match the /v1/demographics/{geo_id} data fields # All 1,565 FSAs in one file, no pagination required

The {slug} values match those returned by /v1/export/datasets. Use that endpoint to discover available exports programmatically — new datasets are added without requiring a code change on your end.

Each download counts as one API call against your monthly quota.

Error codes

All errors return a JSON body:

{ "error": "GEO_NOT_FOUND", "message": "No geography found for geo_id \"XYZ\".", "status": 404 }
CodeHTTPMeaning
MISSING_API_KEY401No X-API-Key header provided
INVALID_API_KEY401Key not found or revoked
TIER_INSUFFICIENT402Key exists but the account is not on the Business tier
QUOTA_EXCEEDED429Monthly call limit reached — resets first of next month
GEO_NOT_FOUND404No FSA found for the given geo_id
DATA_NOT_FOUND404FSA exists but no data available for this dimension
UNKNOWN_DIMENSION404Unrecognised endpoint path segment
UNKNOWN_DATASET404CSV slug not found in the dataset registry
MISSING_GEO_ID400No geo_id provided in the path

Attribution

Every API response includes an attribution array listing the required data source credits. When displaying or redistributing data sourced from this API, you must credit those sources in a visible and legible manner.

Full open data licence details: Attribution page · API Terms of Use.

Questions? Email [email protected]