Every address comes with the demographics of the neighbourhood around it

Photo of Alex Wilkinson
Alex Wilkinson
CEO of Houski
2026-07-01

Demographic data ships as areas. Addresses are points. Everything painful about using the two together comes from that one sentence.

You want to know the income mix, household types, and languages around a list of addresses. It sounds like an afternoon of work. It is not. You need to get the boundary files, match the boundary vintage to the data vintage, reproject both into a coordinate system where a point-in-polygon test actually means something, handle the areas that are suppressed for privacy because too few people live in them, and then decide what to do with the addresses that land on a boundary line.

Then you finish, and it is correct. And it stays correct for about a year.

That last part is the one that gets people. The join is a project. The rerun is a job. Boundaries get redrawn, data gets refreshed, new addresses get built, and the pipeline you wrote in March quietly drifts away from reality while you are busy doing something else. Somebody on your team now owns that drift forever.

What Houski returns instead

Houski holds 123 demographic fields, already joined to every address in the United States and Canada, and keeps them current. You do not run a spatial join. You ask for the fields you want and they come back on the same row as the property.

The block below is a live call against the real API. The request and the response are generated every time this page renders, so they always reflect the current schema and current data:

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('http://127.0.0.1:8080/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '5');
    url.searchParams.set('select', 'address,city,postal_code,demographic_income_median_after_tax,demographic_age_median_of_the_population,demographic_household_type_family_with_children_percent,demographic_language_most_spoken_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": 2.1999998092651367,
  "data": [
    {
      "address": "31 Hawkside Park NW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 60.79999923706055,
      "demographic_household_type_family_with_children_percent": 0.21621622145175937,
      "demographic_income_median_after_tax": 109587,
      "demographic_language_most_spoken_first": "English",
      "postal_code": "T3G2W3",
      "property_id": "10000f97f5cb7b9f"
    },
    {
      "address": "6 1744 7 Street SW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 34.79999923706055,
      "demographic_household_type_family_with_children_percent": 0.08695652335882187,
      "demographic_income_median_after_tax": 73218,
      "demographic_language_most_spoken_first": "English",
      "postal_code": "T2T2W6",
      "property_id": "10004f7afe0c1946"
    },
    {
      "address": "384 Copperpond Landng SE",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 33.599998474121094,
      "demographic_household_type_family_with_children_percent": 0.3670886158943176,
      "demographic_income_median_after_tax": 105974,
      "demographic_language_most_spoken_first": "English",
      "postal_code": "T2Z1G6",
      "property_id": "10007f9761f49940"
    },
    {
      "address": "239 Dalhurst Way NW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 37.20000076293945,
      "demographic_household_type_family_with_children_percent": 0.36000001430511475,
      "demographic_income_median_after_tax": 121629,
      "postal_code": "T3A1P3",
      "property_id": "100086f6bc064d3f"
    },
    {
      "address": "52 Cedargrove Way SW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 39.599998474121094,
      "demographic_household_type_family_with_children_percent": 0.2374100685119629,
      "demographic_income_median_after_tax": 83093,
      "demographic_language_most_spoken_first": "English",
      "postal_code": "T2W4V2",
      "property_id": "1000c277cd905d3b"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 132704
  },
  "price_quote": false,
  "result_total": 663518,
  "time_ms": 105,
  "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"
  }
}

The same call for an American address, with the pre-tax income field the American census publishes and the state in the province_abbreviation parameter:

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

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

    const url = new URL('http://127.0.0.1:8080/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'chicago');
    url.searchParams.set('country_abbreviation', 'us');
    url.searchParams.set('province_abbreviation', 'il');
    url.searchParams.set('results_per_page', '5');
    url.searchParams.set('select', 'address,city,postal_code,demographic_income_median_pre_tax,demographic_age_median_of_the_population,demographic_household_type_family_with_children_percent,demographic_transportation_public_transit_percent');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 2.1999998092651367,
  "data": [
    {
      "address": "870 N Mohawk Street",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 33.29999923706055,
      "demographic_household_type_family_with_children_percent": 0.0836707130074501,
      "demographic_income_median_pre_tax": 241013,
      "demographic_transportation_public_transit_percent": 0.1782178282737732,
      "postal_code": "60610",
      "property_id": "100015eff7436c78"
    },
    {
      "address": "4424 S Washtenaw Avenue",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 31.299999237060547,
      "demographic_household_type_family_with_children_percent": 0.3188405930995941,
      "demographic_income_median_pre_tax": 120639,
      "demographic_transportation_public_transit_percent": 0.031990520656108856,
      "postal_code": "60632",
      "property_id": "10001b07684b3120"
    },
    {
      "address": "3003 1606 E Hyde Park Boulevard",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 35.400001525878906,
      "demographic_household_type_family_with_children_percent": 0.0,
      "demographic_income_median_pre_tax": 61980,
      "demographic_transportation_public_transit_percent": 0.29777777194976807,
      "postal_code": "60615",
      "property_id": "1000406577430844"
    },
    {
      "address": "3347 S Western Boulevard",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 44.400001525878906,
      "demographic_household_type_family_with_children_percent": 0.15839999914169312,
      "demographic_income_median_pre_tax": 76636,
      "demographic_transportation_public_transit_percent": 0.3009708821773529,
      "postal_code": "60608",
      "property_id": "1000408745f4f793"
    },
    {
      "address": "3413 W 38 Street",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 33.900001525878906,
      "demographic_household_type_family_with_children_percent": 0.24015748500823977,
      "demographic_income_median_pre_tax": 87822,
      "demographic_transportation_public_transit_percent": 0.06203703582286835,
      "postal_code": "60632",
      "property_id": "10004bb90a665a24"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 194993
  },
  "price_quote": false,
  "result_total": 974965,
  "time_ms": 119,
  "ui_info": {
    "city": "Chicago",
    "city_id": "7735a52d5e8eabec",
    "city_link": "us/il/chicago",
    "city_slug": "chicago",
    "country": "United States",
    "country_abbreviation": "US",
    "country_abbreviation_id": "c148472ce4bd39d",
    "country_abbreviation_link": "us",
    "country_slug": "united_states",
    "province": "Illinois",
    "province_abbreviation": "IL",
    "province_abbreviation_id": "ad034aa81659480f",
    "province_abbreviation_link": "us/il",
    "province_slug": "illinois"
  }
}

That is the whole integration. No boundary files, no reprojection, no vintage matching, and no separate pipeline per country.

What is actually in there

The 123 fields group into a handful of families:

Income - median and average, both pre-tax and after-tax, plus the full distribution in buckets from under 10,000 dollars up to 150,000 and over.

Households - size, from one person to five or more. Type, split across family with children, family without children, single with children, and single without children.

Age - every five-year band from 0 to 4 up through 100 and over, plus the median and average of the population.

Language - the five most spoken languages in the area, each with the share of people who speak it. The names come back as values, not codes, so demographic_language_most_spoken_first returns something you can read.

Education - highest level reached, from no certificate through to earned doctorate, plus field of study for degree holders.

Employment - employed and unemployed shares, industry across all 20 industry groups, and occupation across all 10 occupation groups.

Transportation - how people get to work, split across car, public transit, bicycle, and walking.

Marital status, population density, and dwelling occupancy round it out.

For the complete list with descriptions, see the fields reference.

Two things you need to know before you use this

These are neighbourhood values, not household values. Houski does not know the income of the person living at 123 Main Street, and neither does anyone else who is being honest with you. What Houski knows is the income profile of the area around 123 Main Street. That distinction matters legally and it matters practically. Target neighbourhoods with it. Do not pretend it is a profile of a person.

The percent fields are fractions, not whole numbers. A value of 0.20 means 20 percent. This trips people up on their first filter, so filter on 0.20, not on 20.

One more subtlety worth knowing: the income composition fields, like demographic_employment_income_percent, are shares of total income in the area, not shares of residents. An area where employment income is 0.85 gets 85 percent of its total income from employment. It does not mean 85 percent of people have a job. That is what demographic_employment_employed_percent is for.

A few fields are Canadian only. The American census publishes no after-tax income and no income averages, and it publishes language groups rather than languages. For an American address, filter on demographic_income_median_pre_tax, do not lean on the after-tax and average income fields there, they are model estimates rather than census values, and expect the five language fields to be empty.

Filtering on it

The demographic fields are filterable like anything else, using the standard operators. Here is every property in Calgary in an area where the median after-tax income of residents clears 70,000 dollars and more than a quarter of households are families with children:

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('http://127.0.0.1:8080/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('demographic_household_type_family_with_children_percent_gte', '0.25');
    url.searchParams.set('demographic_income_median_after_tax_gte', '70000');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '25');
    url.searchParams.set('select', 'address,postal_code,community,property_type,demographic_income_median_after_tax,demographic_household_type_family_with_children_percent,estimate_sale_price');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 8.749999046325684,
  "data": [
    {
      "address": "384 Copperpond Landng SE",
      "community": "Unknown",
      "demographic_household_type_family_with_children_percent": 0.3670886158943176,
      "demographic_income_median_after_tax": 105974,
      "estimate_sale_price": 529952,
      "postal_code": "T2Z1G6",
      "property_id": "10007f9761f49940",
      "property_type": "House"
    },
    {
      "address": "239 Dalhurst Way NW",
      "community": "Dalhousie",
      "demographic_household_type_family_with_children_percent": 0.36000001430511475,
      "demographic_income_median_after_tax": 121629,
      "estimate_sale_price": 1044393,
      "postal_code": "T3A1P3",
      "property_id": "100086f6bc064d3f",
      "property_type": "House"
    },
    {
      "address": "28 Sundown Gr SE",
      "community": "Sundance",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 127651,
      "estimate_sale_price": 670977,
      "property_id": "1001109ab2aebbc0",
      "property_type": "House"
    },
    {
      "address": "117 Sandpiper Place NW",
      "community": "Sandstone Valley",
      "demographic_household_type_family_with_children_percent": 0.3636363744735718,
      "demographic_income_median_after_tax": 98748,
      "estimate_sale_price": 708549,
      "postal_code": "T3K3T9",
      "property_id": "1001217184d8717b",
      "property_type": "House"
    },
    {
      "address": "314 4350 Seton Drive SE",
      "community": "Seton",
      "demographic_household_type_family_with_children_percent": 0.40020790696144104,
      "demographic_income_median_after_tax": 119221,
      "estimate_sale_price": 355659,
      "postal_code": "T3M3C7",
      "property_id": "10014345d508e279",
      "property_type": "Apartment"
    },
    {
      "address": "6619 34 Street SW",
      "community": "Lakeview",
      "demographic_household_type_family_with_children_percent": 0.3478260934352875,
      "demographic_income_median_after_tax": 138489,
      "estimate_sale_price": 860276,
      "postal_code": "T3E5M3",
      "property_id": "10014f3c7e5bfad9",
      "property_type": "House"
    },
    {
      "address": "188 Mount Aberdeen Close SE",
      "community": "McKenzie Lake",
      "demographic_household_type_family_with_children_percent": 0.3786407709121704,
      "demographic_income_median_after_tax": 105974,
      "estimate_sale_price": 442398,
      "postal_code": "T2Z3N2",
      "property_id": "1001894d82aeeb0c",
      "property_type": "House"
    },
    {
      "address": "48 Catalina Circle NE",
      "community": "Monterey Park",
      "demographic_household_type_family_with_children_percent": 0.54347825050354,
      "demographic_income_median_after_tax": 107178,
      "estimate_sale_price": 348358,
      "postal_code": "T1Y7B7",
      "property_id": "10019b3ca95ab014",
      "property_type": "Townhouse"
    },
    {
      "address": "196 Covemeadow Road NE",
      "community": "Coventry Hills",
      "demographic_household_type_family_with_children_percent": 0.4883720874786377,
      "demographic_income_median_after_tax": 109587,
      "estimate_sale_price": 565026,
      "postal_code": "T3K6E7",
      "property_id": "1001a75df7bd5267",
      "property_type": "House"
    },
    {
      "address": "6105 302 Skyview Ranch Drive NE",
      "community": "Skyview Ranch",
      "demographic_household_type_family_with_children_percent": 0.4956772327423096,
      "demographic_income_median_after_tax": 102361,
      "estimate_sale_price": 233513,
      "postal_code": "T3N0P5",
      "property_id": "1001e5d457b46526",
      "property_type": "Apartment"
    },
    {
      "address": "121 Prestwick Way SE",
      "community": "McKenzie Towne",
      "demographic_household_type_family_with_children_percent": 0.4285714328289032,
      "demographic_income_median_after_tax": 136080,
      "estimate_sale_price": 494431,
      "postal_code": "T2Z3W7",
      "property_id": "1001f28c96629974",
      "property_type": "House"
    },
    {
      "address": "432 27 Avenue NW",
      "community": "Mount Pleasant",
      "demographic_household_type_family_with_children_percent": 0.3653846085071564,
      "demographic_income_median_after_tax": 143306,
      "estimate_sale_price": 1178265,
      "postal_code": "T2M2H6",
      "property_id": "10021e44aa219b00",
      "property_type": "House"
    },
    {
      "address": "168 Coventry Hills Drive NE",
      "community": "Coventry Hills",
      "demographic_household_type_family_with_children_percent": 0.6140350699424744,
      "demographic_income_median_after_tax": 126446,
      "estimate_sale_price": 601213,
      "postal_code": "T3K6H4",
      "property_id": "1002285fe3ee9c49",
      "property_type": "House"
    },
    {
      "address": "2 2022 11 Avenue SW",
      "community": "Sunalta",
      "demographic_household_type_family_with_children_percent": 0.3414634168148041,
      "demographic_income_median_after_tax": 133672,
      "estimate_sale_price": 163729,
      "postal_code": "T3C0P1",
      "property_id": "10027a59d3becf43",
      "property_type": "Apartment"
    },
    {
      "address": "6728 37 Avenue NE",
      "community": "Temple",
      "demographic_household_type_family_with_children_percent": 0.3499999940395355,
      "demographic_income_median_after_tax": 108382,
      "estimate_sale_price": 519547,
      "postal_code": "T1Y5E5",
      "property_id": "100283206befdb78",
      "property_type": "House"
    },
    {
      "address": "66 Walden Walk SE",
      "community": "Walden",
      "demographic_household_type_family_with_children_percent": 0.46621620655059814,
      "demographic_income_median_after_tax": 121629,
      "estimate_sale_price": 406014,
      "postal_code": "T2X0Y4",
      "property_id": "10028c2a3333256c",
      "property_type": "Apartment"
    },
    {
      "address": "6535 54 Street NW",
      "community": "Dalhousie",
      "demographic_household_type_family_with_children_percent": 0.25641027092933655,
      "demographic_income_median_after_tax": 103565,
      "estimate_sale_price": 693995,
      "postal_code": "T3A1R5",
      "property_id": "10030424b41ab29b",
      "property_type": "House"
    },
    {
      "address": "145 Valley Woods Place NW",
      "community": "Valley Ridge",
      "demographic_household_type_family_with_children_percent": 0.37837839126586914,
      "demographic_income_median_after_tax": 148123,
      "estimate_sale_price": 855737,
      "postal_code": "T3B6A1",
      "property_id": "10034432c778cb03",
      "property_type": "House"
    },
    {
      "address": "95 Creekview Garden SW",
      "community": "Pine Creek",
      "demographic_household_type_family_with_children_percent": 0.495121955871582,
      "demographic_income_median_after_tax": 124038,
      "estimate_sale_price": 639752,
      "property_id": "100356cd86faab90",
      "property_type": "Land"
    },
    {
      "address": "232 Rundlefield Road NE",
      "community": "Rundle",
      "demographic_household_type_family_with_children_percent": 0.4000000059604645,
      "demographic_income_median_after_tax": 95738,
      "estimate_sale_price": 500755,
      "postal_code": "T1Y2W1",
      "property_id": "1003a8f7e7319598",
      "property_type": "House"
    },
    {
      "address": "2210 11 Chaparral Ridge Drive SE",
      "community": "Chaparral",
      "demographic_household_type_family_with_children_percent": 0.3103448152542114,
      "demographic_income_median_after_tax": 92125,
      "estimate_sale_price": 235586,
      "postal_code": "T2X3P7",
      "property_id": "1003b461d5f335cf",
      "property_type": "Apartment"
    },
    {
      "address": "125 Riverview Court SE",
      "community": "Riverbend",
      "demographic_household_type_family_with_children_percent": 0.3333333432674408,
      "demographic_income_median_after_tax": 125242,
      "estimate_sale_price": 682719,
      "postal_code": "T2C3V7",
      "property_id": "1003b80b5086a07",
      "property_type": "House"
    },
    {
      "address": "52 Tuscany Valley Lane NW",
      "community": "Tuscany",
      "demographic_household_type_family_with_children_percent": 0.44117647409439087,
      "demographic_income_median_after_tax": 120425,
      "estimate_sale_price": 652048,
      "postal_code": "T3L2C3",
      "property_id": "1003eea453087ea3",
      "property_type": "House"
    },
    {
      "address": "110 Royal Birch Gardens NW",
      "community": "Unknown",
      "demographic_household_type_family_with_children_percent": 0.4868420958518982,
      "demographic_income_median_after_tax": 122834,
      "estimate_sale_price": 671815,
      "postal_code": "T3G5H9",
      "property_id": "1003fe4194f1fe08",
      "property_type": "House"
    },
    {
      "address": "81 Scandia Hill NW",
      "community": "Scenic Acres",
      "demographic_household_type_family_with_children_percent": 0.4266666769981384,
      "demographic_income_median_after_tax": 149327,
      "estimate_sale_price": 1035426,
      "postal_code": "T3L1T9",
      "property_id": "10043508321f54ba",
      "property_type": "House"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 17818
  },
  "price_quote": false,
  "result_total": 445438,
  "time_ms": 127,
  "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"
  }
}

You can stack demographic filters against property filters in the same query, which is where this gets useful. The demographics tell you who is nearby. The property fields tell you what they live in. Neither is worth much alone.

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('http://127.0.0.1:8080/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('construction_year_lte', '1985');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('demographic_income_median_after_tax_gte', '80000');
    url.searchParams.set('property_type_eq', 'House');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '25');
    url.searchParams.set('select', 'address,postal_code,construction_year,interior_sq_m,heating_type_first,demographic_income_median_after_tax,demographic_age_median_of_the_population');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 13.249999046325684,
  "data": [
    {
      "address": "239 Dalhurst Way NW",
      "construction_year": 1971,
      "demographic_age_median_of_the_population": 37.20000076293945,
      "demographic_income_median_after_tax": 121629,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 112.41268157958984,
      "postal_code": "T3A1P3",
      "property_id": "100086f6bc064d3f"
    },
    {
      "address": "52 Cedargrove Way SW",
      "construction_year": 1984,
      "demographic_age_median_of_the_population": 39.599998474121094,
      "demographic_income_median_after_tax": 83093,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 119.8449249267578,
      "postal_code": "T2W4V2",
      "property_id": "1000c277cd905d3b"
    },
    {
      "address": "6619 34 Street SW",
      "construction_year": 1964,
      "demographic_age_median_of_the_population": 44.79999923706055,
      "demographic_income_median_after_tax": 138489,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 139.35450744628906,
      "postal_code": "T3E5M3",
      "property_id": "10014f3c7e5bfad9"
    },
    {
      "address": "1011 Olympia Crescent SE",
      "construction_year": 1973,
      "demographic_age_median_of_the_population": 44.0,
      "demographic_income_median_after_tax": 83695,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 97.73400115966795,
      "postal_code": "T2C1G6",
      "property_id": "1001ffcbf6c0248c"
    },
    {
      "address": "6728 37 Avenue NE",
      "construction_year": 1981,
      "demographic_age_median_of_the_population": 41.599998474121094,
      "demographic_income_median_after_tax": 108382,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 108.88236236572266,
      "postal_code": "T1Y5E5",
      "property_id": "100283206befdb78"
    },
    {
      "address": "6535 54 Street NW",
      "construction_year": 1972,
      "demographic_age_median_of_the_population": 41.599998474121094,
      "demographic_income_median_after_tax": 103565,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 115.19881439208984,
      "postal_code": "T3A1R5",
      "property_id": "10030424b41ab29b"
    },
    {
      "address": "232 Rundlefield Road NE",
      "construction_year": 1976,
      "demographic_age_median_of_the_population": 38.400001525878906,
      "demographic_income_median_after_tax": 95738,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 100.8927001953125,
      "postal_code": "T1Y2W1",
      "property_id": "1003a8f7e7319598"
    },
    {
      "address": "5047 Vanstone Crescent NW",
      "construction_year": 1966,
      "demographic_age_median_of_the_population": 42.400001525878906,
      "demographic_income_median_after_tax": 128855,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 132.0152130126953,
      "postal_code": "T3A0V8",
      "property_id": "1005fe608a515e58"
    },
    {
      "address": "143 Marbrooke Circle NE",
      "construction_year": 1968,
      "demographic_age_median_of_the_population": 40.400001525878906,
      "demographic_income_median_after_tax": 87308,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 133.68746948242188,
      "postal_code": "T2A2W8",
      "property_id": "100655e9b87ae8d1"
    },
    {
      "address": "87 Castleglen Crescent NE",
      "construction_year": 1980,
      "demographic_age_median_of_the_population": 34.0,
      "demographic_income_median_after_tax": 97544,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 82.59080505371094,
      "postal_code": "T3J1N2",
      "property_id": "100708598cd66dae"
    },
    {
      "address": "595 Woodpark Crescent SW",
      "construction_year": 1976,
      "demographic_age_median_of_the_population": 54.0,
      "demographic_income_median_after_tax": 136080,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 171.31320190429688,
      "postal_code": "T2W2S1",
      "property_id": "1007cca23b5a0a10"
    },
    {
      "address": "137 Berwick Way NW",
      "construction_year": 1978,
      "demographic_age_median_of_the_population": 33.20000076293945,
      "demographic_income_median_after_tax": 89114,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 98.01271057128906,
      "postal_code": "T3K1B8",
      "property_id": "1007d7cf25d6c8dc"
    },
    {
      "address": "24 Hoover Place SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 44.79999923706055,
      "demographic_income_median_after_tax": 119221,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 95.03981018066406,
      "postal_code": "T2V3G4",
      "property_id": "100a43bcbefcc557"
    },
    {
      "address": "5852 Bow Crescent NW",
      "construction_year": 1980,
      "demographic_age_median_of_the_population": 51.599998474121094,
      "demographic_income_median_after_tax": 125242,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 178.37384033203125,
      "postal_code": "T3B2B7",
      "property_id": "100af602324e3847"
    },
    {
      "address": "108 Cheyenne Crescent NW",
      "construction_year": 1959,
      "demographic_age_median_of_the_population": 41.20000076293945,
      "demographic_income_median_after_tax": 114404,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 134.33668518066406,
      "postal_code": "T2L0Z2",
      "property_id": "100af6cbccc73c57"
    },
    {
      "address": "148 Whitehaven Road NE",
      "construction_year": 1984,
      "demographic_age_median_of_the_population": 40.79999923706055,
      "demographic_income_median_after_tax": 115608,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 99.86993408203124,
      "postal_code": "T1Y6C7",
      "property_id": "100ba0f09365e282"
    },
    {
      "address": "56 Northmount Drive NW",
      "construction_year": 1956,
      "demographic_age_median_of_the_population": 39.599998474121094,
      "demographic_income_median_after_tax": 101157,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 109.06816864013672,
      "postal_code": "T2K3E9",
      "property_id": "100bd0ee45c0a61b"
    },
    {
      "address": "5580 Dalhart Hill NW",
      "construction_year": 1973,
      "demographic_age_median_of_the_population": 44.400001525878906,
      "demographic_income_median_after_tax": 125242,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 132.20050048828125,
      "postal_code": "T3A1S9",
      "property_id": "100c6e3e02fb821e"
    },
    {
      "address": "2830 Oakmoor Crescent SW",
      "construction_year": 1971,
      "demographic_age_median_of_the_population": 46.0,
      "demographic_income_median_after_tax": 110791,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 109.53268432617188,
      "postal_code": "T2V3Z7",
      "property_id": "100db013c3f70024"
    },
    {
      "address": "1039 Penmeadows Road SE",
      "construction_year": 1971,
      "demographic_age_median_of_the_population": 42.79999923706055,
      "demographic_income_median_after_tax": 81287,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 98.98818969726562,
      "postal_code": "T2A3R3",
      "property_id": "100de6d2721b23dd"
    },
    {
      "address": "39 Rundlelawn Court NE",
      "construction_year": 1977,
      "demographic_age_median_of_the_population": 36.79999923706055,
      "demographic_income_median_after_tax": 98748,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 78.3172607421875,
      "postal_code": "T1Y3H3",
      "property_id": "100fafb0c113c886"
    },
    {
      "address": "57 Fenton Road SE",
      "construction_year": 1959,
      "demographic_age_median_of_the_population": 40.79999923706055,
      "demographic_income_median_after_tax": 95738,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 104.1443099975586,
      "postal_code": "T2H1B8",
      "property_id": "100fd1906381c190"
    },
    {
      "address": "3216 Breen Road NW",
      "construction_year": 1964,
      "demographic_age_median_of_the_population": 41.20000076293945,
      "demographic_income_median_after_tax": 121629,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 183.29769897460935,
      "postal_code": "T2L1S4",
      "property_id": "10106e1d99f8de60"
    },
    {
      "address": "719 Allandale Road SE",
      "construction_year": 1964,
      "demographic_age_median_of_the_population": 46.400001525878906,
      "demographic_income_median_after_tax": 102361,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 96.80496978759766,
      "postal_code": "T2H1W7",
      "property_id": "10122f0ce525c853"
    },
    {
      "address": "20 Wildwood Drive SW",
      "construction_year": 1956,
      "demographic_age_median_of_the_population": 44.400001525878906,
      "demographic_income_median_after_tax": 144510,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 163.22994995117188,
      "postal_code": "T3C3C5",
      "property_id": "10136c6b78423d0b"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 3987
  },
  "price_quote": false,
  "result_total": 99660,
  "time_ms": 117,
  "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"
  }
}

Older houses, in areas with the income to renovate them. That query is a contractor's entire prospect list, and it took one request. The same list for Chicago, on the pre-tax field:

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('http://127.0.0.1:8080/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'chicago');
    url.searchParams.set('construction_year_lte', '1985');
    url.searchParams.set('country_abbreviation', 'us');
    url.searchParams.set('demographic_income_median_pre_tax_gte', '80000');
    url.searchParams.set('property_type_eq', 'House');
    url.searchParams.set('province_abbreviation', 'il');
    url.searchParams.set('results_per_page', '25');
    url.searchParams.set('select', 'address,postal_code,construction_year,interior_sq_m,heating_type_first,demographic_income_median_pre_tax,demographic_age_median_of_the_population');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 13.249999046325684,
  "data": [
    {
      "address": "12931 S Carondolet Avenue",
      "construction_year": 1964,
      "demographic_age_median_of_the_population": 41.70000076293945,
      "demographic_income_median_pre_tax": 83561,
      "heating_type_first": "Hot water",
      "interior_sq_m": 101.07850646972656,
      "postal_code": "60633",
      "property_id": "10014d5f9e03d9b0"
    },
    {
      "address": "2139 N Cleveland Avenue",
      "construction_year": 1889,
      "demographic_age_median_of_the_population": 31.700000762939453,
      "demographic_income_median_pre_tax": 138186,
      "heating_type_first": "Hot water",
      "interior_sq_m": 290.1361999511719,
      "postal_code": "60614",
      "property_id": "1001b8c475b609c9"
    },
    {
      "address": "2506 N Major Avenue",
      "construction_year": 1929,
      "demographic_age_median_of_the_population": 45.0,
      "demographic_income_median_pre_tax": 105145,
      "heating_type_first": "Hot water",
      "interior_sq_m": 124.49007415771484,
      "postal_code": "60639",
      "property_id": "100249159fcf52ef"
    },
    {
      "address": "79 E Elm Street",
      "construction_year": 1901,
      "demographic_age_median_of_the_population": 69.0999984741211,
      "demographic_income_median_pre_tax": 165125,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 409.7953186035156,
      "postal_code": "60611",
      "property_id": "1002607d76330abc"
    },
    {
      "address": "2R 2126 N Magnolia Avenue",
      "construction_year": 1880,
      "demographic_age_median_of_the_population": 34.29999923706055,
      "demographic_income_median_pre_tax": 207282,
      "heating_type_first": "Hot water",
      "interior_sq_m": 267.37493896484375,
      "postal_code": "60614",
      "property_id": "1003864b83dc74c4"
    },
    {
      "address": "4948 W Crystal St Hse",
      "construction_year": 1923,
      "demographic_age_median_of_the_population": 33.0,
      "demographic_income_median_pre_tax": 81425,
      "heating_type_first": "Hot water",
      "interior_sq_m": 142.79197692871094,
      "postal_code": "60651",
      "property_id": "1003eed88505789c"
    },
    {
      "address": "2514 N Monitor Avenue",
      "construction_year": 1918,
      "demographic_age_median_of_the_population": 26.600000381469727,
      "demographic_income_median_pre_tax": 100832,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 74.13662719726562,
      "postal_code": "60639",
      "property_id": "1004522582ea9ac5"
    },
    {
      "address": "2753 N Newland Avenue",
      "construction_year": 1932,
      "demographic_age_median_of_the_population": 32.400001525878906,
      "demographic_income_median_pre_tax": 107628,
      "heating_type_first": "Hot water",
      "interior_sq_m": 254.7401428222656,
      "postal_code": "60707",
      "property_id": "100469092e246040"
    },
    {
      "address": "6134 W Addison Street",
      "construction_year": 1926,
      "demographic_age_median_of_the_population": 33.0,
      "demographic_income_median_pre_tax": 121630,
      "heating_type_first": "Hot water",
      "interior_sq_m": 168.34030151367188,
      "postal_code": "60634",
      "property_id": "10048d44f5880782"
    },
    {
      "address": "8122 S Oakley Avenue",
      "construction_year": 1957,
      "demographic_age_median_of_the_population": 40.70000076293945,
      "demographic_income_median_pre_tax": 89742,
      "heating_type_first": "Hot water",
      "interior_sq_m": 107.02429962158205,
      "postal_code": "60620",
      "property_id": "1004cbb8826f9657"
    },
    {
      "address": "5325 S Lawndale Avenue",
      "construction_year": 1950,
      "demographic_age_median_of_the_population": 33.400001525878906,
      "demographic_income_median_pre_tax": 127215,
      "heating_type_first": "Hot water",
      "interior_sq_m": 121.7029800415039,
      "postal_code": "60632",
      "property_id": "1004cdd9bc67e7c3"
    },
    {
      "address": "6237 W Belle Plaine Avenue",
      "construction_year": 1964,
      "demographic_age_median_of_the_population": 36.79999923706055,
      "demographic_income_median_pre_tax": 95909,
      "heating_type_first": "Hot water",
      "interior_sq_m": 154.77645874023438,
      "postal_code": "60634",
      "property_id": "1004f60344150005"
    },
    {
      "address": "3111 W 53 Place",
      "construction_year": 1923,
      "demographic_age_median_of_the_population": 37.099998474121094,
      "demographic_income_median_pre_tax": 102592,
      "heating_type_first": "Hot water",
      "interior_sq_m": 102.00753784179688,
      "postal_code": "60632",
      "property_id": "10056c7a52a6d101"
    },
    {
      "address": "5342 N Mobile Avenue",
      "construction_year": 1962,
      "demographic_age_median_of_the_population": 46.20000076293945,
      "demographic_income_median_pre_tax": 128293,
      "heating_type_first": "Hot water",
      "interior_sq_m": 133.68746948242188,
      "postal_code": "60630",
      "property_id": "1005889b9c9a70e8"
    },
    {
      "address": "11527 S Stewart Avenue",
      "construction_year": 1903,
      "demographic_age_median_of_the_population": 41.5,
      "demographic_income_median_pre_tax": 88613,
      "heating_type_first": "Hot water",
      "interior_sq_m": 141.584228515625,
      "postal_code": "60628",
      "property_id": "1005a78f11a60b0d"
    },
    {
      "address": "8728 S Emerald Avenue",
      "construction_year": 1923,
      "demographic_age_median_of_the_population": 42.5,
      "demographic_income_median_pre_tax": 81975,
      "heating_type_first": "Hot water",
      "interior_sq_m": 120.7739486694336,
      "postal_code": "60620",
      "property_id": "1005b09f771ababb"
    },
    {
      "address": "10504 S Sangamon Street",
      "construction_year": 1955,
      "demographic_age_median_of_the_population": 47.599998474121094,
      "demographic_income_median_pre_tax": 81507,
      "heating_type_first": "Hot water",
      "interior_sq_m": 99.03463745117188,
      "postal_code": "60643",
      "property_id": "1006705851fc88ad"
    },
    {
      "address": "4955 N Kedzie Avenue",
      "construction_year": 1923,
      "demographic_age_median_of_the_population": 28.5,
      "demographic_income_median_pre_tax": 104785,
      "heating_type_first": "Hot water",
      "interior_sq_m": 168.89772033691406,
      "postal_code": "60625",
      "property_id": "1006e6fc38e9348a"
    },
    {
      "address": "10813 S Glenroy Avenue",
      "construction_year": 1888,
      "demographic_age_median_of_the_population": 38.79999923706055,
      "demographic_income_median_pre_tax": 81507,
      "heating_type_first": "Hot water",
      "interior_sq_m": 113.94557189941406,
      "property_id": "1006ffea5b2e6b5"
    },
    {
      "address": "4515 N Melvina Avenue",
      "construction_year": 1927,
      "demographic_age_median_of_the_population": 39.5,
      "demographic_income_median_pre_tax": 168840,
      "heating_type_first": "Hot water",
      "interior_sq_m": 154.96226501464844,
      "postal_code": "60630",
      "property_id": "100739ba9f7c774d"
    },
    {
      "address": "3607 N Avers Avenue",
      "construction_year": 1908,
      "demographic_age_median_of_the_population": 38.900001525878906,
      "demographic_income_median_pre_tax": 127011,
      "heating_type_first": "Hot water",
      "interior_sq_m": 175.540283203125,
      "postal_code": "60618",
      "property_id": "100773a4c4389a9a"
    },
    {
      "address": "2612 W 15 Place",
      "construction_year": 1888,
      "demographic_age_median_of_the_population": 33.599998474121094,
      "demographic_income_median_pre_tax": 89053,
      "heating_type_first": "Hot water",
      "interior_sq_m": 109.25397491455078,
      "postal_code": "60608",
      "property_id": "1007d5c57f7d32e5"
    },
    {
      "address": "4434 N Kasson Avenue",
      "construction_year": 1923,
      "demographic_age_median_of_the_population": 39.599998474121094,
      "demographic_income_median_pre_tax": 107848,
      "heating_type_first": "Hot water",
      "interior_sq_m": 168.89772033691406,
      "postal_code": "60630",
      "property_id": "1007e8299b7ec3bc"
    },
    {
      "address": "4101 N Saint Louis Avenue",
      "construction_year": 1908,
      "demographic_age_median_of_the_population": 35.099998474121094,
      "demographic_income_median_pre_tax": 108301,
      "heating_type_first": "Hot water",
      "interior_sq_m": 175.540283203125,
      "postal_code": "60618",
      "property_id": "100861e399ce6844"
    },
    {
      "address": "2003 W Ohio Street",
      "construction_year": 1891,
      "demographic_age_median_of_the_population": 42.900001525878906,
      "demographic_income_median_pre_tax": 187350,
      "heating_type_first": "Hot water",
      "interior_sq_m": 266.8175354003906,
      "postal_code": "60612",
      "property_id": "100878488253da67"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 7469
  },
  "price_quote": false,
  "result_total": 186718,
  "time_ms": 118,
  "ui_info": {
    "city": "Chicago",
    "city_id": "7735a52d5e8eabec",
    "city_link": "us/il/chicago",
    "city_slug": "chicago",
    "country": "United States",
    "country_abbreviation": "US",
    "country_abbreviation_id": "c148472ce4bd39d",
    "country_abbreviation_link": "us",
    "country_slug": "united_states",
    "province": "Illinois",
    "province_abbreviation": "IL",
    "province_abbreviation_id": "ad034aa81659480f",
    "province_abbreviation_link": "us/il",
    "province_slug": "illinois"
  }
}

The use cases are the point

Once demographics live on the address, a surprising number of jobs collapse into a single query.

Direct mail is the cleanest fit, because mail is addressed to a dwelling rather than to a person. You do not need anyone's name, and you do not need a list broker. You pick the streets worth mailing and you mail them. Filter on the demographic mix that matches your customer, export the addresses, hand them to your printer.

Choosing where to spend on any geographic channel. Flyer drops, door knocking, canvassing routes, local radio, out-of-home placement. Anything you currently buy by city, you can buy by neighbourhood instead.

Site selection. Where does a new location go? Childcare wants families with children. A pharmacy wants an older age profile. A bike shop wants demographic_transportation_bicycle_percent to be high. Each of those is a filter.

Service area planning. A trades business deciding which neighbourhoods to serve, weighing drive time against the density of houses that match its work.

Language-aware outreach. In Canada, demographic_language_most_spoken_first through fifth tells you where a translated mailer or a bilingual rep will actually land.

Market sizing before you launch. How many households in this province or state live in the profile I sell to? That is a count, not a study.

Feature engineering. If you are training a model, these are 123 pre-joined features per address. The part of the project you were dreading is already done.

The pre-built version

If you want the output rather than the query, the datasets page has the census and demographics category already assembled, along with 90 or so others. Language communities, single-parent households, empty nesters and retirees, public transit commuters, university-educated areas, trades-certified workforce, cycling communities, high population density. Each one is a filter someone already wrote, delivered as a comma-separated values or JSON export that drops into Snowflake, BigQuery, Databricks, Power BI, or a notebook.

They update daily, which is the part that matters. The list you pull in July is not the list you pulled in March, because both countries changed and the data changed with them.

If the cut you need is not there, our data team builds custom datasets - combining fields, applying your filters, developing analytics specific to your business - delivered in your format on your schedule. Ask us for one.

Where the data comes from

The demographic data is assembled from public, government, and crowdsourced data sources, cleaned and conformed across every state and province so a field means the same thing in Halifax as it does in Victoria. That conforming step is most of the work and all of the value. Raw sources disagree with each other constantly, and reconciling them is the reason this is a product rather than a download.

Getting started

  1. Sign up for API access and get a key
  2. Pick your demographic profile from the fields reference
  3. Build the filter using the filtering guide
  4. Test on one city before you scale it nationally
  5. Export to mail, to your customer system, or to your model

Most fields cost a tenth of a cent per field per property, so a 10,000 address pull with 10 fields runs about 100 dollars, and there is a 99 dollar monthly minimum. Add price_quote to any request to see the cost before you commit to it. Full detail on the pricing page.


The spatial join is a solved problem. It just was not solved for you, and it was never going to stay solved. Explore the API documentation or browse the datasets page to see what is already built.