!

Roofing contractors: find the streets most likely to need a roof, not the houses you can prove need one

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

Let us be straight with you about what this data is, because it changes how you should use it.

Houski returns a field called roof_material_install_year on houses across Canada. It is an estimate. Nobody climbed onto that roof and checked. Nobody pulled a permit for every shingle job in the country, because most shingle jobs never generate a permit. The field is modelled, and building age carries a lot of the weight in that model.

So roof_material_install_year of 2009 does not mean the roof went on in 2009. It means that on the evidence available, that is the best estimate for that house, and the real answer might be 2014 because the owner replaced it after a hailstorm and told nobody.

This sounds like a caveat. It is actually the whole product, and here is why.

You are not buying certainty, you are buying a mailing list

A roofing contractor does not need to know that 123 Main Street needs a roof. A roofing contractor needs to know which 5,000 addresses to send flyers to, out of the 300,000 in the city, so that the response rate justifies the postage.

That is a completely different question, and it is a question an estimate answers well.

If you mail a street where the estimated roof age is at the top of the range, some of those roofs were done last year. Fine. The rest are original, the owners have been thinking about it every spring, and your flyer lands on the right doormat at the right moment. You do not need to be right about every house. You need to be right about the neighbourhood, often enough to beat blanket mail.

Blanket mail to the whole city is what you are competing against, and it is a low bar. Half those addresses are apartments, condos, and townhouses with a strata that will never call you. Getting to houses only, in the band where roofs actually fail, is most of the lift available.

The one thing you have to know about this field

The estimate assumes roofs get replaced on a cycle. It does not report roofs older than that cycle, because a roof that old has almost certainly been redone already, permit or no permit.

The practical effect: the field bottoms out. In Calgary today, the oldest estimated roof install year you will get back is 2009. Not because no roof in Calgary predates 2009, but because the model will not claim a roof is older than about 17 years.

So 2009 is not a year. It is a bucket that means "17 or more years, we cannot tell you which."

This matters because the obvious filter is a trap. You cannot ask for roofs over 20 years old. That query returns essentially nothing, and if you had written it without reading this you would have concluded we have no roof data. What you want is everything at the floor:

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('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('roof_material_install_year_lte', '2009');
    url.searchParams.set('select', 'address,postal_code,community,roof_material,roof_material_install_year,construction_year,interior_sq_m,estimate_sale_price');

    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": 13.499999046325684,
  "data": [
    {
      "address": "11 Chaparral Valley Garden SE",
      "community": "Chaparral",
      "construction_year": 2009,
      "estimate_sale_price": 497503,
      "interior_sq_m": 174.7027130126953,
      "postal_code": "T2X0N2",
      "property_id": "100a49f6a821f222",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "422 Mount Sparrowhawk Place SE",
      "community": "McKenzie Lake",
      "construction_year": 1992,
      "estimate_sale_price": 1035065,
      "interior_sq_m": 193.42251586914065,
      "postal_code": "T2Z2G9",
      "property_id": "100c0a0fa63769e1",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "434 Cranston Drive SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 672742,
      "interior_sq_m": 158.90933227539062,
      "postal_code": "T3M0C1",
      "property_id": "1011bbe15bf9928f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "229 Evansdale Way NW",
      "community": "Evanston",
      "construction_year": 2009,
      "estimate_sale_price": 552958,
      "interior_sq_m": 147.76104736328125,
      "postal_code": "T3P0C3",
      "property_id": "1016419a8159eb02",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "60 Citadel Pass Crescent NW",
      "community": "Citadel",
      "construction_year": 1992,
      "estimate_sale_price": 603379,
      "interior_sq_m": 116.22073364257812,
      "postal_code": "T3G3V2",
      "property_id": "1016981fe984612a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "138 Silverado Plains Circle SW",
      "community": "Silverado",
      "construction_year": 2009,
      "estimate_sale_price": 626249,
      "interior_sq_m": 141.30435180664062,
      "postal_code": "T2X0G5",
      "property_id": "101a22ee837c35",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "224 Queensland Road SE",
      "community": "Queensland",
      "construction_year": 1974,
      "estimate_sale_price": 578854,
      "interior_sq_m": 118.91490173339844,
      "postal_code": "T2J3S3",
      "property_id": "101f03d9f639d8da",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "5716 Dalcastle Crescent NW",
      "community": "Dalhousie",
      "construction_year": 1974,
      "estimate_sale_price": 753679,
      "interior_sq_m": 153.61448669433594,
      "postal_code": "T3A1S4",
      "property_id": "1026ccb6c50416c6",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "402 Martindale Drive NE",
      "community": "Martindale",
      "construction_year": 2009,
      "estimate_sale_price": 556461,
      "interior_sq_m": 103.0286102294922,
      "postal_code": "T3J0H8",
      "property_id": "102f55d4926777b6",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "34 Rivercrest Circle SE",
      "community": "Riverbend",
      "construction_year": 1992,
      "estimate_sale_price": 542201,
      "interior_sq_m": 106.28018951416016,
      "postal_code": "T2C4G3",
      "property_id": "1030985b1d6c42d4",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4832 26 Avenue NE",
      "community": "Rundle",
      "construction_year": 1974,
      "estimate_sale_price": 581464,
      "interior_sq_m": 110.83240509033205,
      "postal_code": "T1Y1C9",
      "property_id": "103556fd1b541339",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "134 Cranarch Close SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 783949,
      "interior_sq_m": 200.3901824951172,
      "postal_code": "T3M0T9",
      "property_id": "103561da4ba52d41",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "108 Harvest Glen Rise NE",
      "community": "Harvest Hills",
      "construction_year": 1992,
      "estimate_sale_price": 524900,
      "interior_sq_m": 111.9007797241211,
      "postal_code": "T3K4C1",
      "property_id": "103ac433652839e2",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "464 Cedarpark Drive SW",
      "community": "Cedarbrae",
      "construction_year": 1974,
      "estimate_sale_price": 580396,
      "interior_sq_m": 107.1163101196289,
      "postal_code": "T2W2J7",
      "property_id": "103bb28e921eb0b7",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2622 24A Street SW",
      "community": "Richmond",
      "construction_year": 1992,
      "estimate_sale_price": 728495,
      "interior_sq_m": 142.0475616455078,
      "postal_code": "T3E1W3",
      "property_id": "1040f604189b7ca5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4 White Oak Crescent SW",
      "community": "Wildwood",
      "construction_year": 1957,
      "estimate_sale_price": 1025239,
      "interior_sq_m": 186.1761474609375,
      "postal_code": "T3C3J6",
      "property_id": "1045b6f48b718aa9",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "111 Pump Hill Place SW",
      "community": "Pump Hill",
      "construction_year": 1974,
      "estimate_sale_price": 984284,
      "interior_sq_m": 200.71534729003903,
      "postal_code": "T2V4C6",
      "property_id": "10469dea3c945bdc",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "42 Edenwold Gr NW",
      "community": "Edgemont",
      "construction_year": 1992,
      "estimate_sale_price": 567087,
      "interior_sq_m": 194.44444274902344,
      "postal_code": "T3A5H5",
      "property_id": "1046c6e060b24594",
      "roof_material": "Concrete",
      "roof_material_install_year": 2009
    },
    {
      "address": "114 Kincora Glen Green NW",
      "community": "Beltline",
      "construction_year": 2009,
      "estimate_sale_price": 688886,
      "interior_sq_m": 215.8119659423828,
      "postal_code": "T3R0C1",
      "property_id": "10498df38ae0f35b",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "36 Riverview Mews SE",
      "community": "Riverbend",
      "construction_year": 1992,
      "estimate_sale_price": 777909,
      "interior_sq_m": 139.3533935546875,
      "postal_code": "T2C3Z8",
      "property_id": "104bddb1f29468b7",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "151 Valley Ridge Green NW",
      "community": "Beltline",
      "construction_year": 1992,
      "estimate_sale_price": 791631,
      "interior_sq_m": 192.58639526367188,
      "postal_code": "T3B5L6",
      "property_id": "104dda62119eec5b",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "172 Cranleigh Terrace SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 1885231,
      "interior_sq_m": 239.3162384033203,
      "postal_code": "T3M0G4",
      "property_id": "104df3d8c88517c0",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "6211 72 Street NW",
      "community": "Silver Springs",
      "construction_year": 1974,
      "estimate_sale_price": 762058,
      "interior_sq_m": 121.46971130371094,
      "postal_code": "T3B3V9",
      "property_id": "104f1ab616d96934",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "12 Del Ray Crescent NE",
      "community": "Monterey Park",
      "construction_year": 1992,
      "estimate_sale_price": 634786,
      "interior_sq_m": 172.05499267578125,
      "postal_code": "T1Y6V8",
      "property_id": "104f8cdd848d6b1e",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2319 51 Street NE",
      "community": "Rundle",
      "construction_year": 1974,
      "estimate_sale_price": 583869,
      "interior_sq_m": 102.74990844726562,
      "postal_code": "T1Y1C2",
      "property_id": "1051dec0db142497",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 652
  },
  "price_quote": false,
  "result_total": 16300,
  "time_ms": 64,
  "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 16,412 houses out of Calgary's 430,975. Every one of them comes back reading exactly 2009, because they are all pinned at the floor. That is your oldest-roof tier and it is about 4 percent of the city, which is a mailing list rather than a fantasy.

Asphalt shingles generally last somewhere in the 20 to 25 year range in Canadian conditions, less if the hail gets them. So a roof sitting at the 17-plus floor is squarely in the window where homeowners start phoning people.

Breaking the tie inside the bucket

Sixteen thousand addresses all reading 2009 is more than most contractors can mail at once, and the field itself cannot rank them. But construction_year can.

Inside that bucket, an older house is likelier to have a genuinely old roof, because it has had more chances to need one and the original is further away in time.

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', '1990');
    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('roof_material_install_year_lte', '2009');
    url.searchParams.set('select', 'address,postal_code,community,roof_material,roof_material_install_year,construction_year,estimate_sale_price');

    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": 10.999999046325684,
  "data": [
    {
      "address": "224 Queensland Road SE",
      "community": "Queensland",
      "construction_year": 1974,
      "estimate_sale_price": 578854,
      "postal_code": "T2J3S3",
      "property_id": "101f03d9f639d8da",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "5716 Dalcastle Crescent NW",
      "community": "Dalhousie",
      "construction_year": 1974,
      "estimate_sale_price": 753679,
      "postal_code": "T3A1S4",
      "property_id": "1026ccb6c50416c6",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4832 26 Avenue NE",
      "community": "Rundle",
      "construction_year": 1974,
      "estimate_sale_price": 581464,
      "postal_code": "T1Y1C9",
      "property_id": "103556fd1b541339",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "464 Cedarpark Drive SW",
      "community": "Cedarbrae",
      "construction_year": 1974,
      "estimate_sale_price": 580396,
      "postal_code": "T2W2J7",
      "property_id": "103bb28e921eb0b7",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4 White Oak Crescent SW",
      "community": "Wildwood",
      "construction_year": 1957,
      "estimate_sale_price": 1025239,
      "postal_code": "T3C3J6",
      "property_id": "1045b6f48b718aa9",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "111 Pump Hill Place SW",
      "community": "Pump Hill",
      "construction_year": 1974,
      "estimate_sale_price": 984284,
      "postal_code": "T2V4C6",
      "property_id": "10469dea3c945bdc",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "6211 72 Street NW",
      "community": "Silver Springs",
      "construction_year": 1974,
      "estimate_sale_price": 762058,
      "postal_code": "T3B3V9",
      "property_id": "104f1ab616d96934",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2319 51 Street NE",
      "community": "Rundle",
      "construction_year": 1974,
      "estimate_sale_price": 583869,
      "postal_code": "T1Y1C2",
      "property_id": "1051dec0db142497",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "207 Marpole Bay NE",
      "community": "Marlborough",
      "construction_year": 1974,
      "estimate_sale_price": 530771,
      "postal_code": "T2A4W9",
      "property_id": "10674cffda46c68e",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "6508 Silver Springs Crescent NW",
      "community": "Silver Springs",
      "construction_year": 1974,
      "estimate_sale_price": 780142,
      "postal_code": "T3B4C6",
      "property_id": "107a1610be9a00b6",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "39 Windermere Road SW",
      "community": "Wildwood",
      "construction_year": 1957,
      "estimate_sale_price": 870148,
      "postal_code": "T3C3K4",
      "property_id": "109676bd7b8f6ac8",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4019 14A Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 2387963,
      "postal_code": "T2T3Y3",
      "property_id": "1098a1621243024",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2237 27 Street SE",
      "community": "Southview",
      "construction_year": 1957,
      "estimate_sale_price": 540850,
      "postal_code": "T2B0P9",
      "property_id": "109ca166ab8c94c1",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "5548 Dalhart Hill NW",
      "community": "Dalhousie",
      "construction_year": 1974,
      "estimate_sale_price": 882050,
      "postal_code": "T3A1S9",
      "property_id": "10a37cce35d88da",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "223 Parkside Gr SE",
      "community": "Parkland",
      "construction_year": 1974,
      "estimate_sale_price": 945165,
      "postal_code": "T2J7G6",
      "property_id": "10abefcdd3d48078",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "456 Cedarille Crescent SW",
      "community": "Cedarbrae",
      "construction_year": 1974,
      "estimate_sale_price": 695459,
      "postal_code": "T2W2H7",
      "property_id": "10c294c40971d87a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "239 Madeira Close NE",
      "community": "Marlborough Park",
      "construction_year": 1974,
      "estimate_sale_price": 571102,
      "postal_code": "T2A4N7",
      "property_id": "10c9bb9bc7f8c9ad",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "191 Manora Hill NE",
      "community": "Marlborough Park",
      "construction_year": 1974,
      "estimate_sale_price": 548178,
      "postal_code": "T2A4R8",
      "property_id": "10cc62ffa7763eaa",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "801 6223 31 Avenue NW",
      "community": "Bowness",
      "construction_year": 1974,
      "estimate_sale_price": 473124,
      "postal_code": "T3B3X2",
      "property_id": "10db546e27dc1ea6",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2426 35 Street SE",
      "community": "Southview",
      "construction_year": 1957,
      "estimate_sale_price": 595577,
      "postal_code": "T2B0X3",
      "property_id": "10e42b7032a5b8c5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4120 15 Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1780042,
      "postal_code": "T2T4A9",
      "property_id": "1104db85d69cd5d0",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "5628 Dalcastle Hill NW",
      "community": "Dalhousie",
      "construction_year": 1974,
      "estimate_sale_price": 726443,
      "postal_code": "T3A2A3",
      "property_id": "111aa7908e391a46",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "3319 34 Avenue SW",
      "community": "Rutland Park",
      "construction_year": 1957,
      "estimate_sale_price": 1243504,
      "postal_code": "T3E0Z3",
      "property_id": "112496f3f4a5677e",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1501 38 Street SE",
      "community": "Forest Lawn",
      "construction_year": 1957,
      "estimate_sale_price": 567234,
      "postal_code": "T2A1G7",
      "property_id": "11410ed195b62f25",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "415 23 Avenue NW",
      "community": "Mount Pleasant",
      "construction_year": 1974,
      "estimate_sale_price": 1431465,
      "postal_code": "T2M1S5",
      "property_id": "1148316424d99293",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 269
  },
  "price_quote": false,
  "result_total": 6722,
  "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 takes 16,412 down to 6,684 - houses at the roof-age floor that were also built before 1990. It is the highest-probability slice available from this data, and it is a realistic single-campaign volume.

Layering in who can pay for it

An old roof on its own is half a lead. The other half is whether the household can write the cheque without a six-month deliberation. The demographic fields sit on the same row as the property, so you can ask both questions at once.

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('country_abbreviation', 'ca');
    url.searchParams.set('demographic_income_median_after_tax_gte', '70000');
    url.searchParams.set('property_type_eq', 'House');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '25');
    url.searchParams.set('roof_material_install_year_lt', '2010');
    url.searchParams.set('select', 'address,postal_code,community,roof_material,roof_material_install_year,estimate_sale_price,demographic_income_median_after_tax');

    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": 10.999999046325684,
  "data": [
    {
      "address": "2622 24A Street SW",
      "community": "Richmond",
      "demographic_income_median_after_tax": 71680,
      "estimate_sale_price": 728495,
      "postal_code": "T3E1W3",
      "property_id": "1040f604189b7ca5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4 White Oak Crescent SW",
      "community": "Wildwood",
      "demographic_income_median_after_tax": 75264,
      "estimate_sale_price": 1025239,
      "postal_code": "T3C3J6",
      "property_id": "1045b6f48b718aa9",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2419 1 Avenue NW",
      "community": "West Hillhurst",
      "demographic_income_median_after_tax": 70656,
      "estimate_sale_price": 1079156,
      "postal_code": "T2N0C1",
      "property_id": "106ae97685016ad5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "62 Tuscany Estates Point NW",
      "community": "Tuscany",
      "demographic_income_median_after_tax": 89600,
      "estimate_sale_price": 1206194,
      "postal_code": "T3L0C3",
      "property_id": "108dc03d96458021",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4019 14A Street SW",
      "community": "Altadore",
      "demographic_income_median_after_tax": 90240,
      "estimate_sale_price": 2387963,
      "postal_code": "T2T3Y3",
      "property_id": "1098a1621243024",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "33 Mahogany Terrace SE",
      "community": "Mahogany",
      "demographic_income_median_after_tax": 72192,
      "estimate_sale_price": 820983,
      "postal_code": "T3M0R5",
      "property_id": "10d2f9f1d0b69cbe",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "185 Mahogany Terrace SE",
      "community": "Mahogany",
      "demographic_income_median_after_tax": 72192,
      "estimate_sale_price": 752564,
      "postal_code": "T3M0T6",
      "property_id": "10f25400c752fc75",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4120 15 Street SW",
      "community": "Altadore",
      "demographic_income_median_after_tax": 90240,
      "estimate_sale_price": 1780042,
      "postal_code": "T2T4A9",
      "property_id": "1104db85d69cd5d0",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "81 Auburn Glen Drive SE",
      "community": "Auburn Bay",
      "demographic_income_median_after_tax": 71680,
      "estimate_sale_price": 782257,
      "postal_code": "T3M0P9",
      "property_id": "1113c1a49dca5a15",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "76 Quarry Landing SE",
      "community": "Douglasdale-Glen",
      "demographic_income_median_after_tax": 71168,
      "estimate_sale_price": 915656,
      "postal_code": "T2C5E4",
      "property_id": "1114fb32bb5c6fa6",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "55 Wimbledon Drive SW",
      "community": "Wildwood",
      "demographic_income_median_after_tax": 75264,
      "estimate_sale_price": 943620,
      "postal_code": "T3C3J5",
      "property_id": "115377744b459939",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2101 7 Avenue NW",
      "community": "West Hillhurst",
      "demographic_income_median_after_tax": 71680,
      "estimate_sale_price": 848385,
      "postal_code": "T2N0Z8",
      "property_id": "122d9b2b184a2d3d",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "5019 14A Street SW",
      "community": "Altadore",
      "demographic_income_median_after_tax": 90240,
      "estimate_sale_price": 1032076,
      "postal_code": "T2T3Y5",
      "property_id": "129a30636aa6d0c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "13 West Coach Place SW",
      "community": "West Springs",
      "demographic_income_median_after_tax": 71680,
      "estimate_sale_price": 817209,
      "postal_code": "T3H0M7",
      "property_id": "12e55cd83675412f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "224 Lake Mead Road SE",
      "community": "Lake Bonavista",
      "demographic_income_median_after_tax": 71168,
      "estimate_sale_price": 1508245,
      "postal_code": "T2J4A4",
      "property_id": "134b2b686a809bbe",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "43 Auburn Sound Manor SE",
      "community": "Auburn Bay",
      "demographic_income_median_after_tax": 75776,
      "estimate_sale_price": 1135117,
      "postal_code": "T3M0G5",
      "property_id": "1354e58432d716d4",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "120 Wentworth Lane SW",
      "community": "West Springs",
      "demographic_income_median_after_tax": 71680,
      "estimate_sale_price": 2146648,
      "postal_code": "T3H0E1",
      "property_id": "147455245fd96c5f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "228 Auburn Glen Manor SE",
      "community": "Auburn Bay",
      "demographic_income_median_after_tax": 71680,
      "estimate_sale_price": 791949,
      "postal_code": "T3M0L2",
      "property_id": "14b66d67de85f492",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "84 Auburn Sound Manor SE",
      "community": "Auburn Bay",
      "demographic_income_median_after_tax": 75776,
      "estimate_sale_price": 1170431,
      "postal_code": "T3M0G6",
      "property_id": "14f6bb34ef58ea31",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "440 129 Avenue SE",
      "community": "Lake Bonavista",
      "demographic_income_median_after_tax": 71168,
      "estimate_sale_price": 1046108,
      "postal_code": "T2J4A9",
      "property_id": "1507e641721013ab",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2420 1 Avenue NW",
      "community": "West Hillhurst",
      "demographic_income_median_after_tax": 70656,
      "estimate_sale_price": 923836,
      "postal_code": "T2N0B9",
      "property_id": "15094917a68ac8a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "108 Wentworth Hill SW",
      "community": "West Springs",
      "demographic_income_median_after_tax": 71680,
      "estimate_sale_price": 1256031,
      "postal_code": "T3H0N1",
      "property_id": "15263d791cab6ec",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "148 Bay View Drive SW",
      "community": "Bayview",
      "demographic_income_median_after_tax": 86400,
      "estimate_sale_price": 1001939,
      "postal_code": "T2V3N8",
      "property_id": "153015008ab91a3e",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "202 2035 34 Avenue SW",
      "community": "Altadore",
      "demographic_income_median_after_tax": 73728,
      "estimate_sale_price": 427045,
      "postal_code": "T2T2C4",
      "property_id": "154f688e47bd6be1",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "184 Mahogany Terrace SE",
      "community": "Mahogany",
      "demographic_income_median_after_tax": 72192,
      "estimate_sale_price": 781833,
      "postal_code": "T3M0T6",
      "property_id": "15ccff682e824b2a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 44
  },
  "price_quote": false,
  "result_total": 1082,
  "time_ms": 65,
  "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"
  }
}

Note the demographic fields describe the area, not the household. Houski does not know what the people at any given address earn, and neither does anybody else who is being honest. What you get is the income profile of the neighbourhood, which is exactly the resolution a mail campaign works at anyway.

Roof material matters more than people think

roof_material comes back alongside the year, and it changes the pitch entirely. An old asphalt roof is a sale. An old metal roof is not, and mailing that house wastes a flyer and makes you look like you did not do your homework.

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('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('roof_material_install_year_lte', '2009');
    url.searchParams.set('select', 'address,postal_code,roof_material,roof_material_install_year,construction_year');

    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": "11 Chaparral Valley Garden SE",
      "construction_year": 2009,
      "postal_code": "T2X0N2",
      "property_id": "100a49f6a821f222",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "422 Mount Sparrowhawk Place SE",
      "construction_year": 1992,
      "postal_code": "T2Z2G9",
      "property_id": "100c0a0fa63769e1",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "434 Cranston Drive SE",
      "construction_year": 2009,
      "postal_code": "T3M0C1",
      "property_id": "1011bbe15bf9928f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "229 Evansdale Way NW",
      "construction_year": 2009,
      "postal_code": "T3P0C3",
      "property_id": "1016419a8159eb02",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "60 Citadel Pass Crescent NW",
      "construction_year": 1992,
      "postal_code": "T3G3V2",
      "property_id": "1016981fe984612a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "138 Silverado Plains Circle SW",
      "construction_year": 2009,
      "postal_code": "T2X0G5",
      "property_id": "101a22ee837c35",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "224 Queensland Road SE",
      "construction_year": 1974,
      "postal_code": "T2J3S3",
      "property_id": "101f03d9f639d8da",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "5716 Dalcastle Crescent NW",
      "construction_year": 1974,
      "postal_code": "T3A1S4",
      "property_id": "1026ccb6c50416c6",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "402 Martindale Drive NE",
      "construction_year": 2009,
      "postal_code": "T3J0H8",
      "property_id": "102f55d4926777b6",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "34 Rivercrest Circle SE",
      "construction_year": 1992,
      "postal_code": "T2C4G3",
      "property_id": "1030985b1d6c42d4",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4832 26 Avenue NE",
      "construction_year": 1974,
      "postal_code": "T1Y1C9",
      "property_id": "103556fd1b541339",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "134 Cranarch Close SE",
      "construction_year": 2009,
      "postal_code": "T3M0T9",
      "property_id": "103561da4ba52d41",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "108 Harvest Glen Rise NE",
      "construction_year": 1992,
      "postal_code": "T3K4C1",
      "property_id": "103ac433652839e2",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "464 Cedarpark Drive SW",
      "construction_year": 1974,
      "postal_code": "T2W2J7",
      "property_id": "103bb28e921eb0b7",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2622 24A Street SW",
      "construction_year": 1992,
      "postal_code": "T3E1W3",
      "property_id": "1040f604189b7ca5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4 White Oak Crescent SW",
      "construction_year": 1957,
      "postal_code": "T3C3J6",
      "property_id": "1045b6f48b718aa9",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "111 Pump Hill Place SW",
      "construction_year": 1974,
      "postal_code": "T2V4C6",
      "property_id": "10469dea3c945bdc",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "42 Edenwold Gr NW",
      "construction_year": 1992,
      "postal_code": "T3A5H5",
      "property_id": "1046c6e060b24594",
      "roof_material": "Concrete",
      "roof_material_install_year": 2009
    },
    {
      "address": "114 Kincora Glen Green NW",
      "construction_year": 2009,
      "postal_code": "T3R0C1",
      "property_id": "10498df38ae0f35b",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "36 Riverview Mews SE",
      "construction_year": 1992,
      "postal_code": "T2C3Z8",
      "property_id": "104bddb1f29468b7",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "151 Valley Ridge Green NW",
      "construction_year": 1992,
      "postal_code": "T3B5L6",
      "property_id": "104dda62119eec5b",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "172 Cranleigh Terrace SE",
      "construction_year": 2009,
      "postal_code": "T3M0G4",
      "property_id": "104df3d8c88517c0",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "6211 72 Street NW",
      "construction_year": 1974,
      "postal_code": "T3B3V9",
      "property_id": "104f1ab616d96934",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "12 Del Ray Crescent NE",
      "construction_year": 1992,
      "postal_code": "T1Y6V8",
      "property_id": "104f8cdd848d6b1e",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "2319 51 Street NE",
      "construction_year": 1974,
      "postal_code": "T1Y1C2",
      "property_id": "1051dec0db142497",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 652
  },
  "price_quote": false,
  "result_total": 16300,
  "time_ms": 63,
  "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"
  }
}

Group the response by roof_material and drop the materials that outlive your sales cycle.

One field name to not trip over: roof_is_functional is not a condition flag. It means the roof is built to be walked on and used as outdoor living space, like a rooftop deck. It says nothing about whether the roof needs replacing.

Where this data is genuinely weak, and what to do about it

It will not find hail damage. A storm went through last August and took out four streets. Those roofs are two years old and destroyed. This data has no idea. For storm response you want claims intelligence or your own canvassers, not a national estimate.

It will not know about the roof done last summer. No permit, no record, no update. You will mail some houses with new roofs. Budget for it, and consider suppressing addresses your own system has already touched.

It gets sharper on tract housing and blurrier on old mixed streets. A 1998 subdivision where everything went up in one season estimates well, because the whole street shares a history. A street where the houses date from 1910 to 1975 and half have been renovated twice estimates poorly. Weight your campaigns accordingly.

Recent permits are a better signal where they exist. Houski carries building permits for Calgary, Edmonton, Toronto, and Vancouver, reachable by adding expand=permits to a query and filtering on expand_permit_application_date and expand_permit_type. A permit is a fact rather than an estimate. In those four cities, a recent roofing permit should push an address out of your mail list rather than into it, and a recent renovation permit might pull it back in for a different reason - somebody spending money on the house is somebody spending money on the house. Outside those four cities you are working from the estimate alone. See the expand documentation for how it fits together.

The honest way to write the flyer

Do not write "our records show your roof was installed in 2009." You do not have records, you have an estimate, and the homeowner who re-roofed in 2019 now thinks you are either lying or incompetent.

Write to the neighbourhood instead. "Homes in your area built in the early 2000s are reaching the age where original roofs need replacing. Free inspection, no obligation." That is true, it is useful, and it survives contact with the one guy on the street who already did his.

The estimate picks the street. The copy talks to the street. Nobody gets told a fact about their house that turns out to be wrong.

The pre-built version

The datasets page has Roofs needing replacement already assembled - houses with roofs estimated at 15-plus years, with address, postal code, coordinates, roof material, construction year, floor area, and price estimate. It updates daily, so the list you pull for the spring rush is not the list from two years ago with the movers still on it.

Neighbouring cuts worth a look: Aging housing stock, Older homes for renovation, and Top 10 percent household income if you are chasing the premium end.

If you want it filtered your way - your service area boundary, your material exclusions, your age bands, suppressed against your existing customers - our data team builds custom datasets, delivered in your format on your schedule. Ask for one.

Getting started

  1. Sign up for API access
  2. Draw your service area by city, or by coordinate box using the map endpoint
  3. Set your age band with roof_material_install_year and your material exclusions
  4. Test one neighbourhood and measure the response before you buy postage for the whole city
  5. Track what converts and tighten the bands next round

Most fields cost a tenth of a cent per field per property, so a 10,000 address pull with 8 fields is roughly 80 dollars, which sits under the 99 dollar monthly minimum. Your whole prospect list costs less than the postage for one street. Details on the pricing page.


The data will not tell you whose roof is shot. It will tell you where the shot roofs are, which is the question that actually sells jobs. Explore the API or browse the datasets.