How HVAC and heat pump contractors find homes with 20+ year old furnaces

Photo of Alex Wilkinson
Alex Wilkinson
CEO of Houski
2024-02-28

If you install furnaces, boilers, or heat pumps in the United States or Canada, you already know the math. The closer a home is to needing a system replacement, the higher your conversion rate. Cold-calling random neighbourhoods is expensive. Buying generic homeowner lists is worse. What you actually need is a way to filter homes by the age of their existing heating system and the type of system they have today.

That is exactly what Houski's property API was built for. With one query you can pull every detached home in your service area where the construction year suggests a furnace at end of life, then layer in heating type to separate gas furnace swap-outs from boiler conversions from prime heat pump candidates.

Why furnace age is the best lead signal you are not using

The average gas furnace has a service life of 15 to 20 years. Boilers can stretch to 25 or 30. Older central air units typically last 12 to 15 years. If a home was built in 2003 and still has its original forced air system, that system is on borrowed time. The homeowner has either already started getting nervous about the next breakdown, or they will be inside the next two heating seasons. Where a record states it, heating_install_year_first dates the heating system itself rather than the house, and heating_install_year_first_lte=2005 sharpens any list built on construction year alone.

These are the homeowners who say yes to a quote. They are also the ones who qualify for the heat pump incentives that federal, provincial, state and utility programs offer, which often stack on top of each other. The programs change often, so check each one's current terms before you put a number in a mailer.

A targeted list of homes built before 2005 with forced air heating is gold. The question is how to get one without a six-figure data contract.

Pulling the list with the Houski properties endpoint

Here is a working example that pulls single-family homes in Calgary built before 2005, currently on a gas furnace, with the address fields you need to mail or knock. The block below is a live call against the real API, the request code and the JSON response are generated every time this page is rendered:

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_gte', '1980');
    url.searchParams.set('construction_year_lte', '2004');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('heating_type_first_eq', 'Gas furnace');
    url.searchParams.set('property_type_in', 'House,Duplex');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('select', 'address,community,postal_code,construction_year,heating_type_first,interior_sq_m,bedroom,estimate_list_price,latitude,longitude');

    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": true,
  "cost_cents": 3.3599997,
  "data": [
    {
      "address": "9600 Southland Circle SW",
      "bedroom": 2,
      "community": "Haysboro",
      "construction_year": 1981,
      "estimate_list_price": 4468732,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 95.92199,
      "latitude": 50.967648,
      "longitude": -114.07414,
      "postal_code": "T2V5A1",
      "property_id": "5a661dc807c2fd8f"
    },
    {
      "address": "1629 29 Avenue SW",
      "bedroom": 2,
      "community": "South Calgary",
      "construction_year": 1989,
      "estimate_list_price": 849944,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 162.39316,
      "latitude": 51.02742,
      "longitude": -114.098885,
      "postal_code": "T2T1M6",
      "property_id": "10e497d35f34aa93"
    },
    {
      "address": "1608 29 Avenue SW",
      "bedroom": 3,
      "community": "South Calgary",
      "construction_year": 1993,
      "estimate_list_price": 816869,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 178.65254,
      "latitude": 51.027946,
      "longitude": -114.09769,
      "postal_code": "T2T1M5",
      "property_id": "10e50bf0160e6960"
    },
    {
      "address": "3023 19 Street SW",
      "bedroom": 2,
      "community": "South Calgary",
      "construction_year": 1983,
      "estimate_list_price": 736792,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 153.38164,
      "latitude": 51.02702,
      "longitude": -114.10719,
      "postal_code": "T2T5W2",
      "property_id": "115a807e2e0f8ed6"
    },
    {
      "address": "1721 30 Avenue SW",
      "bedroom": 4,
      "community": "South Calgary",
      "construction_year": 1997,
      "estimate_list_price": 1137482,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 174.65771,
      "latitude": 51.0265,
      "longitude": -114.1008,
      "postal_code": "T2T1P6",
      "property_id": "120f6a24883058e6"
    },
    {
      "address": "1708 31 Avenue SW",
      "bedroom": 4,
      "community": "South Calgary",
      "construction_year": 2000,
      "estimate_list_price": 924194,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 175.58675,
      "latitude": 51.026104,
      "longitude": -114.10015,
      "postal_code": "T2T1S5",
      "property_id": "133cac81916a585"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 22688
  },
  "price_quote": false,
  "result_total": 136123,
  "time_ms": 53,
  "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"
  }
}

A run like this will pull thousands of qualified addresses across a city the size of Calgary. The same pull for Denver, a market with the same climate and the same furnace stock, with the state in the province_abbreviation parameter:

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', 'denver');
    url.searchParams.set('construction_year_gte', '1980');
    url.searchParams.set('construction_year_lte', '2004');
    url.searchParams.set('country_abbreviation', 'us');
    url.searchParams.set('heating_type_first_eq', 'Gas furnace');
    url.searchParams.set('property_type_in', 'House,Duplex');
    url.searchParams.set('province_abbreviation', 'co');
    url.searchParams.set('select', 'address,community,postal_code,construction_year,heating_type_first,interior_sq_m,bedroom,estimate_list_price,latitude,longitude');

    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": true,
  "cost_cents": 3.3599997,
  "data": [
    {
      "address": "1721 W Chaffee Place",
      "bedroom": 3,
      "community": "Sunnyside",
      "construction_year": 1984,
      "estimate_list_price": 451726,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 146.13647,
      "latitude": 39.779236,
      "longitude": -105.00707,
      "postal_code": "80211",
      "property_id": "1069010100539eb4"
    },
    {
      "address": "4690 N Federal Boulevard",
      "bedroom": 1,
      "community": "Sunnyside",
      "construction_year": 1983,
      "estimate_list_price": 1343309,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 83.61273,
      "latitude": 39.781956,
      "longitude": -105.0248,
      "postal_code": "80211",
      "property_id": "119f2a68f1e1cc2b"
    },
    {
      "address": "4640 N Federal Boulevard",
      "bedroom": 1,
      "community": "Sunnyside",
      "construction_year": 1983,
      "estimate_list_price": 770542,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 83.61273,
      "latitude": 39.78094,
      "longitude": -105.0248,
      "postal_code": "80211",
      "property_id": "18fa1daa7d08c58f"
    },
    {
      "address": "1861 W Chaffee Place",
      "bedroom": 3,
      "community": "Sunnyside",
      "construction_year": 1984,
      "estimate_list_price": 484629,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 146.13647,
      "latitude": 39.779243,
      "longitude": -105.00935,
      "postal_code": "80211",
      "property_id": "1ef78b0f83db5c66"
    },
    {
      "address": "4736 N Federal Boulevard",
      "bedroom": 1,
      "community": "Sunnyside",
      "construction_year": 1983,
      "estimate_list_price": 804086,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 83.61273,
      "latitude": 39.782665,
      "longitude": -105.024796,
      "postal_code": "80211",
      "property_id": "1ff509eabac91349"
    },
    {
      "address": "4648 N Federal Boulevard",
      "bedroom": 1,
      "community": "Sunnyside",
      "construction_year": 1983,
      "estimate_list_price": 651135,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 83.61273,
      "latitude": 39.781097,
      "longitude": -105.0248,
      "postal_code": "80211",
      "property_id": "20195fa4b6f9584d"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 4327
  },
  "price_quote": false,
  "result_total": 25961,
  "time_ms": 26,
  "ui_info": {
    "city": "Denver",
    "city_id": "51cf91a470bf90bc",
    "city_link": "us/co/denver",
    "city_slug": "denver",
    "country": "United States",
    "country_abbreviation": "US",
    "country_abbreviation_id": "c148472ce4bd39d",
    "country_abbreviation_link": "us",
    "country_slug": "united_states",
    "province": "Colorado",
    "province_abbreviation": "CO",
    "province_abbreviation_id": "39e81999af72676b",
    "province_abbreviation_link": "us/co",
    "province_slug": "colorado"
  }
}

Swap the city and the province or state for your service area, and you have a clean prospect list.

Three plays this list unlocks

1. Heat pump conversion campaigns

Filter for homes with heating_type_first set to Gas furnace and a construction_year between 1990 and 2005. These are perfect candidates for a cold climate air source heat pump retrofit because the ductwork is already in place. The homeowner is staring down a furnace replacement decision, and stacked state, provincial, and utility rebates push the math toward a heat pump over a like-for-like gas swap.

Direct mail with a quote example that subtracts the rebate gets opened. A flyer that says "your neighbour at 123 Maple just got a new system for $X after rebates" converts.

2. Boiler conversion and high-efficiency upgrades

Filter heating_type_first to Hot water or In-floor, restrict to homes built before 1990, and you have a list of homeowners with cast iron radiators or in-floor systems hitting end of life. These are higher-ticket jobs with longer sales cycles and very little competition from generic heating, ventilation, and air conditioning (HVAC) marketing. Combine with foundation_type to flag homes with crawlspaces or older basements where a system replacement gets logistically interesting.

3. Air conditioning retrofit on furnace-only homes

Plenty of furnace homes have never had central cooling added. Cooling is only recorded when a record explicitly notes it, so you cannot reliably filter on its absence. Target the dependable signal instead: a gas furnace in a home built before 2010 in a market with hot summers, like Toronto, Hamilton, or the Okanagan, or in Seattle and Portland, where much of the housing stock was built without cooling and recent heat waves changed minds. The climate_temperature_high_warmest_month_c field gives the average daily high of the warmest month at each property, so you can rank a list by how hot its summers run. Those owners are prime candidates for a heat pump that adds cooling and trims heating bills in a single install. The cooling_type_first field comes back on every row so you can scan it as you work the list. The live call below pulls that list for Toronto:

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', 'toronto');
    url.searchParams.set('construction_year_lte', '2010');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('heating_type_first_eq', 'Gas furnace');
    url.searchParams.set('province_abbreviation', 'on');
    url.searchParams.set('select', 'address,community,postal_code,construction_year,heating_type_first,cooling_type_first,latitude,longitude');

    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": true,
  "cost_cents": 2.1599998,
  "data": [
    {
      "address": "202 783 Bathurst Street",
      "community": "University",
      "construction_year": 1960,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.66387,
      "longitude": -79.410614,
      "postal_code": "M5S0A8",
      "property_id": "100b6a71ce98fa1e"
    },
    {
      "address": "14 Washington Avenue",
      "community": "University",
      "construction_year": 1930,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.66586,
      "longitude": -79.40229,
      "postal_code": "M5S1L2",
      "property_id": "101310cbec8c8e92"
    },
    {
      "address": "321 341 Bloor Street W",
      "community": "University",
      "construction_year": 1930,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.666958,
      "longitude": -79.40097,
      "postal_code": "M5S1W8",
      "property_id": "103d1adb9d27bdf5"
    },
    {
      "address": "70 Major Street",
      "community": "University",
      "construction_year": 1930,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.660023,
      "longitude": -79.404305,
      "postal_code": "M5S2L1",
      "property_id": "104119ae8611dd2a"
    },
    {
      "address": "320 341 Bloor Street W",
      "community": "University",
      "construction_year": 1930,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.666958,
      "longitude": -79.40097,
      "postal_code": "M5S1W8",
      "property_id": "104cf3cd73f8adc5"
    },
    {
      "address": "200 555 Bloor Street W",
      "community": "University",
      "construction_year": 1930,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.665123,
      "longitude": -79.410706,
      "postal_code": "M5S1Y6",
      "property_id": "104e16e5cf2e61ac"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 182447
  },
  "price_quote": false,
  "result_total": 1094680,
  "time_ms": 67,
  "ui_info": {
    "city": "Toronto",
    "city_id": "6cdbdee2492718ed",
    "city_link": "ca/on/toronto",
    "city_slug": "toronto",
    "country": "Canada",
    "country_abbreviation": "CA",
    "country_abbreviation_id": "9ace2b6431b7f1be",
    "country_abbreviation_link": "ca",
    "country_slug": "canada",
    "province": "Ontario",
    "province_abbreviation": "ON",
    "province_abbreviation_id": "146699ee774499d3",
    "province_abbreviation_link": "ca/on",
    "province_slug": "ontario"
  }
}

And for Seattle:

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', 'seattle');
    url.searchParams.set('construction_year_lte', '2010');
    url.searchParams.set('country_abbreviation', 'us');
    url.searchParams.set('heating_type_first_eq', 'Gas furnace');
    url.searchParams.set('province_abbreviation', 'wa');
    url.searchParams.set('select', 'address,community,postal_code,construction_year,heating_type_first,cooling_type_first,latitude,longitude');

    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": true,
  "cost_cents": 2.1599998,
  "data": [
    {
      "address": "11722 25 Avenue NE",
      "community": "Victory Heights",
      "construction_year": 1949,
      "cooling_type_first": "None",
      "heating_type_first": "Gas furnace",
      "latitude": 47.71458,
      "longitude": -122.30148,
      "postal_code": "98125",
      "property_id": "100a02b7befee12"
    },
    {
      "address": "11347 17 Avenue NE",
      "community": "Victory Heights",
      "construction_year": 1940,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 47.711758,
      "longitude": -122.31041,
      "postal_code": "98125",
      "property_id": "100d76300f9fdf41"
    },
    {
      "address": "11014 15 Avenue NE",
      "community": "Victory Heights",
      "construction_year": 2006,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 47.70914,
      "longitude": -122.31216,
      "postal_code": "98125",
      "property_id": "109b373710e363b0"
    },
    {
      "address": "12051 25 Avenue NE",
      "community": "Victory Heights",
      "construction_year": 1971,
      "cooling_type_first": "None",
      "heating_type_first": "Gas furnace",
      "latitude": 47.71718,
      "longitude": -122.30219,
      "postal_code": "98125",
      "property_id": "10a90157e0c257f2"
    },
    {
      "address": "11744 17 Avenue NE",
      "community": "Victory Heights",
      "construction_year": 1940,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 47.7151,
      "longitude": -122.30956,
      "postal_code": "98125",
      "property_id": "10d80ad705490335"
    },
    {
      "address": "12316 25 Avenue NE",
      "community": "Victory Heights",
      "construction_year": 1947,
      "cooling_type_first": "None",
      "heating_type_first": "Gas furnace",
      "latitude": 47.717968,
      "longitude": -122.30125,
      "postal_code": "98125",
      "property_id": "10e994092f4765fd"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 19207
  },
  "price_quote": false,
  "result_total": 115242,
  "time_ms": 22,
  "ui_info": {
    "city": "Seattle",
    "city_id": "6a23eb9e5bf4545c",
    "city_link": "us/wa/seattle",
    "city_slug": "seattle",
    "country": "United States",
    "country_abbreviation": "US",
    "country_abbreviation_id": "c148472ce4bd39d",
    "country_abbreviation_link": "us",
    "country_slug": "united_states",
    "province": "Washington",
    "province_abbreviation": "WA",
    "province_abbreviation_id": "bd83526ad9c0e644",
    "province_abbreviation_link": "us/wa",
    "province_slug": "washington"
  }
}

Layering in the rebate angle

Federal, provincial, state and utility incentives can stack, and your sales pitch is much stronger when you can put a real after-rebate number in front of a homeowner whose furnace is already 22 years old.

Many of these programs are income-tested, and Houski returns demographic_income_median_pre_tax at the neighbourhood level in both countries, so you can also sort your list by neighbourhoods where the rebate-financed monthly payment math will resonate.

What it costs versus a generic list broker

A typical homeowner list broker charges per name with no filtering for system age or heating type. You end up mailing apartments, condos, and homes that already had a new furnace installed last year, and your effective cost per qualified lead climbs with every wasted piece.

A Houski API plan starts at a $99 per month minimum, and that floor comfortably covers a filtered pull like the one above. A list of 5,000 qualified furnace-age forced-air homes in your service area works out to fractions of a cent per name, every name pre-qualified on the criteria that matter for your business.

Where to start

If you want to sketch out a campaign before committing, the /api-documentation/properties docs show every filter and field available. The aggregate endpoint at /api-documentation/aggregate is handy for sizing a market before you spend a dollar on print, so you can answer "how many homes in my service area match this profile?" in a single query.

Spin up an API key on the quick-start guide and run your first filter today. Your next install season starts with the right list.