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 (a city the size of Calgary is hundreds of thousands of 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:
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);
})();
{
"cache_hit": false,
"cost_cents": 1.0,
"data": [
{
"aggregation": "median",
"field": "construction_year",
"value": "1998"
}
],
"error": "",
"price_quote": false,
"time_ms": 19
}
The answer often surprises people who think of their city as an old-core city, because in a fast-growing city half the stock can be 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:
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);
})();
{
"cache_hit": false,
"cost_cents": 8.25,
"data": [
{
"address": "24 Hoover Place SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 95.03981,
"property_id": "100a43bcbefcc557",
"zoning": "R-C1 & R-CG"
},
{
"address": "123 Haverhill Road SW",
"community": "Haysboro",
"construction_year": 1959,
"interior_sq_m": 107.210106,
"property_id": "1013d710d1e58e07",
"zoning": "H-GO & R-C1"
},
{
"address": "14 Harmon Place SW",
"community": "Haysboro",
"construction_year": 1967,
"interior_sq_m": 98.709076,
"property_id": "10645b1e28bd203a",
"zoning": "H-GO & R-C1"
},
{
"address": "63 Hogarth Crescent SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 123.931625,
"property_id": "10cc46ed3576b5c4",
"zoning": "R-C1 & R-CG"
},
{
"address": "48 Haddock Road SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 95.317726,
"property_id": "115db63d076f3a98",
"zoning": "R-C1 & R-CG"
},
{
"address": "35 Hanover Road SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 99.03464,
"property_id": "11aa7ac7d42d4e18",
"zoning": "R-C1 & R-CG"
},
{
"address": "320 Haddon Road SW",
"community": "Haysboro",
"construction_year": 1965,
"interior_sq_m": 95.68933,
"property_id": "11f946c45fa1c1e7",
"zoning": "R-C1 & R-CG"
},
{
"address": "36 Hazelwood Crescent SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 85.00558,
"property_id": "122b2b7eb91fc179",
"zoning": "R-C1 & R-CG"
},
{
"address": "74 Hallbrook Drive SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 121.51717,
"property_id": "125d99dde2dfb6e9",
"zoning": "R-C1 & R-CG"
},
{
"address": "59 Hogarth Crescent SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 98.1048,
"property_id": "1276368deae3eaba",
"zoning": "R-C1 & R-CG"
},
{
"address": "40 Hooke Road SW",
"community": "Haysboro",
"construction_year": 1959,
"interior_sq_m": 94.94611,
"property_id": "12addf6bfc0960f9",
"zoning": "R-C1 & R-CG"
},
{
"address": "98 Hallbrook Drive SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 106.18817,
"property_id": "12d36de7d1aa2266",
"zoning": "R-C1 & R-CG"
},
{
"address": "19 Hyslop Drive SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 97.82609,
"property_id": "1311cde6658c8926",
"zoning": "H-GO & R-C1"
},
{
"address": "39 Hillary Crescent SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 102.1925,
"property_id": "1368dd9c4aa64d7c",
"zoning": "R-C1 & R-CG"
},
{
"address": "48 Hooke Road SW",
"community": "Haysboro",
"construction_year": 1959,
"interior_sq_m": 94.017876,
"property_id": "1378e958238056cd",
"zoning": "R-C1 & R-CG"
},
{
"address": "39 Hillgrove Drive SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 103.401085,
"property_id": "13ab05cd57dc55b6",
"zoning": "R-C1 & R-CG"
},
{
"address": "61 Havenhurst Crescent SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 97.54738,
"property_id": "13daa591cdb6e877",
"zoning": "R-C1 & R-CG"
},
{
"address": "87 Hallbrook Drive SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 120.86635,
"property_id": "13de3f1b7b22d70",
"zoning": "R-C1 & R-CG"
},
{
"address": "99 Hanover Road SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 102.37872,
"property_id": "13f643f0af1ba2a2",
"zoning": "R-C1 & R-CG"
},
{
"address": "24 Hanover Road SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 102.37872,
"property_id": "143a867d591a79db",
"zoning": "R-C1 & R-CG"
},
{
"address": "38 Hutton Place SW",
"community": "Haysboro",
"construction_year": 1965,
"interior_sq_m": 104.56237,
"property_id": "152d4e561c7f7870",
"zoning": "R-C1 & R-CG"
},
{
"address": "24 Hillgreen Place SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 116.1288,
"property_id": "153637089366e868",
"zoning": "R-C1 & R-CG"
},
{
"address": "23 Hallbrook Drive SW",
"community": "Haysboro",
"construction_year": 1960,
"interior_sq_m": 126.43999,
"property_id": "15922129ea50e7d3",
"zoning": "R-C1 & R-CG"
},
{
"address": "38 Hillgrove Drive SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 98.941734,
"property_id": "15e741b599c33a2e",
"zoning": "R-C1 & R-CG"
},
{
"address": "53 Hollyburn Road SW",
"community": "Haysboro",
"construction_year": 1958,
"interior_sq_m": 101.07767,
"property_id": "160c51df6a226bba",
"zoning": "R-C1 & R-CG"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 2135
},
"price_quote": false,
"result_total": 53359,
"time_ms": 30,
"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"
}
}
Each house comes back 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:
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', '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);
})();
{
"cache_hit": false,
"cost_cents": 8.25,
"data": [
{
"address": "201 934 2 Avenue NW",
"construction_year": 1969,
"interior_sq_m": 126.16233,
"property_id": "102368d69b982464",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "2 923 1 Avenue NW",
"construction_year": 2022,
"interior_sq_m": 193.60832,
"property_id": "103ac12d670d08ae",
"property_type": "Townhouse",
"zoning": "M-CG"
},
{
"address": "201 807 4 Avenue NW",
"construction_year": 1968,
"interior_sq_m": 162.25449,
"property_id": "10570f64c30df36c",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "403 723 3 Avenue NW",
"construction_year": 1970,
"interior_sq_m": 112.87625,
"property_id": "106d2a8703550895",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "7 320 9 Street NW",
"construction_year": 2013,
"interior_sq_m": 130.06372,
"property_id": "107331e94dcb8280",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "204 816 9A Street NW",
"construction_year": 1966,
"interior_sq_m": 61.40891,
"property_id": "10905775846285c0",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "905 4A Street NW",
"construction_year": 1982,
"interior_sq_m": 165.64612,
"property_id": "10911b1a4512b3a7",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "7 928 3 Avenue NW",
"construction_year": 1977,
"interior_sq_m": 73.3005,
"property_id": "10aa49472a1b5c0a",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "301 923 3 Avenue NW",
"construction_year": 2011,
"interior_sq_m": 112.87625,
"property_id": "10abff46ab367c81",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "13 722 5A Street NW",
"construction_year": 1912,
"interior_sq_m": 143.5352,
"property_id": "10c62d1055084030",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "103 901 4 Avenue NW",
"construction_year": 1968,
"interior_sq_m": 162.25449,
"property_id": "10e106ac947cf1a9",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "107 709 2 Avenue NW",
"construction_year": 2014,
"interior_sq_m": 126.16233,
"property_id": "113722b8feb80683",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "907 4A Street NW",
"construction_year": 1982,
"interior_sq_m": 165.64612,
"property_id": "1167a3a84f8be3ac",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "1010 1 Avenue NW",
"construction_year": 1910,
"interior_sq_m": 144.92813,
"property_id": "116840ad9cae73b8",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "5 708 Memorial Drive NW",
"construction_year": 2016,
"interior_sq_m": 104.05141,
"property_id": "116d8726710d0b9a",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "627 2 Avenue NW",
"construction_year": 1912,
"interior_sq_m": 88.442955,
"property_id": "11b2753da0c5ee7c",
"property_type": "House",
"zoning": "M-CG"
},
{
"address": "424 10 Street NW",
"construction_year": 1973,
"interior_sq_m": 77.155655,
"property_id": "11fbbc223a45c802",
"property_type": "Commercial",
"zoning": "C-COR1"
},
{
"address": "412 823 5 Avenue NW",
"construction_year": 2013,
"interior_sq_m": 68.09793,
"property_id": "120b0d3558b3e9da",
"property_type": "Apartment",
"zoning": "DC"
},
{
"address": "104 728 3 Avenue NW",
"construction_year": 1969,
"interior_sq_m": 55.183945,
"property_id": "122ce462916da773",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "929 1 Avenue NW",
"construction_year": 2021,
"interior_sq_m": 87.97918,
"property_id": "12462ce8abad3c7a",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "607 327 9A Street NW",
"construction_year": 2018,
"interior_sq_m": 61.40891,
"property_id": "1253ea52d12d2f5f",
"property_type": "Apartment",
"zoning": "DC"
},
{
"address": "104 824 4 Avenue NW",
"construction_year": 1968,
"interior_sq_m": 45.89372,
"property_id": "1267d5a56073569d",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "14 820 9A Street NW",
"construction_year": 2018,
"interior_sq_m": 61.40891,
"property_id": "126ab29ae0808fbb",
"property_type": "Apartment",
"zoning": "M-CG"
},
{
"address": "504 424 10 Street NW",
"construction_year": 2014,
"interior_sq_m": 77.155655,
"property_id": "127693702554a82a",
"property_type": "Apartment",
"zoning": "C-COR1"
},
{
"address": "401 602 2 Avenue NW",
"construction_year": 2014,
"interior_sq_m": 126.16233,
"property_id": "127d8bd2948e9395",
"property_type": "Apartment",
"zoning": "M-CG"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 118
},
"price_quote": false,
"result_total": 2943,
"time_ms": 12,
"ui_info": {
"city": "Calgary",
"city_id": "6ec95b53075d062c",
"city_link": "ca/ab/calgary",
"city_slug": "calgary",
"community": "Sunnyside",
"community_id": "58282e09399eb6c7",
"community_link": "ca/ab/calgary/sunnyside",
"community_slug": "sunnyside",
"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"
}
}
Every record in the community comes back typed, dated, sized, and zoned where those values are known. For corridor work that does not follow community boundaries, the map endpoint takes a coordinate box or a polygon instead, so a transit corridor or a main street study area can be pulled as drawn.
Zoning covers most records but not all of them, which is worth knowing before you lean on it: real coverage, not complete coverage. Measure it for your city with a count aggregation, and the zoning_source field tells you where each 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. A community the argument treats as a single-detached enclave can turn out to be mostly multi-unit already, and one query shows how many of its records are houses:
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', '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);
})();
{
"cache_hit": false,
"cost_cents": 5.7500005,
"data": [
{
"address": "905 4A Street NW",
"construction_year": 1982,
"property_id": "10911b1a4512b3a7",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "907 4A Street NW",
"construction_year": 1982,
"property_id": "1167a3a84f8be3ac",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "627 2 Avenue NW",
"construction_year": 1912,
"property_id": "11b2753da0c5ee7c",
"property_type": "House",
"zoning": "M-CG"
},
{
"address": "305 416 7 Street NW",
"construction_year": 1969,
"property_id": "12ac5b0dfbfc5a02",
"property_type": "House",
"zoning": "M-CG"
},
{
"address": "619 1 Avenue NW",
"construction_year": 1910,
"property_id": "1467c076e61852c0",
"property_type": "House",
"zoning": "M-CG"
},
{
"address": "923 5 Street NW",
"construction_year": 1995,
"property_id": "15bf2db1fc3327be",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "705 4A Street NW",
"construction_year": 1957,
"property_id": "19e45d9192681fbb",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "827 3 Street NW",
"construction_year": 1910,
"property_id": "19f9b3e9ec9f80f9",
"property_type": "House",
"zoning": "M-CG"
},
{
"address": "726 5 Street NW",
"construction_year": 1986,
"property_id": "1c7f42186386331a",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "728 4A Street NW",
"construction_year": 1912,
"property_id": "1cae8ae5875f313",
"property_type": "House",
"zoning": "R-C2 & R-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": "901 5 Street NW",
"construction_year": 1990,
"property_id": "1d5239814151933e",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "725 4A Street NW",
"construction_year": 1912,
"property_id": "1d9f3cf741b9025a",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "737 5 Street NW",
"construction_year": 1949,
"property_id": "1df4cbcb2e744c17",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "924 5 Street NW",
"construction_year": 1994,
"property_id": "213d2ce22ed3c593",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "908 4A Street NW",
"construction_year": 1910,
"property_id": "216a0e7a1b3201f4",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "912 5 Street NW",
"construction_year": 2002,
"property_id": "22659104ce175f7a",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "934 5 Street NW",
"construction_year": 1994,
"property_id": "22b5dc0e222d5d2d",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "718 4A Street NW",
"construction_year": 1911,
"property_id": "23e9d35e45a640c7",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "735 4A Street NW",
"construction_year": 1990,
"property_id": "251ad64290caed96",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "743 4A Street NW",
"construction_year": 1986,
"property_id": "25387c9ff77074",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "719 5 Street NW",
"construction_year": 1994,
"property_id": "282f67bb1e9171a3",
"property_type": "House",
"zoning": "R-C2 & R-CG"
},
{
"address": "806 Memorial Drive NW",
"construction_year": 1945,
"property_id": "294d79409e20cb17",
"property_type": "House",
"zoning": "M-CG"
},
{
"address": "728 5 Street NW",
"construction_year": 1912,
"property_id": "2aa712c590fcbb18",
"property_type": "House",
"zoning": "R-C2 & R-CG"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 13
},
"price_quote": false,
"result_total": 321,
"time_ms": 12,
"ui_info": {
"city": "Calgary",
"city_id": "6ec95b53075d062c",
"city_link": "ca/ab/calgary",
"city_slug": "calgary",
"community": "Sunnyside",
"community_id": "58282e09399eb6c7",
"community_link": "ca/ab/calgary/sunnyside",
"community_slug": "sunnyside",
"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 you get the split between houses, apartments and the other types for the whole city. 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 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, and 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 Housing affordability stress, High population density, and Aging housing stock, 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
- Sign up for API access
- Pick one live question. Stock age in one community is a good first pull
- Run it with the queries above, swapping in your city and community
- Sanity-check against what you know before it goes in front of council
- 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.
