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.
| Property | Value |
|---|---|
| Base URL | https://api.energylabsnorth.com/v1 |
| Protocol | HTTPS only |
| Format | JSON |
| API version | v1 — fields are additive; existing fields are never removed or renamed |
| Geographic scope | Canada-wide — 1,565 FSAs across all provinces and territories |
| Data vintage | 2021–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.
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.
Rate limits
Business accounts receive 10,000 API calls per calendar month. The counter resets on the first of each month (UTC).
| Header | Description |
|---|---|
| X-RateLimit-Limit | Monthly call limit (10,000) |
| X-RateLimit-Remaining | Calls remaining this month |
| X-RateLimit-Reset | ISO 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:
Envelope fields
| Field | Type | Description |
|---|---|---|
| geo_id | string | Forward Sortation Area code, e.g. V8W |
| geo_type | string | Always "fsa" in v1 |
| geo_name | string | Human-readable name for the FSA |
| province | string | Two-letter province abbreviation, e.g. BC, ON, QC |
| parent_geographies | object | StatCan codes for the enclosing CSD, CD, CMA, and province |
| centroid_lat/lng | number | Approximate geographic centre of the FSA |
| data_vintage | string | Year range the data covers |
| attribution | array | Required data source credits — display these when redistributing |
| data | object | Dimension-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.
| Format | Example | Coverage |
|---|---|---|
[A-Z][0-9][A-Z] | V8W, M5V, H2Y | 1,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
| Field | Type | Description |
|---|---|---|
| population_size | integer | Total population in the FSA |
| income_band | string | Median household income band, e.g. "$70K–$90K" |
| income_median | integer | Exact median total household income (CAD) |
| age_group_dominant | string | Largest age cohort: youth, working_age, or senior |
| education_bachelors_pct | float | Share of population 25+ with a bachelor's degree or higher |
| owner_pct / renter_pct | float | Share of occupied dwellings that are owner- or renter-occupied |
| household_avg_size | float | Average persons per private dwelling |
| cwb_overall | integer | ISC Community Well-Being Index (0–100); also cwb_education, cwb_labour_force, cwb_income, cwb_housing |
Housing
| Field | Type | Description |
|---|---|---|
| median_price_band | string | Price range band, e.g. "$600K–$800K" |
| price_trend | string | up, flat, or down |
| starts_trend | string | Housing starts trend: up, flat, or down |
| building_age_band | string | Dominant construction era, e.g. "pre-1980" |
| buildings_pre_1980_pct | float | Share of dwellings built before 1980 |
| buildings_1981_2000_pct | float | Share built 1981–2000 |
| buildings_post_2000_pct | float | Share built after 2000 |
| core_housing_need_pct | float | Share of households in core housing need (StatCan 2021) |
Rental
| Field | Type | Description |
|---|---|---|
| avg_rent_1br_band | string | 1-bedroom rent band, e.g. "$1,400–$1,600" |
| avg_rent_2br_band | string | 2-bedroom rent band |
| avg_rent_1br | integer | Average 1-bedroom monthly rent (CAD) |
| avg_rent_2br | integer | Average 2-bedroom monthly rent (CAD) |
| vacancy_descriptor | string | tight (<2%), balanced (2–4%), or soft (>4%) |
Natural Hazards
| Field | Type | Description |
|---|---|---|
| seismic_risk | string | low, moderate, high, or severe (NRCan CanadaSHM6) |
| wildfire_risk | string | Wildfire interface risk label (BC Wildfire Service WUI) |
| flood_risk | string | Flood plain exposure label (NRCan) |
| tsunami_risk | string | Tsunami zone label (BC Emergency Management) |
| seismic_pga | float | Peak Ground Acceleration (g) from CanadaSHM6 |
| seismic_pgv | float | Peak Ground Velocity (cm/s) |
| wui_risk_class | string | Wildland-Urban Interface risk class from BC Wildfire Service |
| hail_risk | string | Hail exposure label |
| active_flood_advisory | string | Current ECCC flood advisory status, updated daily |
Climate
| Field | Type | Description |
|---|---|---|
| mean_annual_temp_c | float | Mean annual temperature (°C), 1991–2020 normal |
| annual_precip_mm | integer | Total annual precipitation (mm) |
| annual_sunshine_hrs | integer | Mean annual bright sunshine hours |
| aqhi_label | string | Air Quality Health Index category: good, fair, or poor |
| aqhi_value | float | Numeric AQHI value (1–10+) |
| extreme_heat_days | integer | Days per year exceeding 30°C |
| extreme_cold_days_per_year | integer | Days per year below −20°C |
| smoke_days_per_yr | integer | Estimated wildfire smoke days per year |
| pm25_annual_avg | float | Annual mean fine particulate matter (µg/m³) |
Crime
| Field | Type | Description |
|---|---|---|
| csi_value | float | Crime Severity Index. National baseline = 100 (Canada in 2006). Lower is safer. |
| csi_vs_city | string | Relative to city average: below, at, or above |
| csi_colour | string | Traffic-light indicator: green, yellow, or red |
| csi_violent | float | Violent Crime Severity sub-index |
| csi_property | float | Property Crime Severity sub-index |
| suppressed | boolean | true when StatCan has suppressed data due to small population |
suppressed: true, do not interpolate or estimate the value.Infrastructure
| Field | Type | Description |
|---|---|---|
| grocery_access | string | Proximity label: good, fair, or poor (top/mid/bottom third in province) |
| transit_access | string | Transit proximity label |
| healthcare_access | string | Healthcare proximity label |
| pharmacy_access | string | Pharmacy proximity label |
| parks_access | string | Parks / recreation proximity label |
| education_access | string | School proximity label |
| hospital_within_25km | boolean | Whether a hospital is within 25 km |
| school_within_5km | boolean | Whether a school is within 5 km |
| transit_available | boolean | Whether any public transit serves the FSA |
| pmd_grocery | float | Raw PMD proximity index for grocery (0–1) |
| pmd_transit | float | Raw PMD proximity index for transit |
| pmd_healthcare | float | Raw PMD proximity index for healthcare |
| pmd_pharmacy / pmd_parks | float | PMD indices for pharmacy and parks |
| pmd_employment | float | Employment access index |
| walkability_score | integer | 0–100 walkability score derived from PMD grocery, transit, healthcare, and pharmacy indices |
| ev_chargers_l2 | integer | Level 2 EV chargers within the FSA (NREL AFVSE) |
| ev_chargers_dcfc | integer | DC fast chargers within the FSA |
| ev_charging_access_label | string | EV access label: good, fair, or poor |
Environmental Quality
| Field | Type | Description |
|---|---|---|
| radon_risk_band | string | FSA-level radon risk: low, moderate, or high |
| npri_nearest_facility_type | string | Industry type of the nearest NPRI-reporting facility |
| npri_nearest_facility_km | float | Distance to nearest NPRI facility (km) |
| npri_facility_count | integer | Number of NPRI facilities within 25 km |
| ndvi_mean | float | Mean NDVI (Normalized Difference Vegetation Index, 0–1) |
| ndvi_category | string | Urban greenness: high, moderate, or low |
Land Use
| Field | Type | Description |
|---|---|---|
| alr_status | boolean | Whether the FSA overlaps the BC Agricultural Land Reserve |
| protected_area | boolean | Whether a protected area (CPCAD / BC Parks) is present |
| indigenous_reserve | boolean | Whether a federal Indian Reserve boundary intersects the FSA |
| indigenous_reserve_name | string | Name of the reserve (legislated boundary only) |
| ucb_status | string | Metro Vancouver Urban Containment Boundary: inside, outside, or not_applicable |
| crown_land | boolean | Whether Crown land is present in the FSA |
| energy_step_code_required | boolean | BC only — whether BC Energy Step Code applies (null outside BC) |
| energy_step_code_level | string | BC only — minimum step level required |
| farm_operations_count | integer | Number of farm operations (Census of Agriculture) |
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
| Field | Type | Description |
|---|---|---|
| top_destination_1 | string | Most common commute destination (CSD name) |
| top_destination_2 | string | Second most common destination |
| top_destination_3 | string | Third most common destination |
| dominant_mode | string | Primary commute mode: drive, transit, walk, cycle, or wfh |
| commute_duration_band | string | Average commute duration band, e.g. "15–29 min" |
| mode_drive_pct | float | Share of commuters driving (0–100) |
| mode_transit_pct | float | Share using public transit |
| mode_walk_pct | float | Share walking to work |
| mode_cycle_pct | float | Share cycling to work |
| mode_wfh_pct | float | Share working from home |
Broadband
| Field | Type | Description |
|---|---|---|
| service_50_10 | string | 50/10 Mbps availability: yes, no, or partial |
| fibre_available | boolean | Fibre-to-the-premises available |
| cable_available | boolean | Cable broadband available |
| dsl_available | boolean | DSL available |
| fixed_wireless_available | boolean | Fixed wireless available |
| provider_count | integer | Number of ISPs serving the FSA |
Economy
| Field | Type | Description |
|---|---|---|
| employment_rate | float | Employment rate as a percentage |
| unemployment_rate | float | Unemployment rate as a percentage |
| employment_vs_provincial | string | Relative to provincial average: above, at, or below |
| dominant_industry | string | Largest employment sector (NAICS description) |
| dominant_industry_2/3 | string | Second and third largest sectors |
| labour_participation_rate | float | Labour force participation rate |
| mortgage_arrears_rate | float | Share of mortgages in arrears (CMHC, CMA level) |
Solar
| Field | Type | Description |
|---|---|---|
| solar_potential_label | string | Qualitative potential: excellent, good, moderate, or low |
| annual_ghi_kwh_m2 | float | Annual global horizontal irradiance (kWh/m²) |
| annual_pv_yield_kwh_kwp | float | Estimated annual PV yield (kWh per kWp installed) |
| avg_panel_output_kwh_yr | float | Estimated annual output for a typical 6 kW residential system (kWh) |
| estimated_annual_savings_cad | float | Estimated annual bill savings (CAD, based on local utility rate) |
Electrification Readiness
| Field | Type | Description |
|---|---|---|
| score | integer | Composite electrification readiness index (0–100) |
| label | string | Ready (≥70), Developing (50–69), or Early Stage (<50) |
| score_ev_infrastructure | float | EV charging infrastructure sub-score |
| score_income | float | Income capacity sub-score |
| score_heating_electrification | float | Heating electrification adoption sub-score |
| score_building_age | float | Building age suitability sub-score |
| score_housing_type | float | Housing type sub-score (detached homes easier to retrofit) |
| score_climate_hdd | float | Heating degree day climate suitability sub-score |
NorthScore
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.
| Field | Type | Description |
|---|---|---|
| composite_score | integer | Overall NorthScore (0–100) |
| score_label | string | Label: Exceptional, Very Good, Good, Fair, Below Average, or Challenging |
| amenity_access_score | integer | Daily amenity access (weight: 30%) |
| safety_score | integer | Crime severity-derived safety score (weight: 25%) |
| environmental_health_score | integer | Air quality + pollution + radon (weight: 15%) |
| hazard_resilience_score | integer | Natural hazard exposure (weight: 15%) |
| climate_comfort_score | integer | Temperature, sunshine, precipitation (weight: 10%) |
| infrastructure_score | integer | Hospital, transit frequency, school vitality (weight: 5%) |
| province_percentile | float | Percentile rank within the FSA's province (0–100) |
| national_percentile | float | Percentile 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
Download a dataset
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:
| Code | HTTP | Meaning |
|---|---|---|
| MISSING_API_KEY | 401 | No X-API-Key header provided |
| INVALID_API_KEY | 401 | Key not found or revoked |
| TIER_INSUFFICIENT | 402 | Key exists but the account is not on the Business tier |
| QUOTA_EXCEEDED | 429 | Monthly call limit reached — resets first of next month |
| GEO_NOT_FOUND | 404 | No FSA found for the given geo_id |
| DATA_NOT_FOUND | 404 | FSA exists but no data available for this dimension |
| UNKNOWN_DIMENSION | 404 | Unrecognised endpoint path segment |
| UNKNOWN_DATASET | 404 | CSV slug not found in the dataset registry |
| MISSING_GEO_ID | 400 | No 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]