!

Urban planners: the housing stock questions council keeps asking are one query each

Photo of Alex Wilkinson
Alex Wilkinson
CEO of Houski
2026-07-15

Every planning department carries a backlog of questions it believes are expensive. How old is the housing stock along the corridor we want to upzone. How many houses in this ward predate modern building codes. What is the actual mix of housing types in the community we are about to rezone, as opposed to the mix everyone assumes. What does the housing in this community look like, unit by unit, before we model the infrastructure load.

The usual answers are a consultant engagement, a staff member with a spreadsheet and a summer, or a shrug until the next census cycle. All three treat the question as a data collection problem. It stopped being one. The stock is already enumerated - Calgary alone is 680,735 property records, each with its type, construction year, size, zoning, and the demographics of its surroundings on the same row - and querying it takes minutes, not quarters.

Age of stock, the actual distribution

Housing age drives almost everything planners get asked about - retrofit programs, heritage pressure, densification candidates, infrastructure renewal. The median construction year for Calgary comes back from one aggregate call:

API request
TypeScript code
const houski_data = async (): Promise<AggregateResponse> => {

    // You must copy the AggregateResponse type declarations from the 
    // Houski API documentation to strongly type the response

    const url = new URL('https://api.houski.ca/aggregate');
    url.searchParams.set('aggregation', 'median');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('field', 'construction_year');
    url.searchParams.set('province_abbreviation', 'ab');

    const response = await fetch(url);
    const data = await response.json();

    return data;
}

(async () => {
let data: AggregateResponse = await houski_data();

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 1.0,
  "data": [
    {
      "aggregation": "median",
      "field": "construction_year",
      "value": "2003"
    }
  ],
  "error": "",
  "price_quote": false,
  "time_ms": 56
}

The answer today is 2003, which surprises people who think of Calgary as an old-core city. Half the stock is newer than most planning staff's careers.

The tail matters more than the median, though. Houses built before 1970 are where retrofit dollars, energy programs, and redevelopment pressure all concentrate:

API request
TypeScript code
const houski_data = async (): Promise<PropertiesResponse> => {

    // You must copy the PropertiesResponse type declarations from the 
    // Houski API documentation to strongly type the response

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('construction_year_lte', '1970');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('property_type_eq', 'House');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '25');
    url.searchParams.set('select', 'address,community,construction_year,interior_sq_m,zoning');

    const response = await fetch(url);
    const data = await response.json();

    return data;
}

(async () => {
let data: PropertiesResponse = await houski_data();

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 8.25,
  "data": [
    {
      "address": "6619 34 Street SW",
      "community": "Lakeview",
      "construction_year": 1964,
      "interior_sq_m": 139.35450744628906,
      "property_id": "10014f3c7e5bfad9",
      "zoning": "R-CG"
    },
    {
      "address": "1516 49 Street SE",
      "community": "Forest Lawn",
      "construction_year": 1959,
      "interior_sq_m": 90.67261505126952,
      "property_id": "10024c6023d6ca9",
      "zoning": "R-CG"
    },
    {
      "address": "2128 Crestwood Road SE",
      "community": "Ogden",
      "construction_year": 1955,
      "interior_sq_m": 80.96432495117188,
      "property_id": "1002822e7b274674",
      "zoning": "R-CG"
    },
    {
      "address": "1542 52 Street SE",
      "community": "Penbrooke Meadows",
      "construction_year": 1959,
      "interior_sq_m": 98.01189422607422,
      "property_id": "1003955fedeb5ef7",
      "zoning": "R-CG"
    },
    {
      "address": "2404 Pinewood Drive SE",
      "community": "Southview",
      "construction_year": 1959,
      "interior_sq_m": 97.2686767578125,
      "property_id": "100577ee6782c5e1",
      "zoning": "R-CG"
    },
    {
      "address": "5047 Vanstone Crescent NW",
      "community": "Varsity",
      "construction_year": 1966,
      "interior_sq_m": 165.27313232421875,
      "property_id": "1005fe608a515e58",
      "zoning": "R-CG"
    },
    {
      "address": "143 Marbrooke Circle NE",
      "community": "Marlborough",
      "construction_year": 1968,
      "interior_sq_m": 104.050537109375,
      "property_id": "100655e9b87ae8d1",
      "zoning": "R-CG"
    },
    {
      "address": "24 Hoover Place SW",
      "community": "Haysboro",
      "construction_year": 1958,
      "interior_sq_m": 93.45967864990234,
      "property_id": "100a43bcbefcc557",
      "zoning": "R-CG"
    },
    {
      "address": "108 Cheyenne Crescent NW",
      "community": "Charleswood",
      "construction_year": 1959,
      "interior_sq_m": 135.49795532226562,
      "property_id": "100af6cbccc73c57",
      "zoning": "R-CG"
    },
    {
      "address": "56 Northmount Drive NW",
      "community": "Thorncliffe",
      "construction_year": 1956,
      "interior_sq_m": 114.40914154052734,
      "property_id": "100bd0ee45c0a61b",
      "zoning": "R-CG"
    },
    {
      "address": "1307 41 Street SE",
      "community": "Forest Lawn",
      "construction_year": 1959,
      "interior_sq_m": 90.67261505126952,
      "property_id": "100cae11312386e3",
      "zoning": "R-CG"
    },
    {
      "address": "305 2905 Unwin Road NW",
      "community": "University Heights",
      "construction_year": 1964,
      "interior_sq_m": 125.882568359375,
      "property_id": "100d3207ca45079a",
      "zoning": "R-CG"
    },
    {
      "address": "57 Fenton Road SE",
      "community": "Fairview",
      "construction_year": 1959,
      "interior_sq_m": 106.79115295410156,
      "property_id": "100fd1906381c190",
      "zoning": "R-CG"
    },
    {
      "address": "3216 Breen Road NW",
      "community": "Brentwood",
      "construction_year": 1964,
      "interior_sq_m": 104.23634338378906,
      "property_id": "10106e1d99f8de60",
      "zoning": "R-CG"
    },
    {
      "address": "210 20 Frobisher Boulevard SE",
      "community": "Fairview",
      "construction_year": 1959,
      "interior_sq_m": 125.882568359375,
      "property_id": "1010adac57c9a1ac",
      "zoning": "H-GO"
    },
    {
      "address": "719 Allandale Road SE",
      "community": "Acadia",
      "construction_year": 1964,
      "interior_sq_m": 99.77703857421876,
      "property_id": "10122f0ce525c853",
      "zoning": "R-CG"
    },
    {
      "address": "18 Marwood Circle NE",
      "community": "Marlborough",
      "construction_year": 1970,
      "interior_sq_m": 100.52025604248048,
      "property_id": "10132b080acd212d",
      "zoning": "R-CG"
    },
    {
      "address": "20 Wildwood Drive SW",
      "community": "Wildwood",
      "construction_year": 1956,
      "interior_sq_m": 150.0371551513672,
      "property_id": "10136c6b78423d0b",
      "zoning": "R-CG"
    },
    {
      "address": "129 30 Avenue NW",
      "community": "Tuxedo park",
      "construction_year": 1921,
      "interior_sq_m": 115.84912109375,
      "property_id": "1013d1d3888198d8",
      "zoning": "R-CG"
    },
    {
      "address": "123 Haverhill Road SW",
      "community": "Haysboro",
      "construction_year": 1959,
      "interior_sq_m": 106.09439086914062,
      "property_id": "1013d710d1e58e07",
      "zoning": "H-GO"
    },
    {
      "address": "5323 Buckthorn Road NW",
      "community": "Thorncliffe",
      "construction_year": 1954,
      "interior_sq_m": 91.64808654785156,
      "property_id": "1013efeb11dccdfa",
      "zoning": "R-CG"
    },
    {
      "address": "5639 Centre Street NW",
      "community": "Thorncliffe",
      "construction_year": 1955,
      "interior_sq_m": 125.7896728515625,
      "property_id": "10160e21e8618c10",
      "zoning": "R-CG"
    },
    {
      "address": "2024 38 Street SE",
      "community": "Forest Lawn",
      "construction_year": 1959,
      "interior_sq_m": 90.67261505126952,
      "property_id": "1016ab72b4873b4c",
      "zoning": "R-CG"
    },
    {
      "address": "4923 Marlborough Drive NE",
      "community": "Marlborough",
      "construction_year": 1968,
      "interior_sq_m": 94.76031494140624,
      "property_id": "1018bc63038eb51f",
      "zoning": "R-CG"
    },
    {
      "address": "1029 9 Street SE",
      "community": "Ramsay",
      "construction_year": 1912,
      "interior_sq_m": 97.08287048339844,
      "property_id": "1019312373ac7853",
      "zoning": "R-CG"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 2183
  },
  "price_quote": false,
  "result_total": 54565,
  "time_ms": 67,
  "ui_info": {
    "city": "Calgary",
    "city_id": "6ec95b53075d062c",
    "city_link": "ca/ab/calgary",
    "city_slug": "calgary",
    "country": "Canada",
    "country_abbreviation": "CA",
    "country_abbreviation_id": "9ace2b6431b7f1be",
    "country_abbreviation_link": "ca",
    "country_slug": "canada",
    "province": "Alberta",
    "province_abbreviation": "AB",
    "province_abbreviation_id": "aae1f05a0f89d2c7",
    "province_abbreviation_link": "ca/ab",
    "province_slug": "alberta"
  }
}

That is 54,947 houses, each with its community and zoning attached, which means the output is not a count for a memo. It is a mappable inventory a program can actually target.

Corridor and community studies without the parcel-by-parcel slog

Studies usually start by assembling "what is actually there" for a defined area, and that assembly step is most of the budget. Filtering on community collapses it:

API request
TypeScript code
const houski_data = async (): Promise<PropertiesResponse> => {

    // You must copy the PropertiesResponse type declarations from the 
    // Houski API documentation to strongly type the response

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('community_eq', 'Sunnyside');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '25');
    url.searchParams.set('select', 'address,property_type,construction_year,zoning,interior_sq_m');

    const response = await fetch(url);
    const data = await response.json();

    return data;
}

(async () => {
let data: PropertiesResponse = await houski_data();

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 8.25,
  "data": [
    {
      "address": "201 934 2 Avenue NW",
      "construction_year": 1969,
      "interior_sq_m": 87.69973754882812,
      "property_id": "102368d69b982464",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "2 923 1 Avenue NW",
      "construction_year": 2022,
      "interior_sq_m": 193.6083221435547,
      "property_id": "103ac12d670d08ae",
      "property_type": "Townhouse",
      "zoning": "M-CG"
    },
    {
      "address": "8 3745 Memorial Drive SE",
      "construction_year": 2016,
      "interior_sq_m": 94.01708984375,
      "property_id": "10606d1384a8caa1",
      "property_type": "Commercial",
      "zoning": "M-CG"
    },
    {
      "address": "403 723 3 Avenue NW",
      "construction_year": 1970,
      "interior_sq_m": 87.69973754882812,
      "property_id": "106d2a8703550895",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "204 816 9A Street NW",
      "construction_year": 1966,
      "interior_sq_m": 87.69973754882812,
      "property_id": "10905775846285c0",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "905 4A Street NW",
      "construction_year": 1982,
      "interior_sq_m": 87.69973754882812,
      "property_id": "10911b1a4512b3a7",
      "property_type": "Apartment",
      "zoning": "R-CG"
    },
    {
      "address": "7 928 3 Avenue NW",
      "construction_year": 1977,
      "interior_sq_m": 87.69973754882812,
      "property_id": "10aa49472a1b5c0a",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "22 6060 Memorial Drive NE",
      "construction_year": 2016,
      "interior_sq_m": 94.01708984375,
      "property_id": "115588e8f4e159ce",
      "property_type": "Commercial",
      "zoning": "M-CG"
    },
    {
      "address": "907 4A Street NW",
      "construction_year": 1982,
      "interior_sq_m": 87.69973754882812,
      "property_id": "1167a3a84f8be3ac",
      "property_type": "Apartment",
      "zoning": "R-CG"
    },
    {
      "address": "1010 1 Avenue NW",
      "construction_year": 1910,
      "interior_sq_m": 87.69973754882812,
      "property_id": "116840ad9cae73b8",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "5 708 Memorial Drive NW",
      "construction_year": 2016,
      "interior_sq_m": 94.01708984375,
      "property_id": "116d8726710d0b9a",
      "property_type": "Commercial",
      "zoning": "M-CG"
    },
    {
      "address": "1308 3800 Memorial Drive NE",
      "construction_year": 2016,
      "interior_sq_m": 94.01708984375,
      "property_id": "119e0061844c01c5",
      "property_type": "Commercial",
      "zoning": "M-CG"
    },
    {
      "address": "627 2 Avenue NW",
      "construction_year": 1912,
      "interior_sq_m": 88.44295501708984,
      "property_id": "11b2753da0c5ee7c",
      "property_type": "Land",
      "zoning": "M-CG"
    },
    {
      "address": "306 1440 Memorial Drive NW",
      "construction_year": 2016,
      "interior_sq_m": 94.01708984375,
      "property_id": "11c3c35fb561cbe6",
      "property_type": "Commercial",
      "zoning": "M-CG"
    },
    {
      "address": "424 10 Street NW",
      "construction_year": 1973,
      "interior_sq_m": 87.69973754882812,
      "property_id": "11fbbc223a45c802",
      "property_type": "Commercial",
      "zoning": "C-COR1"
    },
    {
      "address": "412 823 5 Avenue NW",
      "construction_year": 2013,
      "interior_sq_m": 87.69973754882812,
      "property_id": "120b0d3558b3e9da",
      "property_type": "Apartment",
      "zoning": "DC"
    },
    {
      "address": "2 1230 Memorial Drive NW",
      "construction_year": 2016,
      "interior_sq_m": 94.01708984375,
      "property_id": "121c920639ab3d00",
      "property_type": "Commercial",
      "zoning": "M-CG"
    },
    {
      "address": "104 728 3 Avenue NW",
      "construction_year": 1969,
      "interior_sq_m": 55.18394470214844,
      "property_id": "122ce462916da773",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "929 1 Avenue NW",
      "construction_year": 2021,
      "interior_sq_m": 87.69973754882812,
      "property_id": "12462ce8abad3c7a",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "607 327 9A Street NW",
      "construction_year": 2018,
      "interior_sq_m": 87.69973754882812,
      "property_id": "1253ea52d12d2f5f",
      "property_type": "Apartment",
      "zoning": "DC"
    },
    {
      "address": "104 824 4 Avenue NW",
      "construction_year": 1968,
      "interior_sq_m": 45.89371871948242,
      "property_id": "1267d5a56073569d",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "Centre 606 3 Avenue NW",
      "construction_year": 1978,
      "interior_sq_m": 87.69973754882812,
      "property_id": "1279a47463dfead3",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "805 4 Avenue NW",
      "construction_year": 2019,
      "interior_sq_m": 87.69973754882812,
      "property_id": "12c3175c0bf7d5f8",
      "property_type": "Apartment",
      "zoning": "M-CG"
    },
    {
      "address": "204 630 10 Street NW",
      "construction_year": 2001,
      "interior_sq_m": 87.69973754882812,
      "property_id": "1303c1bbf8ece15a",
      "property_type": "Apartment",
      "zoning": "M-C2"
    },
    {
      "address": "105 1162 Memorial Drive NW",
      "construction_year": 2016,
      "interior_sq_m": 94.01708984375,
      "property_id": "130e24a02b7b8e23",
      "property_type": "Commercial",
      "zoning": "M-CG"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 88
  },
  "price_quote": false,
  "result_total": 2198,
  "time_ms": 58,
  "ui_info": {
    "city": "Calgary",
    "city_id": "6ec95b53075d062c",
    "city_link": "ca/ab/calgary",
    "city_slug": "calgary",
    "country": "Canada",
    "country_abbreviation": "CA",
    "country_abbreviation_id": "9ace2b6431b7f1be",
    "country_abbreviation_link": "ca",
    "country_slug": "canada",
    "province": "Alberta",
    "province_abbreviation": "AB",
    "province_abbreviation_id": "aae1f05a0f89d2c7",
    "province_abbreviation_link": "ca/ab",
    "province_slug": "alberta"
  }
}

Sunnyside is 2,200 property records - every one typed, dated, sized, and zoned. For corridor work that does not follow community boundaries, the map endpoint takes a coordinate box instead, so a transit corridor or a main street study area can be pulled as drawn.

Zoning is present on about 83 percent of Calgary records, which is worth knowing before you lean on it - real coverage, not complete coverage. The zoning_source field tells you where a value came from.

The type mix nobody has actually counted

Rezoning debates run on assumptions about what a community currently is. The data settles it per address. Sunnyside's 2,200 property records include just 72 typed as houses - the community the argument treats as a single-detached enclave is already overwhelmingly multi-unit, and its most common property type is Apartment:

API request
TypeScript code
const houski_data = async (): Promise<PropertiesResponse> => {

    // You must copy the PropertiesResponse type declarations from the 
    // Houski API documentation to strongly type the response

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('community_eq', 'Sunnyside');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('property_type_eq', 'House');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '25');
    url.searchParams.set('select', 'address,property_type,construction_year,zoning');

    const response = await fetch(url);
    const data = await response.json();

    return data;
}

(async () => {
let data: PropertiesResponse = await houski_data();

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 5.750000476837158,
  "data": [
    {
      "address": "619 1 Avenue NW",
      "construction_year": 1910,
      "property_id": "1467c076e61852c0",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "4804 Memorial Drive",
      "construction_year": 2016,
      "property_id": "1496a2b6c7551712",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "923 5 Street NW",
      "construction_year": 1995,
      "property_id": "15bf2db1fc3327be",
      "property_type": "House",
      "zoning": "R-CG"
    },
    {
      "address": "4747 Memorial Drive",
      "construction_year": 2016,
      "property_id": "1968b65b87dd53d4",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "734 5A Street NW",
      "construction_year": 1920,
      "property_id": "1d02ff415b2a84f6",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "1023 2 Avenue NW",
      "construction_year": 2001,
      "property_id": "1d160bb50e47fa25",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "728 5 Street NW",
      "construction_year": 1912,
      "property_id": "2aa712c590fcbb18",
      "property_type": "House",
      "zoning": "R-CG"
    },
    {
      "address": "534 Memorial Drive NW",
      "construction_year": 1920,
      "property_id": "2d4bd3260dcc1306",
      "property_type": "House",
      "zoning": "R-CG"
    },
    {
      "address": "730 5 Street NW",
      "construction_year": 1912,
      "property_id": "2e2c165f4fa519f2",
      "property_type": "House",
      "zoning": "R-CG"
    },
    {
      "address": "817 4 Avenue NW",
      "construction_year": 1904,
      "property_id": "32d1529fdd74ea00",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "810 3 Avenue NW",
      "construction_year": 1914,
      "property_id": "34029d172f6b340b",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "918 3 Avenue NW",
      "construction_year": 1939,
      "property_id": "4063c6d52a53eb37",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "4752 Memorial Drive",
      "construction_year": 2016,
      "property_id": "40c850f8beca269e",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "626 3 Avenue NW",
      "construction_year": 1971,
      "property_id": "413ef2340867dc99",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "6020 Memorial Drive",
      "construction_year": 2016,
      "property_id": "43055fd4c0d26ba4",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "905 1 Avenue NW",
      "construction_year": 1915,
      "property_id": "4765ddee1273219c",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "1023 1 Avenue NW",
      "construction_year": 1915,
      "property_id": "4eaeb548c07e57a",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "715 4A Street NW",
      "construction_year": 1939,
      "property_id": "511a711e8502bff4",
      "property_type": "House",
      "zoning": "R-CG"
    },
    {
      "address": "939 5 Street NW",
      "construction_year": 2006,
      "property_id": "526cb8920b70a83d",
      "property_type": "House",
      "zoning": "R-CG"
    },
    {
      "address": "914 5A Street NW",
      "construction_year": 1910,
      "property_id": "552303774bfb0f49",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "109 8 Street NW",
      "construction_year": 1920,
      "property_id": "567501085d713cfb",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "710 5A Street NW",
      "construction_year": 1912,
      "property_id": "58c1fc404258f77c",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "903 3 Avenue NW",
      "construction_year": 1910,
      "property_id": "5ab97adcc3ece411",
      "property_type": "House",
      "zoning": "M-CG"
    },
    {
      "address": "512 Memorial Drive NW",
      "construction_year": 2018,
      "property_id": "5c288de19dcb0090",
      "property_type": "House",
      "zoning": "R-CG"
    },
    {
      "address": "920 3 Avenue NW",
      "construction_year": 1912,
      "property_id": "5f046394dc43c064",
      "property_type": "House",
      "zoning": "M-CG"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 3
  },
  "price_quote": false,
  "result_total": 72,
  "time_ms": 61,
  "ui_info": {
    "city": "Calgary",
    "city_id": "6ec95b53075d062c",
    "city_link": "ca/ab/calgary",
    "city_slug": "calgary",
    "country": "Canada",
    "country_abbreviation": "CA",
    "country_abbreviation_id": "9ace2b6431b7f1be",
    "country_abbreviation_link": "ca",
    "country_slug": "canada",
    "province": "Alberta",
    "province_abbreviation": "AB",
    "province_abbreviation_id": "aae1f05a0f89d2c7",
    "province_abbreviation_link": "ca/ab",
    "province_slug": "alberta"
  }
}

Run the same count city-wide and Calgary splits into 430,975 houses and 102,928 apartments, with the remainder spread across the other types. The point is not the city-wide number, which everyone roughly knows. The point is that the same query answers at whatever geography the debate is happening in, the afternoon someone asks.

The demographics arrive on the same row

Every property record carries the demographic profile of its surrounding area - income, age structure, household types, languages, commute modes - so "old housing stock" and "who lives around it" are one query rather than a geographic information system join between two datasets that never quite line up. The details are in our post on demographic data for every Canadian address.

What to be straight with council about

This is not the census, and it does not replace it. Demographics describe areas, not households. Property fields are a mix of documented values and estimates, and fields carrying a source flag, like construction_year_source and zoning_source, tell you which is which per record. For a program targeting thousands of addresses, estimates are exactly the right tool. For a legal determination about one address, check the source.

Counts reflect records, not ground truth. The pre-1970 count is as good as the underlying records, which for construction year is very good, but no dataset sees everything. Say so in the methods section - it will still be the strongest data slide in the deck.

Whole-city extracts

Planners mostly do not want an API. They want the file. The datasets page has planning-shaped cuts including Affordable housing needs assessment, High population density, and Infrastructure planning, updated daily. For a full municipal extract shaped to your geographic information system - your ward boundaries, your field list, your delivery schedule - our data team builds custom datasets. Talk to us, and see bulk datasets versus the API for which form fits which project.

Getting started

  1. Sign up for API access
  2. Pick one live question - stock age in one community is a good first pull
  3. Run it with the queries above, swapping in your city and community
  4. Sanity-check against what you know before it goes in front of council
  5. Scale to the full study area through the map endpoint or a dataset extract

Most fields cost a tenth of a cent per field per property, so community-scale pulls cost a few dollars and even whole-city inventories land well under a consultant's first invoice. Details on the pricing page.


The questions were never too expensive. The data collection was, and it is already done. Explore the API or browse the datasets.