!

EV charger site selection using 240V garage data and driveway parking

Photo of Alex Wilkinson
Alex Wilkinson
CEO of Houski
2026-05-08

Public government data on new motor vehicle registrations through 2025 put zero-emission vehicles at roughly 9 percent of new light-duty registrations nationally, with British Columbia and Quebec well above the national average. The federal sales mandate's original 20 percent target for 2026 model year vehicles was paused in September 2025, but provincial mandates and the new federal Electric Vehicle Affordability Program, which replaced the closed Incentives for Zero-Emission Vehicles program in early 2026, keep adoption climbing, and the home-charger pipeline keeps filling with it. Every one of those new electric vehicle (EV) owners eventually has the same question. Can my garage handle a Level 2 charger today, or do I need a panel upgrade?

That single question is where the home-charger market lives or dies. If a homeowner has a 240V circuit already roughed in, an installer can be in and out in three hours and the customer pays $1,500 to $2,500 all-in. If the home needs a service upgrade from 100A to 200A plus a new circuit run, the quote jumps to $4,500 to $9,000 and the close rate falls off a cliff.

Most installer marketing does not know which house is which until a tech is standing in the basement with a flashlight. That is the single biggest waste of marketing dollars in the residential EV space right now, and it is the problem this post is about.

The residential electric vehicle charger market has scaled up across Canada over the last few years. The pattern is the same in every region. The hardware manufacturers ship product through a regional distributor network. The distributors push leads to certified installers. The installers run the same Facebook ad budget against the same generic homeowner audiences and pay $80 to $250 per booked consultation. About one in three consultations turns into a panel-upgrade quote that the customer rejects on the spot. That rejected quote is the entire story of why charger margins are thinner than they should be, and it is fully solvable with the right pre-qualification data.

The home-charger market problem in one paragraph

Manufacturers like Wallbox, ChargePoint, Tesla, FLO, and ABB sell hardware through a long chain of installers, dealerships, and utility programs. The installers spend on Google Ads, mailers, and home show booths to fill a funnel. The funnel converts well at the top because every new EV owner needs a charger. The funnel collapses at the panel-upgrade quote because the install economics flip from a quick win to a capital project. The fix is to qualify panel readiness before the marketing dollar gets spent, not after.

What a per-property 240V index actually looks like

The data ideal is simple to describe and historically impossible to source. You want a queryable index of every Canadian residential property with three things attached.

  1. Whether the primary garage already has a 240V circuit
  2. The garage type, parking count, and driveway configuration
  3. Enough demographic and location signal to rank the address by likely EV interest

Houski stitches this together from public, government, and crowdsourced data sources. The fields are exposed on the Houski API as garage_240v_first, garage_240v_second, garage_type_first, garage_parking_space_first, driveway_parking_space, carport_parking_space, and has_rv_parking. These fields come straight from the records where records exist. They are only set when a source record supports them, and the rest are left null. That null-vs-true distinction matters when you build a campaign list, because a null is not a no.

A few words on how the signal shows up. The hot tub case is the surprising one. A huge share of homes with a 240V garage circuit got it during a hot tub install five or 10 years ago, and the same circuit will happily run a Level 2 EV charger at 30A or 40A. Other homes were wired EV-ready by a builder or a previous owner, or picked up a sub-panel for a workshop, and the records reflect that either way.

The result is a national index that is not perfect, because no national index of in-home electrical detail can be perfect, but is dense enough in the major markets to drive real campaigns. Calgary, Edmonton, Vancouver, and Toronto have the deepest coverage. Other markets fill in over time as more source records accumulate.

Example one: Calgary EV-ready inventory by community

Suppose you are a regional installer in Calgary and you want to build a target list of single-family detached homes where the garage already shows 240V. You want it grouped by community so you can plan door-knocking routes by neighbourhood.

The /aggregate endpoint returns one aggregation per call, scoped to a country, province, city, or community, and supports the same filter operators as /properties. To get a community-by-community count, you pull the list of Calgary communities from the /location endpoint, then call /aggregate once per community with the 240V filter applied. The primary underlying call looks like this:

API request
TypeScript code
const houski_data = async (): Promise<AggregateResponse> => {

    // You must copy the AggregateResponse type declarations from the 
    // Houski API documentation to strongly type the response

    const url = new URL('https://api.houski.ca/aggregate');
    url.searchParams.set('aggregation', 'count');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('community', 'Cranston');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('field', 'property_id');
    url.searchParams.set('garage_240v_first_eq', 'true');
    url.searchParams.set('property_type_in', 'House,Duplex');
    url.searchParams.set('province_abbreviation', 'ab');

    const response = await fetch(url);
    const data = await response.json();

    return data;
}

(async () => {
let data: AggregateResponse = await houski_data();

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 1.0,
  "data": [
    {
      "aggregation": "count",
      "field": "property_id",
      "value": "4"
    }
  ],
  "error": "",
  "price_quote": false,
  "time_ms": 239
}

Stitch the per-community responses together, sort that descending, and you have your top 20 neighbourhoods to canvas first. The communities that show up at the top tend to be the post-2015 builds in the northwest and southeast of the city, where electrical code and builder upgrades pushed garage 240V into the standard package.

Now contrast that with the same query without the 240V filter to get total inventory by community. Divide one by the other and you have a 240V readiness ratio per neighbourhood. A community at 35 percent ready is worth a different campaign than a community at 4 percent ready. The 35 percent neighbourhood gets a "we can install your charger this week" mailer. The 4 percent neighbourhood gets a "ask us about panel-upgrade financing" mailer. Same product, different message, much better conversion on both sides.

A second pass on the Calgary data should layer in the secondary garage. Many Calgary properties have a detached garage in addition to an attached one, and the garage_240v_second field carries the same true-false-null structure. Some homeowners ran a sub-panel out to the detached shop for a welder or air compressor and never touched the attached garage. That is a perfectly valid charger location and the install economics are the same as any other 240V-ready garage. A combined filter using garage_240v_first_eq=true OR garage_240v_second_eq=true (run as two queries and unioned client-side, since the public API does not support OR across distinct fields) widens your eligible inventory by 10 to 20 percent in cities like Calgary, Edmonton, and Saskatoon where detached garages are common.

Example two: Greater Toronto Area (GTA) dealership charger upsell

A Tesla store in the GTA wants to hand the sales team a list of recent customer postal codes that overlap with high-income, garage-240V-ready homes near the store. The pitch is a one-call charger install bundled with delivery.

The call below pulls the city's 240V-ready detached inventory, with income context selected for ranking. The block below is a live call against the real API:

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('country_abbreviation', 'ca');
    url.searchParams.set('garage_240v_first_eq', 'true');
    url.searchParams.set('property_type_in', 'House,Duplex,Townhouse');
    url.searchParams.set('province_abbreviation', 'on');
    url.searchParams.set('results_per_page', '100');
    url.searchParams.set('select', 'address,city,postal_code,garage_type_first,garage_parking_space_first,driveway_parking_space,demographic_income_median_after_tax,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": 18.39999771118164,
  "data": [
    {
      "address": "344 Spring Garden Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 50688,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 1,
      "garage_type_first": "Detached",
      "latitude": 43.76822662353515,
      "longitude": -79.3942642211914,
      "postal_code": "M2N3H5",
      "property_id": "136d26c429c31199"
    },
    {
      "address": "66 Moore Park Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 38400,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.79282760620117,
      "longitude": -79.42475891113281,
      "postal_code": "M2M1M9",
      "property_id": "1bd5d31a158f588b"
    },
    {
      "address": "22 Vancho Crescent",
      "city": "Toronto",
      "demographic_income_median_after_tax": 63488,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.6773567199707,
      "longitude": -79.5370864868164,
      "postal_code": "M9A4Z2",
      "property_id": "1d1c965f8da0a7c0"
    },
    {
      "address": "25 Sonic Way",
      "city": "Toronto",
      "demographic_income_median_after_tax": 44544,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.71921157836914,
      "longitude": -79.3360366821289,
      "postal_code": "M3C3Z2",
      "property_id": "1fb6ba248b0ab263"
    },
    {
      "address": "6 137 Isaac Devins Boulevard",
      "city": "Toronto",
      "demographic_income_median_after_tax": 47104,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.73189163208008,
      "longitude": -79.53208923339844,
      "postal_code": "M9M0C4",
      "property_id": "20844271f64d096c"
    },
    {
      "address": "63 Sandown Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 47104,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.71233749389648,
      "longitude": -79.25245666503906,
      "postal_code": "M1N3W2",
      "property_id": "24cb01fe30d73085"
    },
    {
      "address": "331 Connaught Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 40960,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.785457611083984,
      "longitude": -79.4345932006836,
      "postal_code": "M2R2M1",
      "property_id": "38a17c2b134e83d9"
    },
    {
      "address": "154 Fitzgibbon Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 39424,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.74528884887695,
      "longitude": -79.26441192626953,
      "postal_code": "M1K4A8",
      "property_id": "4ea0d4f06bc252d2"
    },
    {
      "address": "65 Blackthorn Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 45056,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.676212310791016,
      "longitude": -79.45882415771484,
      "postal_code": "M6N3H4",
      "property_id": "52d64c5ece94e1e8"
    },
    {
      "address": "88 Fairview Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 67072,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.66013717651367,
      "longitude": -79.47673797607422,
      "postal_code": "M6P3A4",
      "property_id": "55472fb0c0918761"
    },
    {
      "address": "4 Prentice Court",
      "city": "Toronto",
      "demographic_income_median_after_tax": 58880,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.68732070922851,
      "longitude": -79.54065704345703,
      "postal_code": "M9P1N2",
      "property_id": "628dfc7f2c888f0d"
    },
    {
      "address": "42 Glen Agar Drive",
      "city": "Toronto",
      "demographic_income_median_after_tax": 65536,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.66434097290039,
      "longitude": -79.55400848388672,
      "postal_code": "M9B2V5",
      "property_id": "72dbb80ae137522b"
    },
    {
      "address": "240 Russell Hill Road",
      "city": "Toronto",
      "demographic_income_median_after_tax": 58880,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.68351745605469,
      "longitude": -79.40770721435547,
      "postal_code": "M4V2T2",
      "property_id": "73536f2ba078dd0c"
    },
    {
      "address": "68 Hill Crescent",
      "city": "Toronto",
      "demographic_income_median_after_tax": 50176,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.73802947998047,
      "longitude": -79.21066284179688,
      "postal_code": "M1M1J5",
      "property_id": "738fa2a4186d0cd9"
    },
    {
      "address": "26 McMillan Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 49664,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.774688720703125,
      "longitude": -79.16683197021484,
      "postal_code": "M1E4B5",
      "property_id": "8981005e56af6189"
    },
    {
      "address": "39 Madron Crescent",
      "city": "Toronto",
      "demographic_income_median_after_tax": 39168,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 1,
      "garage_type_first": "Attached",
      "latitude": 43.75862884521485,
      "longitude": -79.49578094482422,
      "postal_code": "M3J1H8",
      "property_id": "8abe8784274531de"
    },
    {
      "address": "6 Peacham Crescent",
      "city": "Toronto",
      "demographic_income_median_after_tax": 44544,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.730255126953125,
      "longitude": -79.50546264648438,
      "postal_code": "M3M1S1",
      "property_id": "8c992a671c764786"
    },
    {
      "address": "23 Kingswell Crescent",
      "city": "Toronto",
      "demographic_income_median_after_tax": 46592,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.71931076049805,
      "longitude": -79.29637145996094,
      "postal_code": "M1L3E2",
      "property_id": "9383e10cf2fe130c"
    },
    {
      "address": "23 Sonic Way",
      "city": "Toronto",
      "demographic_income_median_after_tax": 44544,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.71918869018555,
      "longitude": -79.33612823486328,
      "postal_code": "M3C0P3",
      "property_id": "9c3d9e04f58d8adc"
    },
    {
      "address": "77 Chestnut Park Road",
      "city": "Toronto",
      "demographic_income_median_after_tax": 101120,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.67984771728515,
      "longitude": -79.38314819335938,
      "postal_code": "M4W1W7",
      "property_id": "a5fb9cc50a9bf77e"
    },
    {
      "address": "54 Sloley Road",
      "city": "Toronto",
      "demographic_income_median_after_tax": 55296,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.72063827514648,
      "longitude": -79.23045349121094,
      "postal_code": "M1M1C8",
      "property_id": "a73877ef1a2c13a8"
    },
    {
      "address": "204 Westview Boulevard",
      "city": "Toronto",
      "demographic_income_median_after_tax": 45056,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.7123908996582,
      "longitude": -79.3064193725586,
      "postal_code": "M4B3J6",
      "property_id": "a8e4487f25aa91f8"
    },
    {
      "address": "B 21 Wexford Boulevard",
      "city": "Toronto",
      "demographic_income_median_after_tax": 44544,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.73658752441406,
      "longitude": -79.2979736328125,
      "postal_code": "M1R1K9",
      "property_id": "ad0be996d187c9ed"
    },
    {
      "address": "62 Bywood Drive",
      "city": "Toronto",
      "demographic_income_median_after_tax": 66560,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.65737533569336,
      "longitude": -79.53887939453125,
      "postal_code": "M9A1M3",
      "property_id": "b01ebac80eeab07c"
    },
    {
      "address": "68 Hertle Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 51200,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.668907165527344,
      "longitude": -79.32549285888672,
      "postal_code": "M4L2T4",
      "property_id": "b3c82431e9fce22f"
    },
    {
      "address": "25 Kells Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 41472,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.74391555786133,
      "longitude": -79.25334930419922,
      "postal_code": "M1K4W6",
      "property_id": "b5eec6d0b7fbed93"
    },
    {
      "address": "A 21 Wexford Boulevard",
      "city": "Toronto",
      "demographic_income_median_after_tax": 44544,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.73658752441406,
      "longitude": -79.2979736328125,
      "postal_code": "M1R1K9",
      "property_id": "ba99d2dd28dea93c"
    },
    {
      "address": "4 Trowell Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 41984,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.6872673034668,
      "longitude": -79.46775817871094,
      "postal_code": "M6M1L4",
      "property_id": "c0f37603465b8332"
    },
    {
      "address": "1 Burton Road",
      "city": "Toronto",
      "demographic_income_median_after_tax": 76039,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.69254684448242,
      "longitude": -79.41529846191406,
      "postal_code": "M5P1T6",
      "property_id": "c57ed2063b14e251"
    },
    {
      "address": "6 Winterset Crescent",
      "city": "Toronto",
      "demographic_income_median_after_tax": 48640,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.67695236206055,
      "longitude": -79.5733871459961,
      "postal_code": "M9R4A2",
      "property_id": "ca3d2a7b1f74b278"
    },
    {
      "address": "27 Paramount Court",
      "city": "Toronto",
      "demographic_income_median_after_tax": 44032,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.697662353515625,
      "longitude": -79.48077392578125,
      "postal_code": "M6M2L3",
      "property_id": "ca7ebd4122f2344a"
    },
    {
      "address": "11 Canmore Boulevard",
      "city": "Toronto",
      "demographic_income_median_after_tax": 42496,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.79287338256836,
      "longitude": -79.1842269897461,
      "postal_code": "M1C3T3",
      "property_id": "ccb7cf9890d02ad9"
    },
    {
      "address": "30 Morningside Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 51200,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.75336456298828,
      "longitude": -79.18000793457031,
      "postal_code": "M1E3C1",
      "property_id": "de72b3e8b50e77ae"
    },
    {
      "address": "80 Bartlett Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 50176,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.66276550292969,
      "longitude": -79.43435668945312,
      "postal_code": "M6H3E6",
      "property_id": "e30c957406c5af63"
    },
    {
      "address": "133 Brownville Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 43008,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.68667221069336,
      "longitude": -79.48695373535156,
      "postal_code": "M6N4L2",
      "property_id": "ef0afe17768179ab"
    },
    {
      "address": "9 Tynevale Drive",
      "city": "Toronto",
      "demographic_income_median_after_tax": 48640,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.68596267700195,
      "longitude": -79.5586929321289,
      "postal_code": "M9R2B3",
      "property_id": "f3478113fa35a83a"
    },
    {
      "address": "37 Newlin Crescent",
      "city": "Toronto",
      "demographic_income_median_after_tax": 40960,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 1,
      "garage_type_first": "Detached",
      "latitude": 43.7392463684082,
      "longitude": -79.49701690673828,
      "postal_code": "M3L1X5",
      "property_id": "f50a06d01d55363d"
    },
    {
      "address": "226 Boon Avenue",
      "city": "Toronto",
      "demographic_income_median_after_tax": 47104,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.682861328125,
      "longitude": -79.44877624511719,
      "postal_code": "M6E3Z8",
      "property_id": "f98cc8ce46c3955c"
    },
    {
      "address": "240 Maxwell Street",
      "city": "Toronto",
      "demographic_income_median_after_tax": 51200,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.76612091064453,
      "longitude": -79.45308685302734,
      "postal_code": "M3H5B7",
      "property_id": "fa149dcd05a44b77"
    },
    {
      "address": "58A Poulett Street",
      "city": "Toronto",
      "demographic_income_median_after_tax": 50176,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 1,
      "garage_type_first": "Attached",
      "latitude": 43.658241271972656,
      "longitude": -79.36637878417969,
      "postal_code": "M5A1Z5",
      "property_id": "fe1bfac848e2466b"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": false,
    "has_previous_page": false,
    "page_total": 1
  },
  "price_quote": false,
  "result_total": 40,
  "time_ms": 85,
  "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"
  }
}

The pull is city-level. To narrow it to the store's trade area, post-filter in Python on the returned latitude and longitude using the haversine formula, or use the location endpoint to get a community list and constrain by community_in. The point is that the dealership team now hands the sales floor a tablet with the list pre-loaded. When a delivery is booked, the system flags whether the buyer's postal code matches a 240V-ready cluster, and the bundled charger upsell goes from a guess to a near-certainty.

The economics on this for a dealership are straightforward. A bundled Level 2 install at delivery time runs about $1,800 to the buyer, with the dealership keeping a margin and the installer skipping the customer-acquisition cost entirely. The list above is the bridge.

The same pattern works for any dealership selling a battery-electric or plug-in hybrid model. Hyundai dealers selling the Ioniq 5 and Ioniq 6, Kia dealers with the EV6 and EV9, Ford dealers moving Mustang Mach-E and F-150 Lightning units, and the GM showrooms with the Equinox EV and Blazer EV all face the same problem. The customer wants the car. The home charging conversation is awkward because the salesperson does not know the panel situation. With a pre-loaded readiness signal tied to the postal code on the credit application, the salesperson can speak in confidence. "Your neighbourhood averages 28 percent garage 240V ready, and our installer partner can do a same-day site survey with a no-obligation quote that includes panel-upgrade financing if you need it." That is a much better conversation than awkward silence.

Example three: BC Hydro grid planning

Utility EV-program managers have a different problem. They are not selling chargers. They are forecasting load. BC Hydro needs to know, at the substation and feeder level, how many homes in Vancouver and the Lower Mainland already have 240V garage capacity versus how many will trigger a panel upgrade and possibly a service drop upgrade as EV adoption climbs.

This is a per-community job. Loop over the communities returned by the /location endpoint for each city, and for each one issue three /aggregate calls: one for the 240V-true count, one for the 240V-false count, and one for the total count. The null bucket falls out of the subtraction. The primary underlying call looks like this:

API request
TypeScript code
const houski_data = async (): Promise<AggregateResponse> => {

    // You must copy the AggregateResponse type declarations from the 
    // Houski API documentation to strongly type the response

    const url = new URL('https://api.houski.ca/aggregate');
    url.searchParams.set('aggregation', 'count');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'vancouver');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('field', 'property_id');
    url.searchParams.set('garage_240v_first_eq', 'true');
    url.searchParams.set('property_type_in', 'House,Duplex');
    url.searchParams.set('province_abbreviation', 'bc');

    const response = await fetch(url);
    const data = await response.json();

    return data;
}

(async () => {
let data: AggregateResponse = await houski_data();

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 1.0,
  "data": [
    {
      "aggregation": "count",
      "field": "property_id",
      "value": "8"
    }
  ],
  "error": "",
  "price_quote": false,
  "time_ms": 228
}

Issue the same call with garage_240v_first_eq set to false for the false bucket, and once without the 240V filter for the community total. The difference is the null share. For utility planning, the safe assumption is that the null share has roughly the same true-to-false ratio as the known share for properties of the same construction-year band. A quick second pass layered on construction_year_gte and construction_year_lte lets the analyst back into a defensible estimate per feeder.

The output of this kind of analysis goes straight into a utility's distribution capital plan. It also feeds the rebate program design. If a community is 80 percent unready, the rebate has to cover panel-upgrade costs, not just the charger. If a community is 70 percent ready, the rebate dollars go further on charger subsidies alone.

There is a third use case for utility EV-program managers that often gets overlooked. Time-of-use enrollment campaigns. The biggest win for a utility from EV adoption is not the load itself, it is shifting that load to overnight off-peak hours. Customers who already have a 240V garage circuit are the ones who will plug in tonight if you offer them a managed charging app and a slightly better rate. Customers who do not have the circuit are not enrolling in time-of-use programs in any meaningful number this year, because they do not have the hardware to participate. Splitting the outreach by readiness lets the program manager spend marketing budget where it actually moves enrollment numbers.

A fourth angle is bidirectional charging readiness. As vehicle-to-home and vehicle-to-grid hardware reaches the Canadian market in the next 12 to 24 months, utilities will need to know which homes can host the more capable inverter-equipped chargers. Those installs require not just 240V but adequate panel capacity and a transfer switch. Filtering on garage_240v_first_eq=true is the first cut. The next layer is construction_year_gte=2018 to bias toward 200A panels that ship in modern builds. The cross-section is small today but it is the most strategically interesting cohort for any utility that is planning beyond simple Level 2 unmanaged charging.

Example four: condo and townhouse retrofits

Single-family detached is the easy case. The harder and more lucrative work is multi-unit residential. Houski tracks shared garage 240V signal on condo and townhouse properties through the shared_garage_240v_first and related shared-amenity fields, populated from public, government, and crowdsourced data sources.

A condo retrofit consultant in Montreal wants a list of buildings where the shared garage has at least some 240V infrastructure already in place, paired with units where the owner-occupier income suggests EV affordability. The block below is a live call against the real API:

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', 'montreal');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('property_type_in', 'Apartment,Townhouse');
    url.searchParams.set('province_abbreviation', 'qc');
    url.searchParams.set('results_per_page', '20');
    url.searchParams.set('select', 'address,community,postal_code,shared_garage_240v_first,garage_parking_space_first,demographic_income_median_after_tax,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.799999237060547,
  "data": [
    {
      "address": "4140 Adam Rue",
      "community": "Mercier-Hochelaga-Maisonneuve",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 31744,
      "garage_parking_space_first": 0,
      "postal_code": "H1V1S7",
      "property_id": "1000019f9b0cf9c8",
      "shared_garage_240v_first": false
    },
    {
      "address": "41 2202 Rosemont Boulevard",
      "community": "Rosemont-La-Petite-Patrie",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 46592,
      "garage_parking_space_first": 1,
      "postal_code": "H2G1T5",
      "property_id": "10000874d2ccb6ea",
      "shared_garage_240v_first": false
    },
    {
      "address": "20 2880 De Darlington Place",
      "community": "Cote-des-Neiges-Notre-Dame-de-Grace",
      "construction_year": 1951,
      "demographic_income_median_after_tax": 32768,
      "garage_parking_space_first": 0,
      "postal_code": "H3S1L5",
      "property_id": "10000f273ba648",
      "shared_garage_240v_first": false
    },
    {
      "address": "202 2580 De Granby Place",
      "community": "Mercier-Hochelaga-Maisonneuve",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 38912,
      "garage_parking_space_first": 0,
      "postal_code": "H1N1V2",
      "property_id": "10002576776f8e8a",
      "shared_garage_240v_first": false
    },
    {
      "address": "2021 Rue De Saint-Just",
      "community": "Mercier-Hochelaga-Maisonneuve",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 47104,
      "garage_parking_space_first": 0,
      "postal_code": "H1L5Z8",
      "property_id": "10002b3ce6100fd4",
      "shared_garage_240v_first": false
    },
    {
      "address": "3563 Rue Dandurand",
      "community": "Rosemont-La-Petite-Patrie",
      "construction_year": 1915,
      "demographic_income_median_after_tax": 48640,
      "garage_parking_space_first": 1,
      "postal_code": "H1X2V1",
      "property_id": "100032ff5a8abdaf",
      "shared_garage_240v_first": false
    },
    {
      "address": "10676 Avenue Georges-Baril",
      "community": "Rosemont-La-Petite-Patrie",
      "construction_year": 1959,
      "demographic_income_median_after_tax": 50688,
      "garage_parking_space_first": 0,
      "postal_code": "H2S2C2",
      "property_id": "100040c947a4c982",
      "shared_garage_240v_first": false
    },
    {
      "address": "9880 De Saint-Firmin Rue",
      "community": "Villeray-Saint-Michel-Parc-Extension",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 43520,
      "garage_parking_space_first": 0,
      "postal_code": "H2B2G5",
      "property_id": "1000459e0be98350",
      "shared_garage_240v_first": false
    },
    {
      "address": "206 1675 Poupart Rue",
      "community": "Ville-Marie",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 39936,
      "garage_parking_space_first": 0,
      "postal_code": "H2K3G9",
      "property_id": "10004a75d882acac",
      "shared_garage_240v_first": false
    },
    {
      "address": "880 Avenue 40E",
      "community": "Lachine",
      "construction_year": 1949,
      "demographic_income_median_after_tax": 60416,
      "garage_parking_space_first": 0,
      "postal_code": "H8S3R3",
      "property_id": "100050c3d2e1721f",
      "shared_garage_240v_first": false
    },
    {
      "address": "2145 Rue Beaudry",
      "community": "Ville-Marie",
      "construction_year": 1900,
      "demographic_income_median_after_tax": 40960,
      "garage_parking_space_first": 0,
      "postal_code": "H2L3H3",
      "property_id": "10006053eb1d16b3",
      "shared_garage_240v_first": false
    },
    {
      "address": "208 254 Berlioz Rue",
      "community": "Verdun-Ile-des-Soeurs",
      "construction_year": 2005,
      "demographic_income_median_after_tax": 44544,
      "garage_parking_space_first": 0,
      "postal_code": "H3E1B9",
      "property_id": "1000729d61f822d8",
      "shared_garage_240v_first": false
    },
    {
      "address": "2168 Rue Joliette",
      "community": "Mercier-Hochelaga-Maisonneuve",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 44032,
      "garage_parking_space_first": 0,
      "postal_code": "H1X3L7",
      "property_id": "10007ac563262cc4",
      "shared_garage_240v_first": false
    },
    {
      "address": "2930 Raudot Rue",
      "community": "Sud-Ouest",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 36096,
      "garage_parking_space_first": 0,
      "postal_code": "H4E2R2",
      "property_id": "100093d4b8dab627",
      "shared_garage_240v_first": false
    },
    {
      "address": "11915 De Montigny Rue",
      "community": "Pointe-aux-Trembles-Rivieres-des-Prairies",
      "construction_year": 1983,
      "demographic_income_median_after_tax": 44032,
      "garage_parking_space_first": 0,
      "postal_code": "H1B5P2",
      "property_id": "100096e22afb8c57",
      "shared_garage_240v_first": false
    },
    {
      "address": "5564 Wilbrod-Paquin Rue",
      "community": "Rosemont-La-Petite-Patrie",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 52224,
      "garage_parking_space_first": 1,
      "postal_code": "H1T3Z2",
      "property_id": "1000999c11a9accf",
      "shared_garage_240v_first": false
    },
    {
      "address": "13 7565 Chabot Rue",
      "community": "Villeray-Saint-Michel-Parc-Extension",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 36608,
      "garage_parking_space_first": 0,
      "postal_code": "H2E2L2",
      "property_id": "1000a7a2b426a963",
      "shared_garage_240v_first": false
    },
    {
      "address": "203 5500 Snowdon Rue",
      "community": "Cote-des-Neiges-Notre-Dame-de-Grace",
      "construction_year": 1951,
      "demographic_income_median_after_tax": 49152,
      "garage_parking_space_first": 0,
      "postal_code": "H3X1Y6",
      "property_id": "1000b2822e5e057d",
      "shared_garage_240v_first": false
    },
    {
      "address": "3686 Rue Evelyn",
      "community": "Verdun-Ile-des-Soeurs",
      "construction_year": 1912,
      "demographic_income_median_after_tax": 44032,
      "garage_parking_space_first": 0,
      "postal_code": "H4G2H1",
      "property_id": "1000bf53decbf75a",
      "shared_garage_240v_first": false
    },
    {
      "address": "261 Du Seminaire Rue",
      "community": "Sud-Ouest",
      "construction_year": 1910,
      "demographic_income_median_after_tax": 65024,
      "garage_parking_space_first": 0,
      "postal_code": "H3C2A4",
      "property_id": "1000e0c9a858937b",
      "shared_garage_240v_first": false
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 59287
  },
  "price_quote": false,
  "result_total": 1185735,
  "time_ms": 115,
  "ui_info": {
    "city": "Montréal",
    "city_id": "17714d7a0b7d0e18",
    "city_link": "ca/qc/montreal",
    "city_slug": "montreal",
    "country": "Canada",
    "country_abbreviation": "CA",
    "country_abbreviation_id": "9ace2b6431b7f1be",
    "country_abbreviation_link": "ca",
    "country_slug": "canada",
    "province": "Quebec",
    "province_abbreviation": "QC",
    "province_abbreviation_id": "a94c1625e3965742",
    "province_abbreviation_link": "ca/qc",
    "province_slug": "quebec"
  }
}

For a condo retrofit consultant, the building-level list matters more than the unit-level list. Roll the /properties rows up per building client-side, grouping on the street address, to get a count of qualifying units per building. The buildings with 30-plus qualifying units are where you propose a full charger-management system, not a single-spot retrofit. That changes the project size from $4,000 per stall to $200,000 to $600,000 per building, with very different margins and a very different sales motion.

The other condo angle is the not-yet-ready buildings. Filter shared_garage_240v_first_eq=false and look at construction year between 1990 and 2010. These are the buildings that built underground parkade with no EV provisioning, and they are the ones that need to retrofit conduit and transformer capacity in the next five years to comply with provincial EV-ready mandates that are creeping in across British Columbia, Quebec, and Ontario.

A consultant or charger network operator pitching shared infrastructure can build a per-building business case using the unit count and the income mix. A 180-unit building in a community with median after-tax income of $110,000 has a much different EV adoption curve than a 60-unit building in a community at $55,000. The first building justifies a full multi-stall load-managed system today. The second building probably justifies four to six stalls with planned expansion. Same product line, totally different proposal sizes.

Townhouse complexes are the trickiest segment. The unit owner often controls their own enclosed garage but the parkade transformer and main service is shared. The retrofit work splits between in-unit and common-area scopes. Houski's combination of garage_240v_first for the unit-level signal and shared_garage_240v_first for the common-area signal lets a consultant tease apart which complexes have a clean in-unit retrofit path versus which need a board-level capital project. That distinction changes the entire sales motion.

Example five: car-dependent neighbourhoods

The other lever in EV charger demand is car dependency. A neighbourhood where 90 percent of commuters drive themselves to work has materially higher per-household EV charger demand than a neighbourhood where 40 percent take transit. Houski exposes commute mode share as demographic_transportation_car_truck_or_van_percent, drawn from the latest available national-survey community-level data.

Stack that with the 240V readiness filter to find the highest-demand, lowest-friction install neighbourhoods. The block below is a live call against the real API:

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', 'mississauga');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('demographic_transportation_car_truck_or_van_percent_gte', '0.8');
    url.searchParams.set('garage_240v_first_eq', 'true');
    url.searchParams.set('property_type_in', 'House,Duplex');
    url.searchParams.set('province_abbreviation', 'on');
    url.searchParams.set('results_per_page', '100');
    url.searchParams.set('select', 'address,community,postal_code,garage_type_first,driveway_parking_space,demographic_transportation_car_truck_or_van_percent,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": 3.0799996852874756,
  "data": [
    {
      "address": "2404 Old Carriage Road",
      "community": "Central Erin Mills",
      "demographic_income_median_after_tax": 49664,
      "demographic_transportation_car_truck_or_van_percent": 0.8902438879013062,
      "driveway_parking_space": 2,
      "garage_type_first": "Attached",
      "postal_code": "L5C3G4",
      "property_id": "25e8c76b423a8581"
    },
    {
      "address": "1893 Beechknoll Avenue",
      "community": "Central Erin Mills",
      "demographic_income_median_after_tax": 56832,
      "demographic_transportation_car_truck_or_van_percent": 1.0,
      "driveway_parking_space": 2,
      "garage_type_first": "Attached",
      "postal_code": "L4W2G4",
      "property_id": "50272881a2c89186"
    },
    {
      "address": "2624 Comet Court",
      "community": "Central Erin Mills",
      "demographic_income_median_after_tax": 46592,
      "demographic_transportation_car_truck_or_van_percent": 0.8809523582458496,
      "driveway_parking_space": 2,
      "garage_type_first": "Attached",
      "postal_code": "L5K2S1",
      "property_id": "517ed4291047bed6"
    },
    {
      "address": "5596 Haddon Hall Road",
      "community": "Central Erin Mills",
      "demographic_income_median_after_tax": 46080,
      "demographic_transportation_car_truck_or_van_percent": 0.8918918967247009,
      "driveway_parking_space": 2,
      "garage_type_first": "Attached",
      "postal_code": "L5M5G4",
      "property_id": "8a9bd6597c2dd008"
    },
    {
      "address": "2598 Chalkwell Close",
      "community": "Central Erin Mills",
      "demographic_income_median_after_tax": 48128,
      "demographic_transportation_car_truck_or_van_percent": 0.8611111044883728,
      "driveway_parking_space": 2,
      "garage_type_first": "Attached",
      "postal_code": "L5J2B9",
      "property_id": "a83bb09f612b6f1f"
    },
    {
      "address": "10 Plainsman Road",
      "community": "Central Erin Mills",
      "demographic_income_median_after_tax": 57344,
      "demographic_transportation_car_truck_or_van_percent": 0.9285714030265808,
      "driveway_parking_space": 2,
      "garage_type_first": "Detached",
      "postal_code": "L5N1C5",
      "property_id": "e181524975ace983"
    },
    {
      "address": "30 Theodore Drive",
      "community": "Central Erin Mills",
      "demographic_income_median_after_tax": 54272,
      "demographic_transportation_car_truck_or_van_percent": 0.8510638475418091,
      "driveway_parking_space": 2,
      "garage_type_first": "Attached",
      "postal_code": "L5M1E4",
      "property_id": "fb75a51575c67ae4"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": false,
    "has_previous_page": false,
    "page_total": 1
  },
  "price_quote": false,
  "result_total": 7,
  "time_ms": 86,
  "ui_info": {
    "city": "Mississauga",
    "city_id": "10e477e146f4168b",
    "city_link": "ca/on/mississauga",
    "city_slug": "mississauga",
    "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"
  }
}

The two-plus driveway space filter is doing real work here. A two-car household with two EVs needs two charging spots. If the garage holds one and the driveway holds one, the second charger is an outdoor unit, which is a different product line and a different install. Filtering at query time means your downstream system never sees the wrong configurations and your upsell pitches never miss.

The car-dependent commute filter has a useful side effect. It naturally weights toward suburbs over downtown cores, and it weights toward households that own multiple vehicles. Both of those correlate strongly with second-charger sales, which is where the next year of revenue growth is going to come from in this market.

There is a related move that works well for fleet-adjacent campaigns. Filtering on has_rv_parking_eq=true and driveway_parking_space_gte=3 finds homes with significant outdoor parking real estate, often with a 30A or 50A recreational vehicle (RV) outlet already installed. That outlet is the same circuit type a Level 2 charger needs, and the cost to repurpose it for EV charging is essentially the cost of the charger itself. RV-owner households are also disproportionately likely to be early adopters of plug-in pickup trucks like the F-150 Lightning, the Silverado EV, and the Ram 1500 REV, which makes them a high-conversion target for the truck-EV charger product line.

Layering electricity provider for utility-specific campaigns

The electricity_provider field tells you which utility serves the address, which matters for two reasons. First, every utility has its own EV rebate program. ENMAX in Calgary, EPCOR in Edmonton, BC Hydro in most of British Columbia, Hydro-Quebec in Quebec, and the various Ontario local distribution companies (LDCs) each have different rebate structures and time-of-use rates. Second, some installers have utility-approved-installer status with one provider and not another, and being able to filter the list by provider before sending it to the install team avoids assigned leads landing in territory the installer cannot service.

Layering it in is one parameter. The block below is a live call against the real API:

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('garage_240v_first_eq', 'true');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '100');
    url.searchParams.set('select', 'address,postal_code,electricity_provider,garage_type_first');

    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": 23.000001907348633,
  "data": [
    {
      "address": "62 Gladeview Crescent SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3E4Y1",
      "property_id": "1658bc901490df0f"
    },
    {
      "address": "12 Cranbrook Cape SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3M3L5",
      "property_id": "18bc25ce727a6641"
    },
    {
      "address": "239 Huntwell Road NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2K5V4",
      "property_id": "18fcadca8b0e4017"
    },
    {
      "address": "2924 4 Avenue NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2N0R3",
      "property_id": "1a20142779dfded6"
    },
    {
      "address": "119 Taracove Estate Drive NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3J4R1",
      "property_id": "1b47a6051f08d42d"
    },
    {
      "address": "193 Cranford Walk SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3M1R6",
      "property_id": "1d405b765374bd91"
    },
    {
      "address": "90 Cornerstone Manor",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3N1S4",
      "property_id": "1deb1d567d3ddce3"
    },
    {
      "address": "9 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "1ed8bc43db148cf1"
    },
    {
      "address": "335 Madeira Close NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2A4N7",
      "property_id": "208a2ed4e2e62a36"
    },
    {
      "address": "311 SEton Road SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3M3L6",
      "property_id": "20da25c0723e2f8c"
    },
    {
      "address": "2240 35 Street SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T3E2X8",
      "property_id": "236aab2681c1dd16"
    },
    {
      "address": "223 Arbour Stone Rise NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G4N3",
      "property_id": "24196230c8ffc58e"
    },
    {
      "address": "926 19 Avenue SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2T0H7",
      "property_id": "2451bdbb306cf252"
    },
    {
      "address": "39 Harley Road SW",
      "electricity_provider": "Grid",
      "garage_type_first": "None",
      "postal_code": "T2V3K4",
      "property_id": "254d5e66bf5726e9"
    },
    {
      "address": "72 Panamount Manor NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3K6H7",
      "property_id": "26a6570620fbb594"
    },
    {
      "address": "66 Savoy Landing SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3A0G6",
      "property_id": "27edd3665b984fba"
    },
    {
      "address": "134 Howse Rise NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3P0X3",
      "property_id": "2afde727a2827388"
    },
    {
      "address": "240 Elgin Meadows Way SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2Z0R9",
      "property_id": "2c61c13e4f38862b"
    },
    {
      "address": "4715 15 Street SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2T4B5",
      "property_id": "2ebf132b2a47f36f"
    },
    {
      "address": "103 Applewood Way SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2A7N1",
      "property_id": "2efde7a1d09c725"
    },
    {
      "address": "35 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "30f99e72c68a4a49"
    },
    {
      "address": "1100 Cornerstone Street NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T3N1G9",
      "property_id": "375c406a94b04ae"
    },
    {
      "address": "1466 148 Avenue NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3P1T9",
      "property_id": "3855c10014e215d8"
    },
    {
      "address": "108 New Brighton Grove SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2Z1G4",
      "property_id": "3c1e2d58bd20d504"
    },
    {
      "address": "703 47 Street SE",
      "electricity_provider": "Grid",
      "garage_type_first": "None",
      "postal_code": "T2A1P7",
      "property_id": "3c9e7bb71208147c"
    },
    {
      "address": "133 Sovereign Common SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3C3Y3",
      "property_id": "3da28e7ffc2a02d4"
    },
    {
      "address": "103 Hidden Valley Manor NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T3A5V4",
      "property_id": "3e9699848b40cd0c"
    },
    {
      "address": "212 Parkwood Close SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2J3V6",
      "property_id": "3ed3edabf1df06d3"
    },
    {
      "address": "22 Nolanfield Terrace NW",
      "electricity_provider": "Solar",
      "garage_type_first": "Attached",
      "postal_code": "T3R0M4",
      "property_id": "4158175259d6d7b0"
    },
    {
      "address": "32 Skyview Springs Road NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3N0C3",
      "property_id": "416ba9cb2714b717"
    },
    {
      "address": "68 Elgin View SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2Z4Z6",
      "property_id": "4716813aca814e6b"
    },
    {
      "address": "125 Bridlewood Place SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2Y3P9",
      "property_id": "472f0f0b9fabb7bc"
    },
    {
      "address": "627 Tavender Road NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2K3M5",
      "property_id": "48fff1fba6037c1e"
    },
    {
      "address": "5 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "4a42736274964321"
    },
    {
      "address": "416 301 Redstone Boulevard",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3N1V6",
      "property_id": "4b8903cc5b0144c9"
    },
    {
      "address": "216 Nolancliff Crescent NW",
      "electricity_provider": "Solar",
      "garage_type_first": "Attached",
      "postal_code": "T3R0T4",
      "property_id": "4d1131d6e1f10bfa"
    },
    {
      "address": "516 Hunts Crescent NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2K4H9",
      "property_id": "4d78ffca5f294f26"
    },
    {
      "address": "5122 Rundleview Road NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T1Y1J4",
      "property_id": "52cb39f5aa7f2024"
    },
    {
      "address": "141 Walgrove Heath SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2X2H8",
      "property_id": "52f5aa80c09fab09"
    },
    {
      "address": "79 Cranleigh Close SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3M1H6",
      "property_id": "5577860f6b6f8bf1"
    },
    {
      "address": "141 28 Avenue NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2E2A9",
      "property_id": "55f84d31f1cf3882"
    },
    {
      "address": "144 Hawkwood Drive NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G2V8",
      "property_id": "56eaf3292c0563ea"
    },
    {
      "address": "145 301 Redstone Boulevard NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3N1V7",
      "property_id": "57d9bec5b04f7d39"
    },
    {
      "address": "21 Carrington Way NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3P0Y9",
      "property_id": "586651464ef2362c"
    },
    {
      "address": "32 Covehaven Terrace NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3K6H5",
      "property_id": "5b724565c989f2cc"
    },
    {
      "address": "11835 Elbow Drive SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2W1H1",
      "property_id": "5e5ce01e9076462f"
    },
    {
      "address": "240 Marina Grove SE",
      "electricity_provider": "Solar",
      "garage_type_first": "Attached",
      "postal_code": "T3M3J4",
      "property_id": "5f853daff21dae35"
    },
    {
      "address": "1370 Legacy Circle SE",
      "electricity_provider": "Solar",
      "garage_type_first": "Detached",
      "postal_code": "T2X2J4",
      "property_id": "607ee095d166dea5"
    },
    {
      "address": "7231 22 Street SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2C0W5",
      "property_id": "61e811b74122d288"
    },
    {
      "address": "75 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "6826678256d9961"
    },
    {
      "address": "36 Doverview Place SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2B1Z5",
      "property_id": "6ae85d557238c707"
    },
    {
      "address": "476 Millrise Drive SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2Y3E6",
      "property_id": "6c01feea99fcb54b"
    },
    {
      "address": "114 Hidden Creek Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3A6L8",
      "property_id": "6f7c174e48d34de4"
    },
    {
      "address": "71 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "7308a21b8071dbbd"
    },
    {
      "address": "39 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "7620b2a654bdea0c"
    },
    {
      "address": "349 Masters Road SE",
      "electricity_provider": "Solar",
      "garage_type_first": "Detached",
      "postal_code": "T3M2X3",
      "property_id": "79ace7c2c50cce63"
    },
    {
      "address": "137 Hidden Ranch Road",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T3A5S6",
      "property_id": "7ff2ab1233d24bfb"
    },
    {
      "address": "144 Saddlecrest Gardens NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3J0C3",
      "property_id": "810111a2165c5bfd"
    },
    {
      "address": "29 Walgrove Rise SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2X4E6",
      "property_id": "85e93be1bae846f1"
    },
    {
      "address": "4510 72 Street NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T3B2L4",
      "property_id": "8b15ef6af0104114"
    },
    {
      "address": "941 Riverview Place SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2C4K8",
      "property_id": "8d30f787b76e9c35"
    },
    {
      "address": "15 Deermont Place SE",
      "electricity_provider": "Grid",
      "garage_type_first": "None",
      "postal_code": "T2J5P5",
      "property_id": "8eb90f26942accab"
    },
    {
      "address": "79 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "8eece8879f40e7ef"
    },
    {
      "address": "528 Brookpark Drive SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2W2X8",
      "property_id": "8fcc9713d9be9bbe"
    },
    {
      "address": "34 Erin Grove SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2B3L1",
      "property_id": "948311eb104e35bb"
    },
    {
      "address": "2510 35 Street SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2B0X3",
      "property_id": "964c34ed4000abb5"
    },
    {
      "address": "2211 Olympia Drive SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2C1H6",
      "property_id": "96c2627446144c4d"
    },
    {
      "address": "5670 Brenner Crescent NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2L1Z4",
      "property_id": "985b0ea33e53c4b4"
    },
    {
      "address": "31 Cranarch Terrace SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3M1Z1",
      "property_id": "9969dc08c38cd9e9"
    },
    {
      "address": "32 Harvest Park Way NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3K4K8",
      "property_id": "9f726b48baa16243"
    },
    {
      "address": "17 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "a26b750d756de2c7"
    },
    {
      "address": "140 Hidden Hills Place NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T3A6E2",
      "property_id": "a3dfc0cc785a3517"
    },
    {
      "address": "385 Evansborough Way NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3P0R3",
      "property_id": "a4cc8e2abd89e6dc"
    },
    {
      "address": "8021 24 Street SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2C0Z4",
      "property_id": "a61e9d705dffc38c"
    },
    {
      "address": "67 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "a774f4cac6aeb21d"
    },
    {
      "address": "36 Castlebrook Way NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3J2A1",
      "property_id": "a7998c78549621c4"
    },
    {
      "address": "666 Evermeadow Road SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2Y4W7",
      "property_id": "a85abd213cd14578"
    },
    {
      "address": "648 Shawnee Terrace SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2Y0T5",
      "property_id": "aad85289ed8dff7f"
    },
    {
      "address": "240 Copperleaf Way SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2Z5G2",
      "property_id": "ab4ef96a209c851e"
    },
    {
      "address": "1501 3 Street NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2M2X9",
      "property_id": "ac4f8ca22ea1e79d"
    },
    {
      "address": "631 21 Avenue NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T2M1K1",
      "property_id": "ace90c03d3e6f13e"
    },
    {
      "address": "240 Carringvue Place NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3P2A5",
      "property_id": "af412225916b8ed4"
    },
    {
      "address": "3735 2 Avenue SW",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T3C0A2",
      "property_id": "b182caa1d5e9bbae"
    },
    {
      "address": "433 Coral Springs Place NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3J3R1",
      "property_id": "b3312d0fd385dd6a"
    },
    {
      "address": "264 Panatella Drive NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3K0T6",
      "property_id": "b577a00887e0ea2"
    },
    {
      "address": "27 2106 50 Street SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2B1M7",
      "property_id": "b5d7214f71eb779"
    },
    {
      "address": "27 2106 50 Avenue SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2B1M7",
      "property_id": "b8eac11caf968ac0"
    },
    {
      "address": "64 SEton Mews SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3M3G8",
      "property_id": "b95454c3eaa834fe"
    },
    {
      "address": "23 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "be83d079002f087"
    },
    {
      "address": "117 Saddlecreek Court NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3J4A4",
      "property_id": "bea1956681d54dc8"
    },
    {
      "address": "176 Cranfield Park SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3M1B6",
      "property_id": "bfc33232a5bd12c8"
    },
    {
      "address": "1 308 32 Avenue NE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2E2G9",
      "property_id": "c0c64751e7d60032"
    },
    {
      "address": "178 Rocky Ridge Close NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G4X2",
      "property_id": "c251484157f1a66c"
    },
    {
      "address": "655 Cranston Avenue SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3M2J5",
      "property_id": "c29434eb405d45f2"
    },
    {
      "address": "31 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "c4379fe4020f7e9b"
    },
    {
      "address": "23 Lake Crimson Close",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T2J3K8",
      "property_id": "c8831ed7b4079afb"
    },
    {
      "address": "32 Brookpark Rise SW",
      "electricity_provider": "Solar",
      "garage_type_first": "None",
      "postal_code": "T2W2X1",
      "property_id": "c9079d3b1a50d53"
    },
    {
      "address": "13 Royal Birch Cove NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3G5P9",
      "property_id": "cc7db843426f7a53"
    },
    {
      "address": "1549 Symons Valley Parkway NW",
      "electricity_provider": "Grid",
      "garage_type_first": "Attached",
      "postal_code": "T3P0R8",
      "property_id": "cdea45d57a724035"
    },
    {
      "address": "181 Auburn Meadows Way SE",
      "electricity_provider": "Grid",
      "garage_type_first": "Detached",
      "postal_code": "T3M2H8",
      "property_id": "cf4717639936119a"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 2
  },
  "price_quote": false,
  "result_total": 118,
  "time_ms": 68,
  "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"
  }
}

Geocoding addresses into the workflow

Most installer customer relationship management systems and dealership lead-management tools store addresses as freeform strings, not as latitude-longitude coordinates. Before any of the queries above can be tied back to a real customer record, the address has to resolve to a Houski property identifier. The geocoding endpoint handles that, taking a latitude and longitude pair (which most lead-management systems can already produce from a street address) and returning the matching property record. The block below is a live call against the real API:

API request
TypeScript code
const houski_data = async (): Promise<GeocodingResponse> => {

    // You must copy the GeocodingResponse type declarations from the 
    // Houski API documentation to strongly type the response

    const url = new URL('https://api.houski.ca/geocoding');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('latitude', '51.0447');
    url.searchParams.set('longitude', '-114.0719');
    url.searchParams.set('radius', '0.1');
    url.searchParams.set('shape', 'circle');

    const response = await fetch(url);
    const data = await response.json();

    return data;
}

(async () => {
let data: GeocodingResponse = await houski_data();

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 0.119999997317791,
  "data": [
    {
      "address": "0 Calgary",
      "property_id": "8a4f3aa57d75cc88"
    },
    {
      "address": "513 9 Avenue SW",
      "property_id": "e9baf46145362e25"
    },
    {
      "address": "520 9 Avenue SW",
      "property_id": "8808ff7c79ba3508"
    },
    {
      "address": "525 8 Avenue SW",
      "property_id": "301a806c3b139f6"
    },
    {
      "address": "505 8 Avenue SW",
      "property_id": "3848dc60cd88ee55"
    },
    {
      "address": "524 10 Avenue SW",
      "property_id": "cc8a04767d8753ff"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 2
  },
  "price_quote": false,
  "result_total": 8,
  "time_ms": 73
}

The response includes the resolved property identifier, latitude, longitude, and standardized address components. From there, a follow-up call to the properties endpoint with the property identifier returns the full field set including the 240V signals. The two calls together turn any inbound lead into a fully qualified record in under a second of API time.

A practical pattern for installer integrations is to run the geocoding call as soon as a lead comes in from the website form. The 240V signal lands on the lead record before the salesperson sees it, and the lead routing rules can prioritize the easy-install leads to the fast-quote queue while the panel-upgrade leads go to a different rep with the financing pitch loaded.

Building a charger-readiness score

The right way to use these fields together is to fold them into a single charger-readiness score that ranks every address in your service area from best to worst. Higher is better, always.

A workable scoring rubric looks like this.

SignalPoints
garage_240v_first is true40
garage_type_first is attached or detached enclosed15
garage_parking_space_first is two or more10
driveway_parking_space is two or more10
demographic_income_median_after_tax is at least $100,00010
demographic_transportation_car_truck_or_van_percent is at least 0.7510
construction_year is at least 20105

A property scoring 80 or higher is a fast-install, high-conversion lead. A property in the 50 to 79 range is worth a longer nurture sequence. Below 50 is best handled with a panel-upgrade financing message rather than a charger pitch.

The scoring runs cleanly in any language. The key is that the score is reproducible. If you run the same address through the rubric next quarter and the score moved from 60 to 85, that means something on the property changed in the source records, usually a new permit pull or a new listing. That score change is itself a buying signal.

Here is a Python implementation of the rubric that takes a property record from the API and returns a single score.

Python code
def charger_readiness_score(prop):
    score = 0

    if prop.get("garage_240v_first") is True:
        score += 40

    enclosed_garage_types = {"Attached", "Detached"}
    if prop.get("garage_type_first") in enclosed_garage_types:
        score += 15

    if (prop.get("garage_parking_space_first") or 0) >= 2:
        score += 10

    if (prop.get("driveway_parking_space") or 0) >= 2:
        score += 10

    if (prop.get("demographic_income_median_after_tax") or 0) >= 100000:
        score += 10

    car_pct = prop.get("demographic_transportation_car_truck_or_van_percent") or 0
    if car_pct >= 0.75:
        score += 10

    if (prop.get("construction_year") or 0) >= 2010:
        score += 5

    return score

Call this once per record returned from the properties endpoint, sort the resulting list, and you have a ranked install-target list ready to feed into a campaign tool. For a small installer with a 30 km service radius, this might return a few thousand top-tier addresses. For a national manufacturer planning rep territories, it might return hundreds of thousands across major Canadian cities, which then split out by region for the field sales team.

A more advanced version of this rubric weights the garage 240V signal even higher when paired with a recent construction year, because the chance that the field is accurate goes up when the source permit is recent. It also penalizes addresses where the data is sparse, by subtracting a small amount for each null field, so that a thin record never outranks a complete one.

Privacy and outreach ethics

A queryable per-address index of garage and panel readiness is a powerful tool, and it carries a corresponding responsibility. The right way to use it is at the aggregate and neighbourhood level for marketing planning, and at the individual address level only when the homeowner has given consent or asked for a quote.

Aggregate planning is fine. Counting how many garage-240V-ready homes exist in forward sortation area (FSA) M5V, the first three characters of the postal code, is no different from any other community statistic. Mailing a flyer to every address in that FSA with a generic "we install Level 2 chargers in your area" message is also fine. Where the line sits is at the point where you put a property-specific signal into the mail piece without consent. Sending a postcard that says "we know your garage already has 240V" without a relationship in place is creepy, will get reported, and will damage trust in the entire industry.

A reasonable rule is to use the per-address signal for internal qualification and routing only, and to use aggregate counts and community ratios for outbound. When a customer requests a quote, the per-address detail comes into play because the customer has invited you in. That is the line.

The Canadian Anti-Spam Legislation framework also kicks in on outbound email, and provincial private-sector privacy laws in Quebec, British Columbia, and Alberta have their own rules around using third-party data for direct marketing. None of these are deal-breakers. They just mean the smart play is to use the data to plan and to qualify, not to address-name in cold outreach.

A practical checklist for a marketing team rolling this kind of data into a campaign looks like this.

  1. Use aggregate-level signals to plan campaigns and pick neighbourhoods
  2. Use per-address signals only for internal qualification, routing, and quoting
  3. Strip per-address signals from any third-party ad platform upload
  4. Disclose data sources transparently when a customer asks where you got their information
  5. Honour any opt-out request immediately and across the entire data store, not just the current campaign

Following that checklist keeps you on the right side of both the regulators and the trust relationship with the customer. The companies in this space that grow long-term are the ones that earn that trust on day one, not the ones that try to buy speed with creepy outreach.

A closer look at the federal program landscape in 2026

The federal EV-charger programs administered by Natural Resources Canada are in a transitional moment in 2026. The original Zero Emission Vehicle Infrastructure Program (ZEVIP) put roughly $680 million into public and workplace charging between 2019 and 2024. The successor program is in mid-rollout this year and shifts a bigger share of the dollars toward residential and multi-unit residential building charging. The funding flows through provincial partners and through utility intermediaries, which means the per-province rebate landscape is the one that actually matters for an installer or manufacturer planning a 2026 campaign.

A summary of the major programs and notes for this spring.

ProgramRegionNotes
CleanBC Go Electric EV Charger RebateBritish ColumbiaUp to $350 per single-family Level 2 install, stacks with BC Hydro top-up to roughly $600
Roulez vert (Branche au travail)QuebecWorkplace and multi-unit residential focus, up to $5,000 per connector
Local distribution company programsOntarioNo provincial residential charger rebate, individual utilities such as Toronto Hydro offer managed-charging incentives
Efficiency Nova ScotiaNova ScotiaMulti-unit residential building charger program closed December 31, 2025, watch for any successor program
Prince Edward Island EV Charging FundingPrince Edward IslandUp to 75 percent of project costs for commercial, workplace, and multi-unit residential buildings, single-family residential is not covered

Layering the program eligibility onto the property list is the highest-leverage move you can make in a campaign. The customer cares about their out-of-pocket number, not the headline price. A rebate of $500 on a $1,800 install is the difference between a yes and a no for a meaningful share of the audience. Pre-calculating the post-rebate number for each address based on its province and utility lets the salesperson lead with that number, which is exactly the right pitch.

Python code
def post_rebate_quote(prop, base_install_cost):
    province = prop.get("province_abbreviation")
    utility = prop.get("electricity_provider")

    rebate = 0
    if province == "BC":
        rebate += 350
    if province == "QC":
        rebate += 600
    if utility == "BC Hydro":
        rebate += 250
    if utility == "Hydro-Quebec":
        rebate += 200

    return base_install_cost - rebate

The numbers above are illustrative and should be replaced with the live program amounts at the time the campaign runs. Most of these programs change at least once a year, sometimes mid-year, and the rebate logic has to be a living configuration, not a hardcoded constant.

What the next two years look like

The 2026 to 2028 window is when the residential EV charger market in Canada starts to look mature. The federal sales mandate will keep ratcheting whether or not the 2035 endpoint survives the political back-and-forth. Provincial mandates in British Columbia and Quebec are already pulling adoption past the federal target in those regions. The big-three private-sector dealership groups have invested heavily in EV inventory and they need the home-charging conversation to close more deals. Utility EV-program budgets are climbing year over year. All of this points to a residential charger installer market that is two or three times its current size by 2028.

The data layer underneath that market is the difference between commodity service businesses and software-enabled growth companies. The installer who treats every lead the same and quotes blindly is going to get squeezed on margin by the installer who pre-qualifies, routes intelligently, and pitches the right product to the right home. Manufacturers that want their installers to win need to provide that data layer or partner with companies that do. Utilities that want to manage load growth without expensive distribution upgrades need to know exactly which addresses are ready and which need help.

This is true today and it gets more true with every quarter that passes.

End-to-end workflow walk-through

To make the abstract concrete, here is a complete end-to-end flow that a small Toronto-area installer might run on a Sunday evening to populate the lead queue for the coming week.

Step one is pulling the eligible inventory by community. The installer's service area covers Mississauga, Brampton, Oakville, and the western half of Toronto proper. The team can handle about 25 install jobs a week, so the target is to land 60 to 80 high-quality leads to feed the funnel. The call below covers Mississauga, and you repeat the same call once per city in the service area and union the results client-side. The block below is a live call against the real API:

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', 'mississauga');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('garage_240v_first_eq', 'true');
    url.searchParams.set('property_type_in', 'House,Duplex');
    url.searchParams.set('province_abbreviation', 'on');
    url.searchParams.set('results_per_page', '100');
    url.searchParams.set('select', 'address,city,postal_code,community,garage_type_first,garage_parking_space_first,driveway_parking_space,demographic_income_median_after_tax,demographic_transportation_car_truck_or_van_percent,construction_year,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": 6.029999732971191,
  "data": [
    {
      "address": "3345 Burdock Place",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 2018,
      "demographic_income_median_after_tax": 41472,
      "demographic_transportation_car_truck_or_van_percent": 0.6973684430122375,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.588157653808594,
      "longitude": -79.62478637695312,
      "postal_code": "L5A4B7",
      "property_id": "11a5c3eb605d9542"
    },
    {
      "address": "2068 Waycross Crescent",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 2018,
      "demographic_income_median_after_tax": 44544,
      "demographic_transportation_car_truck_or_van_percent": 0.7777777910232544,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.528289794921875,
      "longitude": -79.66158294677734,
      "postal_code": "L5K1H9",
      "property_id": "1b2ecd29021c5d03"
    },
    {
      "address": "2404 Old Carriage Road",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 2018,
      "demographic_income_median_after_tax": 49664,
      "demographic_transportation_car_truck_or_van_percent": 0.8902438879013062,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.5517463684082,
      "longitude": -79.63970947265625,
      "postal_code": "L5C3G4",
      "property_id": "25e8c76b423a8581"
    },
    {
      "address": "1893 Beechknoll Avenue",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 2018,
      "demographic_income_median_after_tax": 56832,
      "demographic_transportation_car_truck_or_van_percent": 1.0,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.63882827758789,
      "longitude": -79.59874725341797,
      "postal_code": "L4W2G4",
      "property_id": "50272881a2c89186"
    },
    {
      "address": "2624 Comet Court",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 2018,
      "demographic_income_median_after_tax": 46592,
      "demographic_transportation_car_truck_or_van_percent": 0.8809523582458496,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.53556442260742,
      "longitude": -79.6657485961914,
      "postal_code": "L5K2S1",
      "property_id": "517ed4291047bed6"
    },
    {
      "address": "5596 Haddon Hall Road",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 2018,
      "demographic_income_median_after_tax": 46080,
      "demographic_transportation_car_truck_or_van_percent": 0.8918918967247009,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.568939208984375,
      "longitude": -79.72144317626953,
      "postal_code": "L5M5G4",
      "property_id": "8a9bd6597c2dd008"
    },
    {
      "address": "2598 Chalkwell Close",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 2018,
      "demographic_income_median_after_tax": 48128,
      "demographic_transportation_car_truck_or_van_percent": 0.8611111044883728,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.50922393798828,
      "longitude": -79.65294647216797,
      "postal_code": "L5J2B9",
      "property_id": "a83bb09f612b6f1f"
    },
    {
      "address": "10 Plainsman Road",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 1957,
      "demographic_income_median_after_tax": 57344,
      "demographic_transportation_car_truck_or_van_percent": 0.9285714030265808,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Detached",
      "latitude": 43.595420837402344,
      "longitude": -79.7231674194336,
      "postal_code": "L5N1C5",
      "property_id": "e181524975ace983"
    },
    {
      "address": "30 Theodore Drive",
      "city": "Mississauga",
      "community": "Central Erin Mills",
      "construction_year": 2018,
      "demographic_income_median_after_tax": 54272,
      "demographic_transportation_car_truck_or_van_percent": 0.8510638475418091,
      "driveway_parking_space": 2,
      "garage_parking_space_first": 0,
      "garage_type_first": "Attached",
      "latitude": 43.58228302001953,
      "longitude": -79.72515869140625,
      "postal_code": "L5M1E4",
      "property_id": "fb75a51575c67ae4"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": false,
    "has_previous_page": false,
    "page_total": 1
  },
  "price_quote": false,
  "result_total": 9,
  "time_ms": 92,
  "ui_info": {
    "city": "Mississauga",
    "city_id": "10e477e146f4168b",
    "city_link": "ca/on/mississauga",
    "city_slug": "mississauga",
    "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"
  }
}

Step two is running the readiness score against every record and sorting. Step three is pulling the top 500 into a campaign tool, deduping against the customer relationship management system to remove existing customers, and segmenting into two outreach tracks. The first track is digital, with a geofenced ad campaign keyed to the postal codes of the top scorers. The second track is direct, with a postcard mailer keyed to the community-level aggregate signal rather than the individual scores, to stay on the right side of the privacy norms discussed earlier.

Step four is measurement. Every booked consultation gets tagged with the source community and the readiness-score bucket it came from. After three weeks, the installer pulls the close-rate numbers by bucket and reweights the next campaign accordingly. The reweighting is what turns this from a one-time lift into a compounding advantage.

The whole flow takes about three hours of setup the first time and 20 minutes a week to refresh once it is dialed in. The underlying data calls for a service area this size fit comfortably inside the $99 USD monthly minimum. The lift in close rate from 12 percent to 22 percent on a 25-job weekly cadence is the difference between a healthy small business and a struggling one.

Operational tips from the field

A few patterns installers and manufacturers get wrong when they first try to run this kind of data-driven targeting. Worth flagging so you can skip the lessons and go straight to the result.

The first mistake is treating null as false. If garage_240v_first is null, that does not mean the garage lacks a 240V circuit. It means the source records do not say either way. The right move is to send those addresses through a slightly different funnel that includes a quick pre-quote question about existing electrical, rather than excluding them from outreach entirely. A reasonable share of nulls are actually 240V-ready, and excluding them leaves real revenue on the table.

The second mistake is over-filtering. The temptation when a powerful query API lands in your hands is to stack 15 filters and look at the result. The result is usually a list of 12 addresses that look perfect. The better discipline is to pick three or four high-signal filters, get a list in the hundreds or thousands, and then rank the list with a score. Filtering eliminates and is permanent. Scoring sorts and is recoverable.

The third mistake is skipping the rebate-program overlay. Every province and most major utilities have rebate programs that change the install economics. The 240V-ready home is worth less to the installer if the local rebate program only covers panel-upgrade situations. The not-yet-ready home is worth more to the installer if the same rebate covers the full upgrade plus the charger. Tying the readiness data to the live rebate landscape is what separates an okay campaign from a great one.

The fourth mistake is forgetting to refresh. Houski's underlying data changes monthly as new records arrive from public, government, and crowdsourced data sources. A list pulled today will be roughly 80 to 90 percent the same in six months, but the new entrants are exactly the homes that are most likely to convert because something on the property changed recently for a reason. Rerun the queries quarterly at a minimum and tie the deltas into a re-engagement campaign.

The fifth mistake is treating this like a one-shot data project rather than a continuous integration. The companies winning in residential EV charging right now have data-driven targeting wired into their entire operating rhythm. The list refreshes nightly. The lead routing rules update with each new property record. The quote-generation tool pulls the latest readiness signal at the moment the salesperson opens the file. The data is just plumbing, but well-laid plumbing is the difference between a 12 percent close rate and a 28 percent close rate.

Get started

The home-charger market in Canada is past the early-adopter phase and into the messy middle. The customers exist, the hardware is mature, and the missing piece is the qualification layer that tells everyone in the value chain which addresses are easy installs before anyone spends marketing dollars on them. Houski's combination of garage_240v_first, garage_240v_second, garage_type_first, parking-space counts, and the demographic and utility-provider context around them is that layer, and the shared-amenity fields extend it into condos and townhouses.

Spin up an API key and pull your first list of EV-ready homes at /api-documentation/quick-start. Pricing starts at $99 a month, and the field reference shows every garage, parking, electrical, and demographic field across 19 million-plus Canadian properties. If you would rather start from a packaged extract than an integration, the datasets page covers custom pulls built to your spec. And if you already buy this kind of data from a third-party vendor, pull a hundred records for your top market, run them through the readiness rubric, and compare the result against what you pay for today.