Zero-emission vehicles are a growing share of new light-duty registrations in Canada, with British Columbia and Quebec well above the national average. Federal and provincial policy keeps shifting, but adoption keeps 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 an afternoon and the quote stays small. If the home needs a service upgrade from 100A to 200A plus a new circuit run, the quote multiplies 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 the United States and 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 real money for every booked consultation. A large share of consultations turn 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 residential property in the United States and Canada with three things attached.
- Whether the primary garage already has a 240V circuit
- The garage type, parking count, and driveway configuration
- 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. Many homes with a 240V garage circuit got it during a hot tub install 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 an index that is not perfect, because no national index of in-home electrical detail can be perfect, and coverage varies from market to market. Check the null share in your own market before you build a campaign around it.
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:
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);
})();
{
"cache_hit": true,
"cost_cents": 1.0,
"data": [
{
"aggregation": "count",
"field": "property_id",
"value": "5"
}
],
"error": "",
"price_quote": false,
"time_ms": 9
}
Stitch the per-community responses together, sort that descending, and you have your top 20 neighbourhoods to canvas first. Expect newer builds near the top, 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, most of all in cities 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:
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);
})();
{
"cache_hit": true,
"cost_cents": 9.659999,
"data": [
{
"address": "11 Canmore Boulevard",
"city": "Toronto",
"demographic_income_median_after_tax": 119361,
"driveway_parking_space": 2,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.792873,
"longitude": -79.18423,
"postal_code": "M1C3T3",
"property_id": "ccb7cf9890d02ad9"
},
{
"address": "27 Piggott Mews",
"city": "Toronto",
"demographic_income_median_after_tax": 92836,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.707294,
"longitude": -79.53154,
"postal_code": "M9N0A4",
"property_id": "f4015bb5ddbba0b0"
},
{
"address": "26 Paultiel Drive",
"city": "Toronto",
"demographic_income_median_after_tax": 143475,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.79835,
"longitude": -79.3994,
"postal_code": "M2M3P3",
"property_id": "1ea0e81b6917b1f3"
},
{
"address": "18 Nevada Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 143475,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.799305,
"longitude": -79.399445,
"postal_code": "M2M3N8",
"property_id": "95a98ca4e5c04e64"
},
{
"address": "88 Fairview Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 127801,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Detached",
"latitude": 43.660137,
"longitude": -79.47674,
"postal_code": "M6P3A4",
"property_id": "55472fb0c0918761"
},
{
"address": "28 Rainbow Ridge Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 110921,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.805332,
"longitude": -79.16528,
"postal_code": "M1B2H8",
"property_id": "689886de7aaa4364"
},
{
"address": "17 Locust Lodge Gardens",
"city": "Toronto",
"demographic_income_median_after_tax": 109716,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.733517,
"longitude": -79.47748,
"postal_code": "M3K0A9",
"property_id": "15466550823429f5"
},
{
"address": "989 St Clarens Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 80780,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Detached",
"latitude": 43.67334,
"longitude": -79.4478,
"postal_code": "M6H2X8",
"property_id": "1d344ba941302846"
},
{
"address": "16 Bergen Road",
"city": "Toronto",
"demographic_income_median_after_tax": 108510,
"driveway_parking_space": 2,
"garage_parking_space_first": 1,
"garage_type_first": "Detached",
"latitude": 43.753307,
"longitude": -79.28609,
"postal_code": "M1P1R9",
"property_id": "4414f02c40a14d9d"
},
{
"address": "20 30 Dundalk Drive",
"city": "Toronto",
"demographic_income_median_after_tax": 63659,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.765232,
"longitude": -79.28373,
"postal_code": "M1P4W1",
"property_id": "735a4105607ad2eb"
},
{
"address": "9 Tynevale Drive",
"city": "Toronto",
"demographic_income_median_after_tax": 122978,
"driveway_parking_space": 6,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.685963,
"longitude": -79.55869,
"postal_code": "M9R2B3",
"property_id": "f3478113fa35a83a"
},
{
"address": "77 Rumsey Road",
"city": "Toronto",
"demographic_income_median_after_tax": 155531,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.704197,
"longitude": -79.36673,
"postal_code": "M4G0C4",
"property_id": "f96955ca97b757f6"
},
{
"address": "385 McRoberts Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 96453,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Detached",
"latitude": 43.68509,
"longitude": -79.4572,
"postal_code": "M6E4P9",
"property_id": "38b9ca208da9a2a6"
},
{
"address": "54 Sloley Road",
"city": "Toronto",
"demographic_income_median_after_tax": 125390,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.72064,
"longitude": -79.23045,
"postal_code": "M1M1C8",
"property_id": "a73877ef1a2c13a8"
},
{
"address": "209 Ellerslie Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 118156,
"driveway_parking_space": 4,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.769047,
"longitude": -79.4234,
"postal_code": "M2N1Y3",
"property_id": "b17118c4e55baf44"
},
{
"address": "165 Galley Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 94042,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Detached",
"latitude": 43.64242,
"longitude": -79.44877,
"postal_code": "M6R1H3",
"property_id": "58fb34dd34bf8d57"
},
{
"address": "25 Cardell Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 94645,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Detached",
"latitude": 43.709095,
"longitude": -79.536514,
"postal_code": "M9N1S4",
"property_id": "c39f0278b3606790"
},
{
"address": "204 Westview Boulevard",
"city": "Toronto",
"demographic_income_median_after_tax": 63659,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Detached",
"latitude": 43.71239,
"longitude": -79.30642,
"postal_code": "M4B3J6",
"property_id": "a8e4487f25aa91f8"
},
{
"address": "41 San Remo Terrace",
"city": "Toronto",
"demographic_income_median_after_tax": 157943,
"driveway_parking_space": 2,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.621246,
"longitude": -79.50618,
"postal_code": "M8Z6C6",
"property_id": "dd3870453e6da61c"
},
{
"address": "174 Burnhamthorpe Road",
"city": "Toronto",
"demographic_income_median_after_tax": 136241,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.65054,
"longitude": -79.537704,
"postal_code": "M9A1H6",
"property_id": "5fea395e0ecac26b"
},
{
"address": "68 Hertle Avenue",
"city": "Toronto",
"demographic_income_median_after_tax": 109716,
"driveway_parking_space": 1,
"garage_parking_space_first": 0,
"garage_type_first": "Detached",
"latitude": 43.668907,
"longitude": -79.32549,
"postal_code": "M4L2T4",
"property_id": "b3c82431e9fce22f"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": false,
"has_previous_page": false,
"page_total": 1
},
"price_quote": false,
"result_total": 21,
"time_ms": 46,
"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 gives the dealership a margin and lets the installer skip 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. "A good share of the homes in your neighbourhood already have a 240V garage circuit, 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:
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);
})();
{
"cache_hit": true,
"cost_cents": 1.0,
"data": [
{
"aggregation": "count",
"field": "property_id",
"value": "4"
}
],
"error": "",
"price_quote": false,
"time_ms": 18
}
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 market, 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:
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);
})();
{
"cache_hit": true,
"cost_cents": 8.799999,
"data": [
{
"address": "1 3435 Du Fort-Rolland Rue",
"community": "Lachine",
"construction_year": 1940,
"demographic_income_median_after_tax": 72822,
"garage_parking_space_first": 0,
"postal_code": "H8T1V5",
"property_id": "10040c44e19b0d54",
"shared_garage_240v_first": false
},
{
"address": "1065 Terrasse Louis-Basile-Pigeon",
"community": "Lachine",
"construction_year": 1993,
"demographic_income_median_after_tax": 118156,
"garage_parking_space_first": 0,
"postal_code": "H8S4L7",
"property_id": "100de9f9aeb4176f",
"shared_garage_240v_first": false
},
{
"address": "106 3860 Du Fort-Rolland Rue",
"community": "Lachine",
"construction_year": 1940,
"demographic_income_median_after_tax": 60283,
"garage_parking_space_first": 0,
"postal_code": "H8T1V9",
"property_id": "102f149d2524407e",
"shared_garage_240v_first": false
},
{
"address": "384 Skaniatarati Avenue",
"community": "Lachine",
"construction_year": 2020,
"demographic_income_median_after_tax": 65106,
"garage_parking_space_first": 0,
"postal_code": "H8S0C1",
"property_id": "103a5e0503338961",
"shared_garage_240v_first": false
},
{
"address": "2860 Sherbrooke Rue",
"community": "Lachine",
"construction_year": 1987,
"demographic_income_median_after_tax": 92836,
"garage_parking_space_first": 0,
"postal_code": "H8S4G4",
"property_id": "103a78248261a434",
"shared_garage_240v_first": false
},
{
"address": "1469 Rue Notre-Dame",
"community": "Lachine",
"construction_year": 1969,
"demographic_income_median_after_tax": 59801,
"garage_parking_space_first": 0,
"postal_code": "H8S3M2",
"property_id": "1049733112ca4c83",
"shared_garage_240v_first": false
},
{
"address": "1000 Rue St-Louis",
"community": "Lachine",
"construction_year": 2001,
"demographic_income_median_after_tax": 57872,
"garage_parking_space_first": 0,
"postal_code": "H8S2K2",
"property_id": "106f80e2a021905",
"shared_garage_240v_first": false
},
{
"address": "432 Avenue Emile-Pominville",
"community": "Lachine",
"construction_year": 2008,
"demographic_income_median_after_tax": 86808,
"garage_parking_space_first": 0,
"postal_code": "H8R4C2",
"property_id": "107197f14567a913",
"shared_garage_240v_first": false
},
{
"address": "1190 Louis-Basile-Pigeon Terrasse",
"community": "Lachine",
"construction_year": 1993,
"demographic_income_median_after_tax": 92836,
"garage_parking_space_first": 0,
"postal_code": "H8S4L6",
"property_id": "10822fc0f787e069",
"shared_garage_240v_first": false
},
{
"address": "461 16 Avenue",
"community": "Lachine",
"construction_year": 1900,
"demographic_income_median_after_tax": 69446,
"garage_parking_space_first": 0,
"postal_code": "H8S3M9",
"property_id": "1083fa0f1ef7803b",
"shared_garage_240v_first": false
},
{
"address": "2630 Sherbrooke Rue",
"community": "Lachine",
"construction_year": 1987,
"demographic_income_median_after_tax": 92836,
"garage_parking_space_first": 0,
"postal_code": "H8S4G4",
"property_id": "1086a43f2296ff9c",
"shared_garage_240v_first": false
},
{
"address": "477 Avenue J-Alphonse-Lachance",
"community": "Lachine",
"construction_year": 2012,
"demographic_income_median_after_tax": 86808,
"garage_parking_space_first": 0,
"postal_code": "H8R0B6",
"property_id": "10881c29a479ed2",
"shared_garage_240v_first": false
},
{
"address": "957 Gameroff Rue",
"community": "Lachine",
"construction_year": 2007,
"demographic_income_median_after_tax": 107304,
"garage_parking_space_first": 0,
"postal_code": "H8T3R5",
"property_id": "10910428d9aff541",
"shared_garage_240v_first": false
},
{
"address": "3383 J-A-Descarries Rue",
"community": "Lachine",
"construction_year": 1991,
"demographic_income_median_after_tax": 107304,
"garage_parking_space_first": 0,
"postal_code": "H8T3N1",
"property_id": "109a5086256d765b",
"shared_garage_240v_first": false
},
{
"address": "819 Gameroff Rue",
"community": "Lachine",
"construction_year": 2006,
"demographic_income_median_after_tax": 107304,
"garage_parking_space_first": 0,
"postal_code": "H8T3R4",
"property_id": "10b24135a9f80cb1",
"shared_garage_240v_first": false
},
{
"address": "446 Jenkins Avenue",
"community": "Lachine",
"construction_year": 2019,
"demographic_income_median_after_tax": 65106,
"garage_parking_space_first": 0,
"postal_code": "H8S0B5",
"property_id": "10c22dfc3de57cfa",
"shared_garage_240v_first": false
},
{
"address": "642 Victoria Rue",
"community": "Lachine",
"construction_year": 1997,
"demographic_income_median_after_tax": 63659,
"garage_parking_space_first": 0,
"postal_code": "H8S1Y7",
"property_id": "10d3f820a63425b4",
"shared_garage_240v_first": false
},
{
"address": "102 653 Du Ruisseau Terrasse",
"community": "Lachine",
"construction_year": 1993,
"demographic_income_median_after_tax": 107304,
"garage_parking_space_first": 0,
"postal_code": "H8T3L7",
"property_id": "10f12406b72a08db",
"shared_garage_240v_first": false
},
{
"address": "234 Rue Richmond",
"community": "Lachine",
"construction_year": 1984,
"demographic_income_median_after_tax": 57390,
"garage_parking_space_first": 0,
"postal_code": "H8R1L7",
"property_id": "10f524726ce3b2d4",
"shared_garage_240v_first": false
},
{
"address": "2778 Rue Victoria",
"community": "Lachine",
"construction_year": 1997,
"demographic_income_median_after_tax": 52085,
"garage_parking_space_first": 0,
"postal_code": "H8S1Z3",
"property_id": "110c72947d0e2bae",
"shared_garage_240v_first": false
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 9945
},
"price_quote": false,
"result_total": 198899,
"time_ms": 53,
"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 a single stall to a whole 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 will need to retrofit conduit and transformer capacity as EV-ready building rules spread.
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, measured for the neighbourhood around each address.
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:
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);
})();
{
"cache_hit": true,
"cost_cents": 3.0799997,
"data": [
{
"address": "1492 Agnew Road",
"community": "Unknown",
"demographic_income_median_after_tax": 160354,
"demographic_transportation_car_truck_or_van_percent": 0.9,
"driveway_parking_space": 1,
"garage_type_first": "Attached",
"postal_code": "L5J3G9",
"property_id": "2d5b6d9b9ffea894"
},
{
"address": "420 Abington Avenue",
"community": "Unknown",
"demographic_income_median_after_tax": 136241,
"demographic_transportation_car_truck_or_van_percent": 0.9,
"driveway_parking_space": 1,
"garage_type_first": "Attached",
"postal_code": "L5A1L7",
"property_id": "33b6f4ee0fcaedd4"
},
{
"address": "301 Kingsbridge Garden Circle",
"community": "Unknown",
"demographic_income_median_after_tax": 127801,
"demographic_transportation_car_truck_or_van_percent": 1.0,
"driveway_parking_space": 1,
"garage_type_first": "Attached",
"postal_code": "L5R1L2",
"property_id": "3b833c9c9a790e72"
},
{
"address": "1077 Windsor Hill Boulevard",
"community": "Unknown",
"demographic_income_median_after_tax": 106099,
"demographic_transportation_car_truck_or_van_percent": 0.96,
"driveway_parking_space": 2,
"garage_type_first": "Attached",
"postal_code": "L5V1P4",
"property_id": "601192ac91f3c4c6"
},
{
"address": "5596 Haddon Hall Road",
"community": "Unknown",
"demographic_income_median_after_tax": 142269,
"demographic_transportation_car_truck_or_van_percent": 0.8918919,
"driveway_parking_space": 1,
"garage_type_first": "Attached",
"postal_code": "L5M5G4",
"property_id": "8a9bd6597c2dd008"
},
{
"address": "2132 Denise Road",
"community": "Unknown",
"demographic_income_median_after_tax": 125390,
"demographic_transportation_car_truck_or_van_percent": 0.83870965,
"driveway_parking_space": 2,
"garage_type_first": "Attached",
"postal_code": "L4X1J1",
"property_id": "b197fa9150d6ed21"
},
{
"address": "7238 Lowville Heights",
"community": "Unknown",
"demographic_income_median_after_tax": 153120,
"demographic_transportation_car_truck_or_van_percent": 0.90697676,
"driveway_parking_space": 1,
"garage_type_first": "Attached",
"postal_code": "L5N8L3",
"property_id": "d8fc545ecd88ce7c"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": false,
"has_previous_page": false,
"page_total": 1
},
"price_quote": false,
"result_total": 7,
"time_ms": 23,
"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"
}
}
Add driveway_parking_space_gte=2 when the second charger matters. 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.
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 point toward second-charger sales.
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. Households with room for a recreational vehicle are a natural audience for plug-in pickup trucks and the chargers that go with them.
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:
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);
})();
{
"cache_hit": true,
"cost_cents": 23.000002,
"data": [
{
"address": "174 Rowley Gate NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3L0H7",
"property_id": "c189067504c87ecc"
},
{
"address": "74 Hallbrook Place SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2V3H9",
"property_id": "90dd339455fdb979"
},
{
"address": "3252 18 Street SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2T1W2",
"property_id": "4b18d44e4ad480bc"
},
{
"address": "12 Cranbrook Cape SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3M3L5",
"property_id": "18bc25ce727a6641"
},
{
"address": "201 Cranberry Place SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3M0G7",
"property_id": "5c3c0c911a68ee13"
},
{
"address": "31 Cramond Green SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3M1J8",
"property_id": "92ff5f10cbc80777"
},
{
"address": "655 Cranston Avenue SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3M2J5",
"property_id": "c29434eb405d45f2"
},
{
"address": "26 Cranbrook Cove SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3M2S9",
"property_id": "eff3fe62c6bec3bb"
},
{
"address": "414 Silverado Way SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2X0R4",
"property_id": "b17c6ee9c278e62f"
},
{
"address": "277 Silverado Plains Park SW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T2X1Y8",
"property_id": "c7fde15e4df8de59"
},
{
"address": "2038 41 Avenue SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2T2M1",
"property_id": "268ed90db2e8dac1"
},
{
"address": "4715 15 Street SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2T4B5",
"property_id": "2ebf132b2a47f36f"
},
{
"address": "5026 22 Street SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2T5G9",
"property_id": "8aa3464b55813e7"
},
{
"address": "348 Avonburn Road SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2H1N8",
"property_id": "4731d98ff7bc007b"
},
{
"address": "621 Agate Crescent SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2J0Z4",
"property_id": "d852e498028eced1"
},
{
"address": "96 Royal Birch Crescent NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3G5N8",
"property_id": "68170a0b6feb59b2"
},
{
"address": "44 Westpark Crescent SW",
"electricity_provider": "Solar",
"garage_type_first": "Attached",
"postal_code": "T3H0C3",
"property_id": "226f33254f58ed02"
},
{
"address": "119 Marlyn Place NE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2A3K9",
"property_id": "baa418dd8326adfc"
},
{
"address": "123 Kincora Point NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3R0A5",
"property_id": "fcaff0ec37383711"
},
{
"address": "155 Strathcona Close SW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3H1L2",
"property_id": "c3eedcc5c0b5feaf"
},
{
"address": "3832 40 Avenue NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3A0W9",
"property_id": "458f844df11350f7"
},
{
"address": "276 Fallswater Road NE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3J1B3",
"property_id": "24137f674c6b0d52"
},
{
"address": "34 Erin Grove SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T2B3L1",
"property_id": "948311eb104e35bb"
},
{
"address": "100 Erin Woods Boulevard SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2B2R1",
"property_id": "f195afe790c87d40"
},
{
"address": "151 Erin Park Close SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2B2V6",
"property_id": "f69294b08826e3db"
},
{
"address": "63 Edenstone Way NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3A3Z1",
"property_id": "998b51047b2209c8"
},
{
"address": "302 Woodvale Crescent SW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T2W3P3",
"property_id": "149b59bfbba3f2eb"
},
{
"address": "1003 Olympia Crescent SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2C1G6",
"property_id": "67987b5b3ec3df6d"
},
{
"address": "8012 25 Street SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2C1A9",
"property_id": "b80d142c4e82729a"
},
{
"address": "43 23 Glamis Drive SW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3E6S3",
"property_id": "10a30067bf6f700d"
},
{
"address": "215 Scenic Way NW",
"electricity_provider": "Solar",
"garage_type_first": "Detached",
"postal_code": "T3L1B6",
"property_id": "44aca9a52bc4f58c"
},
{
"address": "98 Tuscany Valley Way NW",
"electricity_provider": "Solar",
"garage_type_first": "Detached",
"postal_code": "T3L2B6",
"property_id": "6cdcf94412998f7e"
},
{
"address": "6 Tusslewood Heights NW",
"electricity_provider": "Solar",
"garage_type_first": "Attached",
"postal_code": "T3L2M6",
"property_id": "7e6c892d5795d133"
},
{
"address": "103 Hidden Valley Manor NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3A5V4",
"property_id": "3e9699848b40cd0c"
},
{
"address": "140 Hidden Hills Place NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3A6E2",
"property_id": "a3dfc0cc785a3517"
},
{
"address": "108 New Brighton Grove SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2Z1G4",
"property_id": "3c1e2d58bd20d504"
},
{
"address": "3077 New Brighton Grove SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2Z1G3",
"property_id": "f1c9718242b0f02d"
},
{
"address": "915 5 Street NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2N1R3",
"property_id": "af3edab5465d3fc4"
},
{
"address": "211 Oakridge Place SW",
"electricity_provider": "Solar",
"garage_type_first": "Detached",
"postal_code": "T2V1V2",
"property_id": "1872f3dfb248968"
},
{
"address": "3344 Palliser Drive SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2V4K7",
"property_id": "d75331f85213aa49"
},
{
"address": "22 Nolanfield Terrace NW",
"electricity_provider": "Solar",
"garage_type_first": "Detached",
"postal_code": "T3R0M4",
"property_id": "4158175259d6d7b0"
},
{
"address": "216 Nolancliff Crescent NW",
"electricity_provider": "Solar",
"garage_type_first": "Attached",
"postal_code": "T3R0T4",
"property_id": "4d1131d6e1f10bfa"
},
{
"address": "42 Nolanfield Terrace NW",
"electricity_provider": "Solar",
"garage_type_first": "Detached",
"postal_code": "T3R0M5",
"property_id": "a4e400d5fa00503a"
},
{
"address": "12 Amblehurst Link NW",
"electricity_provider": "Solar",
"garage_type_first": "Attached",
"postal_code": "T3P1W9",
"property_id": "7e597f31a4e70fa"
},
{
"address": "103 Citadel Acres Close NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3G5A8",
"property_id": "3fceb839c7a05f47"
},
{
"address": "11 Citadel Acres Close NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3G5A7",
"property_id": "ff5812cfbfb24c83"
},
{
"address": "157 Carrington Crescent NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3P1R2",
"property_id": "1655bf0f3b790ab3"
},
{
"address": "21 Carrington Way NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3P0Y9",
"property_id": "586651464ef2362c"
},
{
"address": "2323 1 Street NE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T2E9E6",
"property_id": "874f918ada88f51"
},
{
"address": "206 Valley Crest Court NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3B5Z1",
"property_id": "937f1b04e3c2d31f"
},
{
"address": "528 Brookpark Drive SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2W2X8",
"property_id": "8fcc9713d9be9bbe"
},
{
"address": "7207 7 Street SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2V1G1",
"property_id": "e1f866c8be77b489"
},
{
"address": "121 Ranchlands Court NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3G1N8",
"property_id": "3c0ad21dd4fa5c23"
},
{
"address": "539 Ranchview Place NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3G1B4",
"property_id": "724ae76f61d1d16f"
},
{
"address": "224 Ranchridge Bay NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3G1V4",
"property_id": "7c30f4991f9db253"
},
{
"address": "8004 Ranchview Drive NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3G1T1",
"property_id": "89c6f7abb58e2e66"
},
{
"address": "433 Harvest Lake Drive NE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3K4B9",
"property_id": "4ab44b455d8831f4"
},
{
"address": "108 Harvest Hills Drive NE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3K3X4",
"property_id": "9c7a1ae1ee2c6671"
},
{
"address": "316 Harvest Rose Circle NE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3K4P5",
"property_id": "aaf569a75eeea576"
},
{
"address": "212 Harvest Wood Way NE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3K3X7",
"property_id": "fe46539d3c969799"
},
{
"address": "12028 Canfield Road SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2W1V2",
"property_id": "3f83dd39f914025b"
},
{
"address": "12919 Candle Crescent SW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T2W5R8",
"property_id": "8462fd3014a32fb5"
},
{
"address": "74 Douglas Glen Green SE",
"electricity_provider": "Solar",
"garage_type_first": "Attached",
"postal_code": "T2Z2M9",
"property_id": "e8f22e6bb8f8a283"
},
{
"address": "4719 Charleswood Drive NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2L2E6",
"property_id": "6e87bb057a15a8f3"
},
{
"address": "47 Rockywood Park NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3G5S2",
"property_id": "d7a94ee3f84a7d62"
},
{
"address": "29 Autumn Terrace SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3M0H3",
"property_id": "497321b20e7d45"
},
{
"address": "79 Auburn Meadows Street SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3M2S1",
"property_id": "875cc26b721949ee"
},
{
"address": "366 Auburn Crest Way SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3M1R1",
"property_id": "9aafae9b71904d70"
},
{
"address": "93 Auburn Meadows View SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3M2C9",
"property_id": "9e1d2872d62808ab"
},
{
"address": "54 Auburn Crest Green SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3M0Z2",
"property_id": "d29ffe8adeb23815"
},
{
"address": "426 Auburn Crest Way SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3M1P9",
"property_id": "e6f3a6b64d7e8680"
},
{
"address": "827 Lake Emerald Place SE",
"electricity_provider": "Geothermal",
"garage_type_first": "Detached",
"postal_code": "T2J2J9",
"property_id": "68640e2e4eb13c61"
},
{
"address": "23 Lake Crimson Close",
"electricity_provider": "Geothermal",
"garage_type_first": "Attached",
"postal_code": "T2J3K8",
"property_id": "c8831ed7b4079afb"
},
{
"address": "3248 Dovercliffe Road SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2B1W2",
"property_id": "27efafc00f240d8e"
},
{
"address": "111 Wolf Hollow Park SE",
"electricity_provider": "Solar",
"garage_type_first": "Detached",
"postal_code": "T2X4M8",
"property_id": "38078ed66bcb93d"
},
{
"address": "155 Wolf Creek Avenue SE",
"electricity_provider": "Solar",
"garage_type_first": "Detached",
"postal_code": "T2X4V1",
"property_id": "e99c0ba64e2dfbdd"
},
{
"address": "1014 5 Avenue NE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2E0L4",
"property_id": "48fe8fb849174903"
},
{
"address": "255 Tremblant Way SW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3H0B7",
"property_id": "c03e5850dd04be3f"
},
{
"address": "48 Coulee Park SW",
"electricity_provider": "Solar",
"garage_type_first": "Attached",
"postal_code": "T3H5J5",
"property_id": "77b48a096fefddb2"
},
{
"address": "50 Seton Parade SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3M3C6",
"property_id": "c10e12b1a412c654"
},
{
"address": "67 Setonstone Row SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3M3S1",
"property_id": "c94851d87b71a837"
},
{
"address": "167 Cambrai Avenue SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2T6J5",
"property_id": "bd81d40d40afc0cb"
},
{
"address": "39 Westwood Drive SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3C2V8",
"property_id": "7a781da39bd28b2c"
},
{
"address": "2526 3 Avenue NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2N0L3",
"property_id": "b50f56c66aa9551d"
},
{
"address": "291 Arbour Grove Close NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3G4J3",
"property_id": "26fb0efda40d442b"
},
{
"address": "71 Arbour Wood Close NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3G4A8",
"property_id": "9e9632d66929d18"
},
{
"address": "105 Arbour Ridge Circle NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3G3Y9",
"property_id": "e8e1f213c665b62e"
},
{
"address": "17 Skyview Point Common NE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3N0H1",
"property_id": "4d7bd8bc02bae9d1"
},
{
"address": "317 Skyview Springs Gardens NE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T3N0B6",
"property_id": "72d9c814e6c52765"
},
{
"address": "659 Buffaloberry Manor SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3M3Z3",
"property_id": "19a99d3b45157cff"
},
{
"address": "261 Creekside Boulevard SW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2X4X9",
"property_id": "fd5c9dedb72b1858"
},
{
"address": "159 McKenzie Towne Gate SE",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T2Z4G2",
"property_id": "13670cd70d7a20b0"
},
{
"address": "68 Elgin View SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2Z4Z6",
"property_id": "4716813aca814e6b"
},
{
"address": "1076 Prestwick Circle SE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2Z3M2",
"property_id": "6d124583e97844d9"
},
{
"address": "28 Canyon Drive NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2L0R3",
"property_id": "bfc32f10d130d932"
},
{
"address": "1015 MacKid Road NE",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2E6A8",
"property_id": "3135446d94a07c0a"
},
{
"address": "1815 4 Street NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2M2Z3",
"property_id": "8395235de1ed73ee"
},
{
"address": "327 Panatella Court NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3K5Y1",
"property_id": "72573e526688edfb"
},
{
"address": "95 Panton Road NW",
"electricity_provider": "Grid",
"garage_type_first": "Attached",
"postal_code": "T3K0X8",
"property_id": "dbdfa17607dea6e1"
},
{
"address": "1615 22 Avenue NW",
"electricity_provider": "Grid",
"garage_type_first": "Detached",
"postal_code": "T2M1R4",
"property_id": "d2ac27127414e7e5"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 2
},
"price_quote": false,
"result_total": 148,
"time_ms": 23,
"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 search endpoint takes the free-text address string and returns the matching property. When the lead system already holds a latitude and longitude pair, the geocoding endpoint returns the properties around that point instead. The block below is a live call against the real API:
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);
})();
{
"cache_hit": true,
"cost_cents": 0.12,
"data": [
{
"address": "513 9 Avenue SW",
"property_id": "e9baf46145362e25"
},
{
"address": "520 9 Avenue SW",
"property_id": "8808ff7c79ba3508"
},
{
"address": "404 9 Avenue SW",
"property_id": "4b31244b21b9173a"
},
{
"address": "525 8 Avenue SW",
"property_id": "301a806c3b139f6"
},
{
"address": "524 10 Avenue SW",
"property_id": "cc8a04767d8753ff"
},
{
"address": "505 8 Avenue SW",
"property_id": "3848dc60cd88ee55"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 2
},
"price_quote": false,
"result_total": 8,
"time_ms": 728
}
The response includes each property's 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 search 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.
| Signal | Points |
|---|---|
| garage_240v_first is true | 40 |
| garage_type_first is attached or detached enclosed | 15 |
| garage_parking_space_first is two or more | 10 |
| driveway_parking_space is two or more | 10 |
| demographic_income_median_after_tax is at least $100,000 | 10 |
| demographic_transportation_car_truck_or_van_percent is at least 0.75 | 10 |
| construction_year is at least 2010 | 5 |
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.
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 cities in both countries, 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 still describes the garage goes up when the home is newer. 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.
- Use aggregate-level signals to plan campaigns and pick neighbourhoods
- Use per-address signals only for internal qualification, routing, and quoting
- Strip per-address signals from any third-party ad platform upload
- Disclose data sources transparently when a customer asks where you got their information
- 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.
Layering rebate programs onto the list
Charger rebates in Canada come from a mix of federal, provincial and utility programs, and the per-province and per-utility landscape is the one that actually matters for an installer or manufacturer planning a campaign. Some provinces fund single-family installs, some fund only workplaces and multi-unit buildings, and in some the only incentives come from individual utilities. The programs change often, so check each one's current terms before a campaign runs.
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, and a few hundred dollars of rebate 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.
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 amounts in that function are placeholders 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.
Where the market is heading
The residential EV charger market in Canada is maturing. Provincial policy in British Columbia and Quebec pulls adoption ahead of the rest of the country, dealership groups need the home-charging conversation to close more deals, and utilities need to manage the load. All of this points to a growing residential charger installer market.
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:
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);
})();
{
"cache_hit": true,
"cost_cents": 6.0299997,
"data": [
{
"address": "2068 Waycross Crescent",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 2005,
"demographic_income_median_after_tax": 65106,
"demographic_transportation_car_truck_or_van_percent": 0.7777778,
"driveway_parking_space": 2,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.52829,
"longitude": -79.66158,
"postal_code": "L5K1H9",
"property_id": "1b2ecd29021c5d03"
},
{
"address": "1492 Agnew Road",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 2005,
"demographic_income_median_after_tax": 160354,
"demographic_transportation_car_truck_or_van_percent": 0.9,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.525463,
"longitude": -79.637314,
"postal_code": "L5J3G9",
"property_id": "2d5b6d9b9ffea894"
},
{
"address": "420 Abington Avenue",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 2005,
"demographic_income_median_after_tax": 136241,
"demographic_transportation_car_truck_or_van_percent": 0.9,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.582054,
"longitude": -79.59628,
"postal_code": "L5A1L7",
"property_id": "33b6f4ee0fcaedd4"
},
{
"address": "301 Kingsbridge Garden Circle",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 1989,
"demographic_income_median_after_tax": 127801,
"demographic_transportation_car_truck_or_van_percent": 1.0,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.60063,
"longitude": -79.65611,
"postal_code": "L5R1L2",
"property_id": "3b833c9c9a790e72"
},
{
"address": "1077 Windsor Hill Boulevard",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 2005,
"demographic_income_median_after_tax": 106099,
"demographic_transportation_car_truck_or_van_percent": 0.96,
"driveway_parking_space": 2,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.59215,
"longitude": -79.68385,
"postal_code": "L5V1P4",
"property_id": "601192ac91f3c4c6"
},
{
"address": "199 N Service Road",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 2005,
"demographic_income_median_after_tax": 67517,
"demographic_transportation_car_truck_or_van_percent": 0.754717,
"driveway_parking_space": 8,
"garage_parking_space_first": 2,
"garage_type_first": "Detached",
"latitude": 43.57299,
"longitude": -79.5956,
"postal_code": "L5A1A4",
"property_id": "76eb7813becb1cbd"
},
{
"address": "5596 Haddon Hall Road",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 2005,
"demographic_income_median_after_tax": 142269,
"demographic_transportation_car_truck_or_van_percent": 0.8918919,
"driveway_parking_space": 1,
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"latitude": 43.56894,
"longitude": -79.72144,
"postal_code": "L5M5G4",
"property_id": "8a9bd6597c2dd008"
},
{
"address": "2132 Denise Road",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 2005,
"demographic_income_median_after_tax": 125390,
"demographic_transportation_car_truck_or_van_percent": 0.83870965,
"driveway_parking_space": 2,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.60578,
"longitude": -79.56926,
"postal_code": "L4X1J1",
"property_id": "b197fa9150d6ed21"
},
{
"address": "7238 Lowville Heights",
"city": "Mississauga",
"community": "Unknown",
"construction_year": 2005,
"demographic_income_median_after_tax": 153120,
"demographic_transportation_car_truck_or_van_percent": 0.90697676,
"driveway_parking_space": 1,
"garage_parking_space_first": 1,
"garage_type_first": "Attached",
"latitude": 43.586708,
"longitude": -79.7837,
"postal_code": "L5N8L3",
"property_id": "d8fc545ecd88ce7c"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": false,
"has_previous_page": false,
"page_total": 1
},
"price_quote": false,
"result_total": 9,
"time_ms": 13,
"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. On a 25-job weekly cadence, even a modest lift in close rate 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 continually as new records arrive from public, government, and crowdsourced data sources. A list pulled today will be mostly 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 poor close rate and a good one.
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 Houski carries. 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.
