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 the United States and 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. The oldest estimated roof install year you will get back is about 17 years before the current year, which in the queries below 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. The floor moves forward a year every year, so slide the year in the queries with it.

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.499999,
  "data": [
    {
      "address": "112 Hanover Road SW",
      "community": "Haysboro",
      "construction_year": 2009,
      "estimate_sale_price": 1354816,
      "interior_sq_m": 234.20662,
      "postal_code": "T2V3J4",
      "property_id": "1b79ca76b771eaba",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "87 Havenhurst Crescent SW",
      "community": "Haysboro",
      "construction_year": 1974,
      "estimate_sale_price": 856044,
      "interior_sq_m": 100.24238,
      "postal_code": "T2V3C4",
      "property_id": "c644a9e8334a95f5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1611 29 Avenue SW",
      "community": "South Calgary",
      "construction_year": 2009,
      "estimate_sale_price": 1022284,
      "interior_sq_m": 195.09639,
      "postal_code": "T2T1M6",
      "property_id": "11c7409ac2b06dd1",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1921 28 Avenue SW",
      "community": "South Calgary",
      "construction_year": 1957,
      "estimate_sale_price": 998552,
      "interior_sq_m": 151.98938,
      "postal_code": "T2T1K2",
      "property_id": "222db40aceecb821",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1609 29 Avenue SW",
      "community": "South Calgary",
      "construction_year": 2009,
      "estimate_sale_price": 1038275,
      "interior_sq_m": 195.09639,
      "postal_code": "T2T1M6",
      "property_id": "2cf883beb923c56",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1840 32 Avenue SW",
      "community": "South Calgary",
      "construction_year": 1957,
      "estimate_sale_price": 1230481,
      "interior_sq_m": 106.74559,
      "postal_code": "T2T1W2",
      "property_id": "ab56abe67e174c08",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1937 32 Avenue SW",
      "community": "South Calgary",
      "construction_year": 1922,
      "estimate_sale_price": 991776,
      "interior_sq_m": 69.67728,
      "postal_code": "T2T1W5",
      "property_id": "ceebf568454a145a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1806 30 Avenue SW",
      "community": "South Calgary",
      "construction_year": 1974,
      "estimate_sale_price": 793234,
      "interior_sq_m": 173.72868,
      "postal_code": "T2T1P7",
      "property_id": "f6436151b05ff43c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "434 Cranston Drive SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 695877,
      "interior_sq_m": 184.78415,
      "postal_code": "T3M0C1",
      "property_id": "1011bbe15bf9928f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "134 Cranarch Close SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 813668,
      "interior_sq_m": 205.40862,
      "postal_code": "T3M0T9",
      "property_id": "103561da4ba52d41",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "172 Cranleigh Terrace SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 1606615,
      "interior_sq_m": 341.6045,
      "postal_code": "T3M0G4",
      "property_id": "104df3d8c88517c0",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "122 Cranarch Circle SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 878887,
      "interior_sq_m": 240.99048,
      "postal_code": "T3M0S5",
      "property_id": "11364edb45dcf312",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "174 Cranberry Place SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 526543,
      "interior_sq_m": 122.07459,
      "postal_code": "T3M0G8",
      "property_id": "11f7366afede4b42",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "50 Cranarch Grove SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 781837,
      "interior_sq_m": 206.24475,
      "postal_code": "T3M0T8",
      "property_id": "1351da706c5443b5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "177 Cranarch Close SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 849827,
      "interior_sq_m": 201.9712,
      "postal_code": "T3M0T9",
      "property_id": "13a3a53756988e8d",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "93 Cranarch Court SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 850251,
      "interior_sq_m": 208.93893,
      "postal_code": "T3M0S6",
      "property_id": "14499898d6b81835",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "29 Cranberry Lane SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 786122,
      "interior_sq_m": 219.62279,
      "postal_code": "T3M0L5",
      "property_id": "15268341004ffa28",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "114 Cranarch Close SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 744768,
      "interior_sq_m": 193.60994,
      "postal_code": "T3M0T9",
      "property_id": "171423e176d4354c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "210 Cranarch Close SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 939055,
      "interior_sq_m": 201.2263,
      "postal_code": "T3M0T8",
      "property_id": "1787e585ab2d2",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "140 Cranberry Lane SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 612356,
      "interior_sq_m": 132.38573,
      "postal_code": "T3M0L7",
      "property_id": "180f192eb56650db",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "562 Cranston Drive SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 633157,
      "interior_sq_m": 153.38164,
      "postal_code": "T3M0L5",
      "property_id": "1904cf9d7c7ec21d",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "193 Cranarch Close SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 841227,
      "interior_sq_m": 200.02025,
      "postal_code": "T3M0T8",
      "property_id": "1d12a04aa0c7965",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "118 Cranarch Close SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 781369,
      "interior_sq_m": 199.55406,
      "postal_code": "T3M0T9",
      "property_id": "1d5be521b672300",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "100 Cranberry Lane SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 501578,
      "interior_sq_m": 122.07459,
      "postal_code": "T3M0L7",
      "property_id": "1d5c10feaef3052",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "23 Cranberry Circle SE",
      "community": "Cranston",
      "construction_year": 2009,
      "estimate_sale_price": 690471,
      "interior_sq_m": 190.54256,
      "postal_code": "T3M0M1",
      "property_id": "1e2bed243862ab11",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 633
  },
  "price_quote": false,
  "result_total": 15823,
  "time_ms": 24,
  "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"
  }
}

Every house that comes back reads exactly 2009, because they are all pinned at the floor. That is your oldest-roof tier. It is a small share of the city's houses, which makes it a mailing list rather than a fantasy, and a count aggregation with the same filter tells you its size before you pull a row.

Asphalt shingles generally last somewhere in the 20 to 25 year range in cold-climate 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

Thousands of 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.999999,
  "data": [
    {
      "address": "87 Havenhurst Crescent SW",
      "community": "Haysboro",
      "construction_year": 1974,
      "estimate_sale_price": 856044,
      "postal_code": "T2V3C4",
      "property_id": "c644a9e8334a95f5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1921 28 Avenue SW",
      "community": "South Calgary",
      "construction_year": 1957,
      "estimate_sale_price": 998552,
      "postal_code": "T2T1K2",
      "property_id": "222db40aceecb821",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1840 32 Avenue SW",
      "community": "South Calgary",
      "construction_year": 1957,
      "estimate_sale_price": 1230481,
      "postal_code": "T2T1W2",
      "property_id": "ab56abe67e174c08",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1937 32 Avenue SW",
      "community": "South Calgary",
      "construction_year": 1922,
      "estimate_sale_price": 991776,
      "postal_code": "T2T1W5",
      "property_id": "ceebf568454a145a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1806 30 Avenue SW",
      "community": "South Calgary",
      "construction_year": 1974,
      "estimate_sale_price": 793234,
      "postal_code": "T2T1P7",
      "property_id": "f6436151b05ff43c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "434 Scarboro Avenue SW",
      "community": "Scarboro",
      "construction_year": 1974,
      "estimate_sale_price": 1146492,
      "postal_code": "T3C2H6",
      "property_id": "41dbf1c3cb0b878c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1606 Summit Street SW",
      "community": "Scarboro",
      "construction_year": 1957,
      "estimate_sale_price": 1166274,
      "postal_code": "T3C2M1",
      "property_id": "5bd1cd5d57fc8b80",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "114 Scarboro Avenue SW",
      "community": "Scarboro",
      "construction_year": 1922,
      "estimate_sale_price": 1953215,
      "postal_code": "T3C2H1",
      "property_id": "88b6e2b75e3a4b2c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "320 Scarboro Avenue SW",
      "community": "Scarboro",
      "construction_year": 1922,
      "estimate_sale_price": 2424060,
      "postal_code": "T3C2H3",
      "property_id": "8ad08214bbc0a03f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "527 Sunderland Avenue SW",
      "community": "Scarboro",
      "construction_year": 1939,
      "estimate_sale_price": 1628644,
      "postal_code": "T3C2K5",
      "property_id": "b1579e4ef5317fa7",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "336 Scarboro Avenue SW",
      "community": "Scarboro",
      "construction_year": 1922,
      "estimate_sale_price": 1496582,
      "postal_code": "T3C2H3",
      "property_id": "c420737aa59e2dc3",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4707 14A Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1952818,
      "postal_code": "T2T3Y5",
      "property_id": "186e51502fd72a59",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1903 47 Avenue SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1176344,
      "postal_code": "T2T2S5",
      "property_id": "1bb66a8cf83e5aab",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4444 16A Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 871218,
      "postal_code": "T2T4L5",
      "property_id": "40d654e19f12055",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4604 15 Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1458399,
      "postal_code": "T2T4B2",
      "property_id": "416d9c38172bdd3f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4448 16A Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 833299,
      "postal_code": "T2T4L5",
      "property_id": "4a4a20ceef9eb862",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1515 46 Avenue SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1783177,
      "postal_code": "T2T2R3",
      "property_id": "561e3b32dae3d077",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1726 47 Avenue SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 802473,
      "postal_code": "T2T2S2",
      "property_id": "57fb7f9a6da4a455",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4015 14A Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1865483,
      "postal_code": "T2T3Y3",
      "property_id": "61dbccf0bdae9468",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4013 17 Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1218344,
      "postal_code": "T2T4P5",
      "property_id": "836932f96e10ac8f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4615 14A Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1918224,
      "postal_code": "T2T3Y4",
      "property_id": "97a6ff95faba678b",
      "roof_material": "Wood",
      "roof_material_install_year": 2009
    },
    {
      "address": "3610 16 Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 2931896,
      "postal_code": "T2G4G9",
      "property_id": "9a1fbd9e9636979c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1728 47 Avenue SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 896253,
      "postal_code": "T2T2S2",
      "property_id": "a3c91d3d56c30c2b",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1735 38 Avenue SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1109270,
      "postal_code": "T2T2K3",
      "property_id": "a46402fba345e4d",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "4703 14A Street SW",
      "community": "Altadore",
      "construction_year": 1957,
      "estimate_sale_price": 1902347,
      "postal_code": "T2T3Y5",
      "property_id": "a5b176d950ff0de8",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 247
  },
  "price_quote": false,
  "result_total": 6153,
  "time_ms": 22,
  "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 cuts the bucket by more than half, down to 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.999999,
  "data": [
    {
      "address": "112 Hanover Road SW",
      "community": "Haysboro",
      "demographic_income_median_after_tax": 114539,
      "estimate_sale_price": 1354816,
      "postal_code": "T2V3J4",
      "property_id": "1b79ca76b771eaba",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "87 Havenhurst Crescent SW",
      "community": "Haysboro",
      "demographic_income_median_after_tax": 110921,
      "estimate_sale_price": 856044,
      "postal_code": "T2V3C4",
      "property_id": "c644a9e8334a95f5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1611 29 Avenue SW",
      "community": "South Calgary",
      "demographic_income_median_after_tax": 76680,
      "estimate_sale_price": 1022284,
      "postal_code": "T2T1M6",
      "property_id": "11c7409ac2b06dd1",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1921 28 Avenue SW",
      "community": "South Calgary",
      "demographic_income_median_after_tax": 101276,
      "estimate_sale_price": 998552,
      "postal_code": "T2T1K2",
      "property_id": "222db40aceecb821",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1609 29 Avenue SW",
      "community": "South Calgary",
      "demographic_income_median_after_tax": 76680,
      "estimate_sale_price": 1038275,
      "postal_code": "T2T1M6",
      "property_id": "2cf883beb923c56",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1840 32 Avenue SW",
      "community": "South Calgary",
      "demographic_income_median_after_tax": 114539,
      "estimate_sale_price": 1230481,
      "postal_code": "T2T1W2",
      "property_id": "ab56abe67e174c08",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1937 32 Avenue SW",
      "community": "South Calgary",
      "demographic_income_median_after_tax": 116950,
      "estimate_sale_price": 991776,
      "postal_code": "T2T1W5",
      "property_id": "ceebf568454a145a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1806 30 Avenue SW",
      "community": "South Calgary",
      "demographic_income_median_after_tax": 101276,
      "estimate_sale_price": 793234,
      "postal_code": "T2T1P7",
      "property_id": "f6436151b05ff43c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "434 Cranston Drive SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 121773,
      "estimate_sale_price": 695877,
      "postal_code": "T3M0C1",
      "property_id": "1011bbe15bf9928f",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "134 Cranarch Close SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 813668,
      "postal_code": "T3M0T9",
      "property_id": "103561da4ba52d41",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "172 Cranleigh Terrace SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 121773,
      "estimate_sale_price": 1606615,
      "postal_code": "T3M0G4",
      "property_id": "104df3d8c88517c0",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "122 Cranarch Circle SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 878887,
      "postal_code": "T3M0S5",
      "property_id": "11364edb45dcf312",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "174 Cranberry Place SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 121773,
      "estimate_sale_price": 526543,
      "postal_code": "T3M0G8",
      "property_id": "11f7366afede4b42",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "50 Cranarch Grove SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 781837,
      "postal_code": "T3M0T8",
      "property_id": "1351da706c5443b5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "177 Cranarch Close SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 849827,
      "postal_code": "T3M0T9",
      "property_id": "13a3a53756988e8d",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "93 Cranarch Court SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 850251,
      "postal_code": "T3M0S6",
      "property_id": "14499898d6b81835",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "29 Cranberry Lane SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 121773,
      "estimate_sale_price": 786122,
      "postal_code": "T3M0L5",
      "property_id": "15268341004ffa28",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "114 Cranarch Close SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 744768,
      "postal_code": "T3M0T9",
      "property_id": "171423e176d4354c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "210 Cranarch Close SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 939055,
      "postal_code": "T3M0T8",
      "property_id": "1787e585ab2d2",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "140 Cranberry Lane SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 121773,
      "estimate_sale_price": 612356,
      "postal_code": "T3M0L7",
      "property_id": "180f192eb56650db",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "562 Cranston Drive SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 121773,
      "estimate_sale_price": 633157,
      "postal_code": "T3M0L5",
      "property_id": "1904cf9d7c7ec21d",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "193 Cranarch Close SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 841227,
      "postal_code": "T3M0T8",
      "property_id": "1d12a04aa0c7965",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "118 Cranarch Close SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 139858,
      "estimate_sale_price": 781369,
      "postal_code": "T3M0T9",
      "property_id": "1d5be521b672300",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "100 Cranberry Lane SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 121773,
      "estimate_sale_price": 501578,
      "postal_code": "T3M0L7",
      "property_id": "1d5c10feaef3052",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "23 Cranberry Circle SE",
      "community": "Cranston",
      "demographic_income_median_after_tax": 121773,
      "estimate_sale_price": 690471,
      "postal_code": "T3M0M1",
      "property_id": "1e2bed243862ab11",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 622
  },
  "price_quote": false,
  "result_total": 15543,
  "time_ms": 16,
  "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": "112 Hanover Road SW",
      "construction_year": 2009,
      "postal_code": "T2V3J4",
      "property_id": "1b79ca76b771eaba",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "87 Havenhurst Crescent SW",
      "construction_year": 1974,
      "postal_code": "T2V3C4",
      "property_id": "c644a9e8334a95f5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1611 29 Avenue SW",
      "construction_year": 2009,
      "postal_code": "T2T1M6",
      "property_id": "11c7409ac2b06dd1",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1921 28 Avenue SW",
      "construction_year": 1957,
      "postal_code": "T2T1K2",
      "property_id": "222db40aceecb821",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1609 29 Avenue SW",
      "construction_year": 2009,
      "postal_code": "T2T1M6",
      "property_id": "2cf883beb923c56",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1840 32 Avenue SW",
      "construction_year": 1957,
      "postal_code": "T2T1W2",
      "property_id": "ab56abe67e174c08",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1937 32 Avenue SW",
      "construction_year": 1922,
      "postal_code": "T2T1W5",
      "property_id": "ceebf568454a145a",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "1806 30 Avenue SW",
      "construction_year": 1974,
      "postal_code": "T2T1P7",
      "property_id": "f6436151b05ff43c",
      "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": "134 Cranarch Close SE",
      "construction_year": 2009,
      "postal_code": "T3M0T9",
      "property_id": "103561da4ba52d41",
      "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": "122 Cranarch Circle SE",
      "construction_year": 2009,
      "postal_code": "T3M0S5",
      "property_id": "11364edb45dcf312",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "174 Cranberry Place SE",
      "construction_year": 2009,
      "postal_code": "T3M0G8",
      "property_id": "11f7366afede4b42",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "50 Cranarch Grove SE",
      "construction_year": 2009,
      "postal_code": "T3M0T8",
      "property_id": "1351da706c5443b5",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "177 Cranarch Close SE",
      "construction_year": 2009,
      "postal_code": "T3M0T9",
      "property_id": "13a3a53756988e8d",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "93 Cranarch Court SE",
      "construction_year": 2009,
      "postal_code": "T3M0S6",
      "property_id": "14499898d6b81835",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "29 Cranberry Lane SE",
      "construction_year": 2009,
      "postal_code": "T3M0L5",
      "property_id": "15268341004ffa28",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "114 Cranarch Close SE",
      "construction_year": 2009,
      "postal_code": "T3M0T9",
      "property_id": "171423e176d4354c",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "210 Cranarch Close SE",
      "construction_year": 2009,
      "postal_code": "T3M0T8",
      "property_id": "1787e585ab2d2",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "140 Cranberry Lane SE",
      "construction_year": 2009,
      "postal_code": "T3M0L7",
      "property_id": "180f192eb56650db",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "562 Cranston Drive SE",
      "construction_year": 2009,
      "postal_code": "T3M0L5",
      "property_id": "1904cf9d7c7ec21d",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "193 Cranarch Close SE",
      "construction_year": 2009,
      "postal_code": "T3M0T8",
      "property_id": "1d12a04aa0c7965",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "118 Cranarch Close SE",
      "construction_year": 2009,
      "postal_code": "T3M0T9",
      "property_id": "1d5be521b672300",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "100 Cranberry Lane SE",
      "construction_year": 2009,
      "postal_code": "T3M0L7",
      "property_id": "1d5c10feaef3052",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    },
    {
      "address": "23 Cranberry Circle SE",
      "construction_year": 2009,
      "postal_code": "T3M0M1",
      "property_id": "1e2bed243862ab11",
      "roof_material": "Asphalt",
      "roof_material_install_year": 2009
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 633
  },
  "price_quote": false,
  "result_total": 15823,
  "time_ms": 17,
  "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 more than 80 cities, counties and states across the United States and Canada, and for many places outside North America, 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 places, 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 them 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.