!

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 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 Canadian 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 in Canada 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.

These are the homeowners who say yes to a quote. They are also the ones who qualify for the federal Oil to Heat Pump Affordability program (per Natural Resources Canada, the Canada Greener Homes Grant stopped accepting new applications in February 2024 and the final document upload deadline for existing applicants was December 31, 2025, while the Greener Homes Loan closed to new applications on October 1, 2025), plus provincial and utility rebates in British Columbia, Quebec, Nova Scotia, and elsewhere that stack on top.

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": false,
  "cost_cents": 3.359999656677246,
  "data": [
    {
      "address": "31 Hawkside Park NW",
      "bedroom": 3,
      "community": "Hawkwood",
      "construction_year": 1988,
      "estimate_list_price": 668241,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 126.34708404541016,
      "latitude": 51.12946319580078,
      "longitude": -114.17919921875,
      "postal_code": "T3G2W3",
      "property_id": "10000f97f5cb7b9f"
    },
    {
      "address": "52 Cedargrove Way SW",
      "bedroom": 3,
      "community": "Cedarbrae",
      "construction_year": 1984,
      "estimate_list_price": 635789,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 136.4734344482422,
      "latitude": 50.95145034790039,
      "longitude": -114.12571716308594,
      "postal_code": "T2W4V2",
      "property_id": "1000c277cd905d3b"
    },
    {
      "address": "28 Sundown Gr SE",
      "bedroom": 3,
      "community": "Sundance",
      "construction_year": 1988,
      "estimate_list_price": 735563,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 172.61241149902344,
      "latitude": 50.899044036865234,
      "longitude": -114.04895782470705,
      "postal_code": "T2X3G3",
      "property_id": "1001109ab2aebbc0"
    },
    {
      "address": "117 Sandpiper Place NW",
      "bedroom": 3,
      "community": "Sandstone Valley",
      "construction_year": 1988,
      "estimate_list_price": 744059,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 142.6978759765625,
      "latitude": 51.13548278808594,
      "longitude": -114.09813690185548,
      "postal_code": "T3K3T9",
      "property_id": "1001217184d8717b"
    },
    {
      "address": "7237 California Boulevard NE",
      "bedroom": 4,
      "community": "Monterey Park",
      "construction_year": 1995,
      "estimate_list_price": 686824,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 200.01858520507812,
      "latitude": 51.07606506347656,
      "longitude": -113.92584991455078,
      "postal_code": "T1Y6Y8",
      "property_id": "1001392d95458fc1"
    },
    {
      "address": "188 Mount Aberdeen Close SE",
      "bedroom": 3,
      "community": "McKenzie Lake",
      "construction_year": 1999,
      "estimate_list_price": 492482,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 125.23225402832033,
      "latitude": 50.93125915527344,
      "longitude": -113.97802734375,
      "postal_code": "T2Z3N2",
      "property_id": "1001894d82aeeb0c"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 22089
  },
  "price_quote": false,
  "result_total": 132531,
  "time_ms": 102,
  "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. Swap the city and province 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 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 hot market like Toronto, Hamilton, or the Okanagan. 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:

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": false,
  "cost_cents": 2.15999984741211,
  "data": [
    {
      "address": "707 26 Norton Avenue",
      "community": "Willowdale East",
      "construction_year": 2010,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.77256774902344,
      "longitude": -79.41221618652344,
      "postal_code": "M2N0H6",
      "property_id": "10017b8fb9a9b39c"
    },
    {
      "address": "1017 25 Street Dennis Drive",
      "community": "Flemingdon Park",
      "construction_year": 1972,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.717960357666016,
      "longitude": -79.33268737792969,
      "postal_code": "M3C1E7",
      "property_id": "1003c804c993ca91"
    },
    {
      "address": "217 Finch Avenue E",
      "community": "Willowdale East",
      "construction_year": 2010,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.78290939331055,
      "longitude": -79.40016174316406,
      "postal_code": "M2N4S1",
      "property_id": "100481e3b19bea7b"
    },
    {
      "address": "1209 10 Kenneth Avenue",
      "community": "Willowdale East",
      "construction_year": 2010,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.76396560668945,
      "longitude": -79.40607452392578,
      "postal_code": "M2N6K6",
      "property_id": "1004e61b55da8808"
    },
    {
      "address": "58 Torrance Road",
      "community": "Eglinton East",
      "construction_year": 1972,
      "cooling_type_first": "Central",
      "heating_type_first": "Gas furnace",
      "latitude": 43.74322509765625,
      "longitude": -79.23696899414062,
      "postal_code": "M1J2J4",
      "property_id": "100528f299f384a2"
    },
    {
      "address": "72 Cedar Brae Boulevard",
      "community": "Eglinton East",
      "construction_year": 1972,
      "cooling_type_first": "None",
      "heating_type_first": "Gas furnace",
      "latitude": 43.749210357666016,
      "longitude": -79.23633575439453,
      "postal_code": "M1J2K5",
      "property_id": "10058f08fffa0678"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 8863
  },
  "price_quote": false,
  "result_total": 53176,
  "time_ms": 75,
  "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"
  }
}

Layering in the rebate angle

The federal Oil to Heat Pump Affordability program still pays up to $10,000 to eligible oil-heating households converting to a cold climate heat pump, with registrations open until June 30, 2026 per Natural Resources Canada, and provincial and utility incentives can stack on top of that. (The earlier Canada Greener Homes Grant and the interest-free Greener Homes Loan, which offered up to $5,000 and up to $40,000 respectively, both stopped accepting new applications before 2026, though approved files are still being paid out.) 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.

Houski returns demographic_income_median_pre_tax at the neighbourhood level, 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 real estate or homeowner list broker charges $0.25 to $1.00 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. Your effective cost per qualified lead can hit $20 or more.

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.