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 127 demographic fields, already joined to every address in the United States and Canada, and keeps them current. The other countries Houski covers carry them too, field by field as each country publishes the figures. 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('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('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.1999998,
  "data": [
    {
      "address": "518 Rochester Terrace NW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 47.2,
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "property_id": "103f92f6cf7bbdd9"
    },
    {
      "address": "36 Crimson Ridge Heights NW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 49.2,
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "property_id": "104fb85a9c002e5d"
    },
    {
      "address": "54 Rowmont Link NW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 47.2,
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "property_id": "1055f97323e53f25"
    },
    {
      "address": "499 Rochester Terrace NW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 47.2,
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "property_id": "1106094a42c3757d"
    },
    {
      "address": "304 30 Rochester View NW",
      "city": "Calgary",
      "demographic_age_median_of_the_population": 49.2,
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "demographic_language_most_spoken_first": "English",
      "postal_code": "T3L0M8",
      "property_id": "1198b011e799062c"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 132136
  },
  "price_quote": false,
  "result_total": 660677,
  "time_ms": 40,
  "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 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('https://api.houski.ca/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.1999998,
  "data": [
    {
      "address": "12931 S Carondolet Avenue",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 41.7,
      "demographic_household_type_family_with_children_percent": 0.23379923,
      "demographic_income_median_pre_tax": 84192,
      "demographic_transportation_public_transit_percent": 0.086188994,
      "postal_code": "60633",
      "property_id": "10014d5f9e03d9b0"
    },
    {
      "address": "13542 S Buffalo Avenue",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 31.2,
      "demographic_household_type_family_with_children_percent": 0.019908117,
      "demographic_income_median_pre_tax": 53487,
      "demographic_transportation_public_transit_percent": 0.13043478,
      "postal_code": "60633",
      "property_id": "100377e29f830438"
    },
    {
      "address": "13055 S Avenue N",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 42.0,
      "demographic_household_type_family_with_children_percent": 0.08245877,
      "demographic_income_median_pre_tax": 158064,
      "demographic_transportation_public_transit_percent": 0.14965986,
      "postal_code": "60633",
      "property_id": "100c5f364ee7bcc0"
    },
    {
      "address": "11644 S Avenue G",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 65.4,
      "demographic_household_type_family_with_children_percent": 0.06910569,
      "demographic_income_median_pre_tax": 97059,
      "demographic_transportation_public_transit_percent": 0.10493827,
      "postal_code": "60617",
      "property_id": "101cef0100dad7"
    },
    {
      "address": "13056 S Avenue O",
      "city": "Chicago",
      "demographic_age_median_of_the_population": 42.0,
      "demographic_household_type_family_with_children_percent": 0.08245877,
      "demographic_income_median_pre_tax": 158064,
      "demographic_transportation_public_transit_percent": 0.14965986,
      "postal_code": "60633",
      "property_id": "1038bc3b133d7158"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 192367
  },
  "price_quote": false,
  "result_total": 961835,
  "time_ms": 48,
  "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 127 fields group into a handful of families:

Income: median and average, both pre-tax and after-tax, per household and per person, plus the full distribution in buckets from under 10,000 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.

Not every field is published everywhere. The American figures include no after-tax income and no income averages, and they count 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 published values), and expect the five language fields to be empty. Each other country has its own gaps where no figure is published, and a field with no figure is left empty rather than filled with a guess. Income in several European countries is one figure per region, because that is the finest level at which it is published.

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('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('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.749999,
  "data": [
    {
      "address": "518 Rochester Terrace NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 1476086,
      "property_id": "103f92f6cf7bbdd9",
      "property_type": "Land"
    },
    {
      "address": "36 Crimson Ridge Heights NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "estimate_sale_price": 426463,
      "property_id": "104fb85a9c002e5d",
      "property_type": "Commercial"
    },
    {
      "address": "54 Rowmont Link NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 850575,
      "property_id": "1055f97323e53f25",
      "property_type": "House"
    },
    {
      "address": "499 Rochester Terrace NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 869910,
      "property_id": "1106094a42c3757d",
      "property_type": "Land"
    },
    {
      "address": "304 30 Rochester View NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "estimate_sale_price": 616919,
      "postal_code": "T3L0M8",
      "property_id": "1198b011e799062c",
      "property_type": "Townhouse"
    },
    {
      "address": "95 Royston He NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 944068,
      "property_id": "11aa161875771a70",
      "property_type": "Land"
    },
    {
      "address": "399 Rowley Way NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 845177,
      "postal_code": "T3L0H5",
      "property_id": "11ae22f58673d45b",
      "property_type": "Townhouse"
    },
    {
      "address": "40 Rowmont Common NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 698422,
      "postal_code": "T3L0L3",
      "property_id": "11d2132629e36a28",
      "property_type": "House"
    },
    {
      "address": "16 Rowmont Common NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 805834,
      "postal_code": "T3L0L3",
      "property_id": "11f8d3671079fb5e",
      "property_type": "House"
    },
    {
      "address": "435 Crimson Ridge Place NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "estimate_sale_price": 856192,
      "postal_code": "T3L2M4",
      "property_id": "1209fe3057284c96",
      "property_type": "House"
    },
    {
      "address": "288 Crimson Ridge Place NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "estimate_sale_price": 962443,
      "postal_code": "T3L2M4",
      "property_id": "1277c8e032dd2f50",
      "property_type": "House"
    },
    {
      "address": "12300 Bearspaw Dam Road NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.46153846,
      "demographic_income_median_after_tax": 174304,
      "estimate_sale_price": 518369,
      "postal_code": "T3L1S4",
      "property_id": "127d1b2d00e4f3c8",
      "property_type": "Commercial"
    },
    {
      "address": "103 Royston He NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 829820,
      "property_id": "127d6face59614c5",
      "property_type": "Land"
    },
    {
      "address": "309 Rowmont Drive NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.44876325,
      "demographic_income_median_after_tax": 192859,
      "estimate_sale_price": 697557,
      "postal_code": "T3L0J4",
      "property_id": "12b2d696502ebf7f",
      "property_type": "Land"
    },
    {
      "address": "48 Rowley Terrace NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.44520548,
      "demographic_income_median_after_tax": 188345,
      "estimate_sale_price": 885747,
      "postal_code": "T3L0G6",
      "property_id": "12c72dfadc700db1",
      "property_type": "House"
    },
    {
      "address": "242 Haskayne Drive NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 701155,
      "postal_code": "T3L0J7",
      "property_id": "12d33163d248bbb",
      "property_type": "Land"
    },
    {
      "address": "24 Rowley Common NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 849602,
      "postal_code": "T3L0G4",
      "property_id": "12e3ffac04ec3562",
      "property_type": "House"
    },
    {
      "address": "370 Rowley Way NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.44160584,
      "demographic_income_median_after_tax": 191840,
      "estimate_sale_price": 1611606,
      "postal_code": "T3L0G5",
      "property_id": "132a75dd38341a25",
      "property_type": "House"
    },
    {
      "address": "190 Haskayne Drive NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 700274,
      "postal_code": "T3L0J7",
      "property_id": "13c55a76d1a42b03",
      "property_type": "Land"
    },
    {
      "address": "21 Royston Grove NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.44390243,
      "demographic_income_median_after_tax": 194157,
      "estimate_sale_price": 967340,
      "postal_code": "T3L0M3",
      "property_id": "13ee743ebe1c6938",
      "property_type": "House"
    },
    {
      "address": "103 30 Rochester View NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "estimate_sale_price": 522885,
      "postal_code": "T3L0M8",
      "property_id": "13fea00f12334c25",
      "property_type": "Townhouse"
    },
    {
      "address": "1005 30 Rochester View NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "estimate_sale_price": 606259,
      "postal_code": "T3L0M8",
      "property_id": "14502147c72743bb",
      "property_type": "Townhouse"
    },
    {
      "address": "91 Royston Park NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.43939394,
      "demographic_income_median_after_tax": 195319,
      "estimate_sale_price": 889796,
      "postal_code": "T3L0M5",
      "property_id": "145b4b70a1b793f6",
      "property_type": "House"
    },
    {
      "address": "234 Rowley Way NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "estimate_sale_price": 1109108,
      "postal_code": "T3L0H5",
      "property_id": "1460ed9a1289aa91",
      "property_type": "Townhouse"
    },
    {
      "address": "345 Crimson Ridge Place NW",
      "community": "Haskayne",
      "demographic_household_type_family_with_children_percent": 0.5,
      "demographic_income_median_after_tax": 177234,
      "estimate_sale_price": 856997,
      "postal_code": "T3L2M4",
      "property_id": "148e56c59011c49b",
      "property_type": "House"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 17741
  },
  "price_quote": false,
  "result_total": 443522,
  "time_ms": 51,
  "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('https://api.houski.ca/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.249999,
  "data": [
    {
      "address": "24 Hoover Place SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 44.8,
      "demographic_income_median_after_tax": 119361,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 95.03981,
      "postal_code": "T2V3G4",
      "property_id": "100a43bcbefcc557"
    },
    {
      "address": "123 Haverhill Road SW",
      "construction_year": 1959,
      "demographic_age_median_of_the_population": 39.2,
      "demographic_income_median_after_tax": 107304,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 107.210106,
      "postal_code": "T2V3E4",
      "property_id": "1013d710d1e58e07"
    },
    {
      "address": "14 Harmon Place SW",
      "construction_year": 1967,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_after_tax": 92836,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 98.709076,
      "postal_code": "T2V2Z9",
      "property_id": "10645b1e28bd203a"
    },
    {
      "address": "48 Haddock Road SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 42.4,
      "demographic_income_median_after_tax": 129007,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 95.317726,
      "postal_code": "T2V3J8",
      "property_id": "115db63d076f3a98"
    },
    {
      "address": "35 Hanover Road SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 42.4,
      "demographic_income_median_after_tax": 129007,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 99.03464,
      "postal_code": "T2V3J5",
      "property_id": "11aa7ac7d42d4e18"
    },
    {
      "address": "320 Haddon Road SW",
      "construction_year": 1965,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_after_tax": 92836,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 95.68933,
      "postal_code": "T2V2Z3",
      "property_id": "11f946c45fa1c1e7"
    },
    {
      "address": "36 Hazelwood Crescent SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 40.0,
      "demographic_income_median_after_tax": 110921,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 85.00558,
      "postal_code": "T2V3B9",
      "property_id": "122b2b7eb91fc179"
    },
    {
      "address": "74 Hallbrook Drive SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 42.4,
      "demographic_income_median_after_tax": 129007,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 121.51717,
      "postal_code": "T2V3H6",
      "property_id": "125d99dde2dfb6e9"
    },
    {
      "address": "40 Hooke Road SW",
      "construction_year": 1959,
      "demographic_age_median_of_the_population": 42.4,
      "demographic_income_median_after_tax": 129007,
      "heating_type_first": "Hot water",
      "interior_sq_m": 94.94611,
      "postal_code": "T2V3K5",
      "property_id": "12addf6bfc0960f9"
    },
    {
      "address": "98 Hallbrook Drive SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 42.4,
      "demographic_income_median_after_tax": 129007,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 106.18817,
      "postal_code": "T2V3H6",
      "property_id": "12d36de7d1aa2266"
    },
    {
      "address": "19 Hyslop Drive SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 39.2,
      "demographic_income_median_after_tax": 110921,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 97.82609,
      "postal_code": "T2V3A2",
      "property_id": "1311cde6658c8926"
    },
    {
      "address": "39 Hillary Crescent SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 40.0,
      "demographic_income_median_after_tax": 114539,
      "heating_type_first": "Electric",
      "interior_sq_m": 102.1925,
      "postal_code": "T2V3J3",
      "property_id": "1368dd9c4aa64d7c"
    },
    {
      "address": "48 Hooke Road SW",
      "construction_year": 1959,
      "demographic_age_median_of_the_population": 42.4,
      "demographic_income_median_after_tax": 129007,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 94.017876,
      "postal_code": "T2V3K5",
      "property_id": "1378e958238056cd"
    },
    {
      "address": "39 Hillgrove Drive SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 42.4,
      "demographic_income_median_after_tax": 129007,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 103.401085,
      "postal_code": "T2V3L5",
      "property_id": "13ab05cd57dc55b6"
    },
    {
      "address": "61 Havenhurst Crescent SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 40.0,
      "demographic_income_median_after_tax": 110921,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 97.54738,
      "postal_code": "T2V3C4",
      "property_id": "13daa591cdb6e877"
    },
    {
      "address": "87 Hallbrook Drive SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 44.8,
      "demographic_income_median_after_tax": 119361,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 120.86635,
      "postal_code": "T2V3H8",
      "property_id": "13de3f1b7b22d70"
    },
    {
      "address": "99 Hanover Road SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 42.4,
      "demographic_income_median_after_tax": 129007,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 102.37872,
      "postal_code": "T2V3J6",
      "property_id": "13f643f0af1ba2a2"
    },
    {
      "address": "24 Hanover Road SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 40.0,
      "demographic_income_median_after_tax": 114539,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 102.37872,
      "postal_code": "T2V3J4",
      "property_id": "143a867d591a79db"
    },
    {
      "address": "38 Hutton Place SW",
      "construction_year": 1965,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_after_tax": 92836,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 104.56237,
      "postal_code": "T2V3B6",
      "property_id": "152d4e561c7f7870"
    },
    {
      "address": "24 Hillgreen Place SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 44.8,
      "demographic_income_median_after_tax": 119361,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 116.1288,
      "postal_code": "T2V3L2",
      "property_id": "153637089366e868"
    },
    {
      "address": "23 Hallbrook Drive SW",
      "construction_year": 1960,
      "demographic_age_median_of_the_population": 44.8,
      "demographic_income_median_after_tax": 119361,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 126.43999,
      "postal_code": "T2V3H5",
      "property_id": "15922129ea50e7d3"
    },
    {
      "address": "38 Hillgrove Drive SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 44.8,
      "demographic_income_median_after_tax": 119361,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 98.941734,
      "postal_code": "T2V3L6",
      "property_id": "15e741b599c33a2e"
    },
    {
      "address": "53 Hollyburn Road SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 40.0,
      "demographic_income_median_after_tax": 114539,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 101.07767,
      "postal_code": "T2V3H2",
      "property_id": "160c51df6a226bba"
    },
    {
      "address": "36 Hollyburn Road SW",
      "construction_year": 1958,
      "demographic_age_median_of_the_population": 40.0,
      "demographic_income_median_after_tax": 114539,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 102.3327,
      "postal_code": "T2V3H1",
      "property_id": "162bc8fea8ad3861"
    },
    {
      "address": "931 87 Avenue SW",
      "construction_year": 1960,
      "demographic_age_median_of_the_population": 44.8,
      "demographic_income_median_after_tax": 119361,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 129.97136,
      "postal_code": "T2V0W2",
      "property_id": "163b3d45b049f60f"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 3973
  },
  "price_quote": false,
  "result_total": 99304,
  "time_ms": 33,
  "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('https://api.houski.ca/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.249999,
  "data": [
    {
      "address": "12931 S Carondolet Avenue",
      "construction_year": 1964,
      "demographic_age_median_of_the_population": 41.7,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Hot water",
      "interior_sq_m": 101.07851,
      "postal_code": "60633",
      "property_id": "10014d5f9e03d9b0"
    },
    {
      "address": "13055 S Avenue N",
      "construction_year": 1964,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 102.56496,
      "postal_code": "60633",
      "property_id": "100c5f364ee7bcc0"
    },
    {
      "address": "13016 S Exchange Avenue",
      "construction_year": 1950,
      "demographic_age_median_of_the_population": 56.2,
      "demographic_income_median_pre_tax": 86442,
      "heating_type_first": "Hot water",
      "interior_sq_m": 85.00628,
      "postal_code": "60633",
      "property_id": "1043ef57fba1a258"
    },
    {
      "address": "13130 S Avenue O",
      "construction_year": 1956,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 97.548195,
      "postal_code": "60633",
      "property_id": "10468bbcfe72951f"
    },
    {
      "address": "12824 S Manistee Avenue",
      "construction_year": 1962,
      "demographic_age_median_of_the_population": 37.5,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Hot water",
      "interior_sq_m": 98.10561,
      "postal_code": "60633",
      "property_id": "1049d06e36ac4950"
    },
    {
      "address": "13156 S Avenue N",
      "construction_year": 1961,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 116.40751,
      "postal_code": "60633",
      "property_id": "1052b12ebea7792a"
    },
    {
      "address": "13132 S Buffalo Avenue",
      "construction_year": 1957,
      "demographic_age_median_of_the_population": 41.7,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 100.33528,
      "postal_code": "60633",
      "property_id": "1098d5fc4337d3b6"
    },
    {
      "address": "1602 E 132 Street",
      "construction_year": 1888,
      "demographic_age_median_of_the_population": 56.2,
      "demographic_income_median_pre_tax": 86442,
      "heating_type_first": "Hot water",
      "interior_sq_m": 107.488815,
      "postal_code": "60827",
      "property_id": "10bd8b19ce79eaea"
    },
    {
      "address": "12849 S Saginaw Avenue",
      "construction_year": 1961,
      "demographic_age_median_of_the_population": 37.5,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Hot water",
      "interior_sq_m": 75.530174,
      "postal_code": "60633",
      "property_id": "10ca499e367e54ad"
    },
    {
      "address": "2721 E 127 Street",
      "construction_year": 1962,
      "demographic_age_median_of_the_population": 37.5,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 96.61916,
      "postal_code": "60633",
      "property_id": "110d8523c6a5ffa2"
    },
    {
      "address": "12736 S Muskegon Avenue",
      "construction_year": 1966,
      "demographic_age_median_of_the_population": 37.5,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Hot water",
      "interior_sq_m": 96.61916,
      "postal_code": "60633",
      "property_id": "111b4770a05988a2"
    },
    {
      "address": "12941 S Carondolet Avenue",
      "construction_year": 1903,
      "demographic_age_median_of_the_population": 41.7,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Hot water",
      "interior_sq_m": 101.07851,
      "postal_code": "60633",
      "property_id": "112777b82cc95bf4"
    },
    {
      "address": "12924 S Houston Avenue",
      "construction_year": 1963,
      "demographic_age_median_of_the_population": 41.7,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Hot water",
      "interior_sq_m": 96.61916,
      "postal_code": "60633",
      "property_id": "11299e967c2d4a87"
    },
    {
      "address": "13123 S Avenue O",
      "construction_year": 1944,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 62.430843,
      "postal_code": "60633",
      "property_id": "11403d077f948632"
    },
    {
      "address": "3100 E 130 Street",
      "construction_year": 1965,
      "demographic_age_median_of_the_population": 41.7,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 119.47331,
      "postal_code": "60633",
      "property_id": "1152d446892e1992"
    },
    {
      "address": "13304 S Burley Avenue",
      "construction_year": 1903,
      "demographic_age_median_of_the_population": 54.9,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 72.46437,
      "postal_code": "60633",
      "property_id": "11597ac249f29a7"
    },
    {
      "address": "11625 S Avenue L",
      "construction_year": 1983,
      "demographic_age_median_of_the_population": 65.4,
      "demographic_income_median_pre_tax": 81144,
      "heating_type_first": "Gas furnace",
      "interior_sq_m": 111.48365,
      "postal_code": "60617",
      "property_id": "116f4ad9f5532ef5"
    },
    {
      "address": "13219 S Avenue O",
      "construction_year": 1952,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 121.79588,
      "postal_code": "60633",
      "property_id": "1172c21cfe7518e6"
    },
    {
      "address": "11623 S Avenue L",
      "construction_year": 1979,
      "demographic_age_median_of_the_population": 65.4,
      "demographic_income_median_pre_tax": 81144,
      "heating_type_first": "Hot water",
      "interior_sq_m": 111.48365,
      "postal_code": "60617",
      "property_id": "117ae06407ac05d4"
    },
    {
      "address": "13243 S Avenue O",
      "construction_year": 1952,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 120.959755,
      "postal_code": "60633",
      "property_id": "118ec78566ecc2fb"
    },
    {
      "address": "12624 S Saginaw Avenue",
      "construction_year": 1964,
      "demographic_age_median_of_the_population": 37.5,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Hot water",
      "interior_sq_m": 96.61916,
      "postal_code": "60633",
      "property_id": "11a687140f8d8644"
    },
    {
      "address": "12804 S Muskegon Avenue",
      "construction_year": 1963,
      "demographic_age_median_of_the_population": 37.5,
      "demographic_income_median_pre_tax": 84192,
      "heating_type_first": "Hot water",
      "interior_sq_m": 101.07851,
      "postal_code": "60633",
      "property_id": "12095912e4b26fe1"
    },
    {
      "address": "13050 S Buffalo Avenue",
      "construction_year": 1967,
      "demographic_age_median_of_the_population": 41.7,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 95.87594,
      "postal_code": "60633",
      "property_id": "120f95cdcbd9aafb"
    },
    {
      "address": "13200 S Avenue N",
      "construction_year": 1961,
      "demographic_age_median_of_the_population": 42.0,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 116.40751,
      "postal_code": "60633",
      "property_id": "12303260f0f3a90e"
    },
    {
      "address": "13329 S Houston Avenue",
      "construction_year": 1898,
      "demographic_age_median_of_the_population": 54.9,
      "demographic_income_median_pre_tax": 158064,
      "heating_type_first": "Hot water",
      "interior_sq_m": 74.13663,
      "postal_code": "60633",
      "property_id": "123f8b8ccd10d8f6"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 7738
  },
  "price_quote": false,
  "result_total": 193426,
  "time_ms": 46,
  "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 127 pre-joined features per address, and a dataset purchase made for that purpose is the way to license them for training. 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 the places 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, province and region 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.