Filtering

Most Houski API endpoints let you filter by any field, or geographically via bounding box or polygon (examples below).

Filter by adding query parameters to the request URL. To filter the properties endpoint by full bathrooms, use any of:

FilterNameExample
Greater thangtbathroom_full_gt=3
Greater than or equal togtebathroom_full_gte=3
Less thanltbathroom_full_lt=3
Less than or equal toltebathroom_full_lte=3
Equal toeqbathroom_full_eq=3
Not equal toneqbathroom_full_neq=3
In the given listinproperty_type_in=House,Apartment
Matches a regular expressionregexbathroom_full_regex=1|3
Does not match a regular expressionnregexbathroom_full_nregex=1|3

Place parameters and place filters

There are two ways to narrow a request to a place. The place parameters (country_abbreviation, province_abbreviation, city, community and address) name the place the way you would write it. A place filter, such as city_eq, is an ordinary filter on a field, and it compares your text with the stored value exactly.

The place parameters ignore letter case, accents, punctuation, and whether words are joined by spaces, hyphens or underscores. So city=calgary and city=Calgary find the same city, and city=st-catharines finds St. Catharines. Each one needs the levels above it: city needs country_abbreviation and province_abbreviation, and community and address need city as well. The properties endpoint takes all five. The aggregate and location endpoints take all but address.

A place filter matches only the exact stored text, letter case included. city_eq=Calgary finds Calgary, but city_eq=calgary finds nothing.

Addresses need extra care. Neither address nor address_eq rewrites abbreviations, and stored addresses write road types in full. So address=151 mckerrell place se finds the property, and address=151 mckerrell pl se does not. For an address as a person typed it, with abbreviations, typos or missing parts, use the search endpoint and pass the property_id it returns to the other endpoints.

Use the place parameters whenever you narrow a request to one place. Use a place filter only where no place parameter fits: on the geocoding and map endpoints, which have no place parameters, for several places at once (community_in), or for a city name across every province. When you do, copy the spelling from the location endpoint. Id filters such as city_id_eq and property_id_eq compare an id taken from a response, which is exact by nature, so they are a good choice too.

Programming language

Select the programming language you want to display the code examples in.

Filtering by number of bedrooms
Request
Shell session
curl -X GET "https://api.houski.ca/properties?api_key=YOUR_API_KEY&bedroom_eq=3&country_abbreviation=ca&page=1&province_abbreviation=ab&results_per_page=3&select=bedroom,den,estimate_list_price,latitude,longitude"
TypeScript code
const houski_properties_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('bedroom_eq', '3');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('page', '1');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '3');
    url.searchParams.set('select', 'bedroom,den,estimate_list_price,latitude,longitude');

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

    return data;
}

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

// Log the response
console.log(data);
})();
Response
JSON
{
  "cache_hit": true,
  "cost_cents": 1.02,
  "data": [
    {
      "address": "107 100 Picci Court",
      "bedroom": 3,
      "den": 0,
      "estimate_list_price": 406003,
      "latitude": 51.59273,
      "longitude": -113.490425,
      "property_id": "102aca74c9c48bf6"
    },
    {
      "address": "214 1 Street SE",
      "bedroom": 3,
      "den": 0,
      "estimate_list_price": 359014,
      "latitude": 51.58849,
      "longitude": -113.48332,
      "property_id": "109ce04cfe6ec406"
    },
    {
      "address": "209 First Street NW",
      "bedroom": 3,
      "den": 0,
      "estimate_list_price": 406003,
      "latitude": 51.592194,
      "longitude": -113.48641,
      "property_id": "10a4b105b8c0320b"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 379071
  },
  "price_quote": false,
  "result_total": 1137211,
  "time_ms": 72,
  "ui_info": {
    "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"
  }
}
Filtering by a bounding box
A bounding box is a rectangular geographic region defined by its northeast and southwest corner coordinates. Requests using these parameters only return properties inside the box.
Request
Shell session
curl -X GET "https://api.houski.ca/properties?api_key=YOUR_API_KEY&bbox_ne_lat=51.1005&bbox_ne_lng=-113.508&bbox_sw_lat=50.6668&bbox_sw_lng=-114.4593&country_abbreviation=ca&page=1&province_abbreviation=ab&results_per_page=3&select=bedroom,den,estimate_list_price,latitude,longitude"
TypeScript code
const houski_properties_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('bbox_ne_lat', '51.1005');
    url.searchParams.set('bbox_ne_lng', '-113.508');
    url.searchParams.set('bbox_sw_lat', '50.6668');
    url.searchParams.set('bbox_sw_lng', '-114.4593');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('page', '1');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '3');
    url.searchParams.set('select', 'bedroom,den,estimate_list_price,latitude,longitude');

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

    return data;
}

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

// Log the response
console.log(data);
})();
Response
JSON
{
  "cache_hit": true,
  "cost_cents": 1.02,
  "data": [
    {
      "address": "222 Cimarron Drive",
      "bedroom": 4,
      "den": 0,
      "estimate_list_price": 652686,
      "latitude": 50.706657,
      "longitude": -113.96009,
      "property_id": "10493b4095f37705"
    },
    {
      "address": "33 Cimarron Springs Circle",
      "bedroom": 4,
      "den": 0,
      "estimate_list_price": 915579,
      "latitude": 50.70759,
      "longitude": -113.9561,
      "property_id": "10cbb87ce2216e2d"
    },
    {
      "address": "458 Cimarron Boulevard",
      "bedroom": 3,
      "den": 0,
      "estimate_list_price": 666132,
      "latitude": 50.705498,
      "longitude": -113.95678,
      "property_id": "11c4fbfedfebcb22"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 174431
  },
  "price_quote": false,
  "result_total": 523293,
  "time_ms": 75,
  "ui_info": {
    "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"
  }
}
Filtering by a polygon
A polygon is an arbitrary shape defined by ordered latitude-longitude pairs. Only properties inside the polygon are returned. Format: lat-lng pairs separated by underscores, with each pair separated by a comma. A polygon may have at most 100 points, because every point is tested against every property the request reaches. Simplify a hand-drawn shape before sending it.
Request
Shell session
curl -X GET "https://api.houski.ca/properties?api_key=YOUR_API_KEY&country_abbreviation=ca&page=1&polygon=51.0447_-114.0719,51.0544_-114.0719,51.0544_-114.0856,51.0452_-114.0856&province_abbreviation=ab&results_per_page=3&select=bedroom,den,estimate_list_price,latitude,longitude"
TypeScript code
const houski_properties_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('country_abbreviation', 'ca');
    url.searchParams.set('page', '1');
    url.searchParams.set('polygon', '51.0447_-114.0719,51.0544_-114.0719,51.0544_-114.0856,51.0452_-114.0856');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '3');
    url.searchParams.set('select', 'bedroom,den,estimate_list_price,latitude,longitude');

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

    return data;
}

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

// Log the response
console.log(data);
})();
Response
JSON
{
  "cache_hit": true,
  "cost_cents": 1.02,
  "data": [
    {
      "address": "1010 1 Avenue NW",
      "bedroom": 3,
      "den": 0,
      "estimate_list_price": 603159,
      "latitude": 51.054256,
      "longitude": -114.08299,
      "property_id": "116840ad9cae73b8"
    },
    {
      "address": "203 1087 2 Avenue NW",
      "bedroom": 2,
      "den": 0,
      "estimate_list_price": 1155471,
      "latitude": 51.053944,
      "longitude": -114.08541,
      "property_id": "129864426968a4e9"
    },
    {
      "address": "105 9 Street NW",
      "bedroom": 2,
      "den": 0,
      "estimate_list_price": 699765,
      "latitude": 51.053703,
      "longitude": -114.08186,
      "property_id": "13ce2ccbf802d549"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 3072
  },
  "price_quote": false,
  "result_total": 9215,
  "time_ms": 67,
  "ui_info": {
    "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"
  }
}

Filtering expansion data

When using expand to include datasets (listings, permits, assessments), expand filters control which expanded records are returned. They work independently of your main property filters and only affect expanded data.

Format: expand_[field]_[operator]=[value]

Listings filters

FilterDescriptionExample
expand_listing_date_gteListings after specified dateexpand_listing_date_gte=2024-01-01
expand_listing_date_gtListings strictly after dateexpand_listing_date_gt=2024-06-01
expand_listing_event_eqSpecific listing eventsexpand_listing_event_eq=Price decrease
expand_estimate_list_price_ltListing prices below amountexpand_estimate_list_price_lt=500000

Permits filters

Useful for finding properties with specific permits or renovations.

FilterDescriptionExample
expand_permit_application_date_gtePermits applied for after dateexpand_permit_application_date_gte=2023-01-01
expand_permit_content_regexSearch permit descriptions with regex"expand_permit_content_regex=(?i)\b(secondary|suite)\b"

Common permit search patterns

Search typeRegex pattern
Secondary suites"(?i)\b(secondary|suite)\b"
Renovations"(?i)\b(renovation|remodel)\b"
Kitchen and bathroom upgrades"(?i)\b(kitchen|bathroom)\b"
Outdoor improvements"(?i)\b(deck|patio|fence)\b"
Garage and parking"(?i)\b(garage|carport|parking)\b"

Assessments filters

FilterDescriptionExample
expand_assessment_year_eqAssessments for specific yearexpand_assessment_year_eq=2024
expand_assessment_value_gteAssessment value minimumsexpand_assessment_value_gte=500000
expand_assessment_value_lteAssessment value maximumsexpand_assessment_value_lte=800000

Filter expand match

filter_expand_match controls which properties return based on expanded data availability.

ValueBehaviorUse case
Default (no parameter)All properties, with or without expanded dataGeneral search with optional expansion
anyOnly properties with ANY requested expansion dataListing OR permit data
allOnly properties with ALL requested expansion dataListing AND permit data

If you only need properties that have a data set, and you do not need the expanded records themselves, filter on the matching boolean field instead: has_expand_listings, has_expand_listings_rent, has_expand_permits, or has_expand_assessments. For example, has_expand_listings_eq=true returns only properties with listing history. These are fast indexed filters on the property record itself, so they cost less and run faster than expanding a data set with filter_expand_match=all just to check for its presence.

Example usage

Recent price decreases
Request
Shell session
curl -X GET "https://api.houski.ca/properties?api_key=YOUR_API_KEY&country_abbreviation=ca&expand=listings&expand_listing_date_gt=2024-04-01&expand_listing_event_eq=Price decrease&filter_expand_match=all&page=1&province_abbreviation=ab&results_per_page=3&select=estimate_list_price"
TypeScript code
const houski_properties_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('country_abbreviation', 'ca');
    url.searchParams.set('expand', 'listings');
    url.searchParams.set('expand_listing_date_gt', '2024-04-01');
    url.searchParams.set('expand_listing_event_eq', 'Price decrease');
    url.searchParams.set('filter_expand_match', 'all');
    url.searchParams.set('page', '1');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '3');
    url.searchParams.set('select', 'estimate_list_price');

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

    return data;
}

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

// Log the response
console.log(data);
})();
Response
JSON
{
  "cache_hit": true,
  "cost_cents": 0.76,
  "data": [
    {
      "address": "209 Centre Street S",
      "estimate_list_price": 294219,
      "listings": [
        {
          "expand_estimate_list_price": 395000,
          "expand_listing_date": "2025-06-18",
          "expand_listing_event": "Price decrease",
          "property_id": "10d59ae6f801874f"
        }
      ],
      "property_id": "10d59ae6f801874f"
    },
    {
      "address": "509 A Linview Road",
      "estimate_list_price": 246171,
      "listings": [
        {
          "expand_estimate_list_price": 219900,
          "expand_listing_date": "2024-09-27",
          "expand_listing_event": "Price decrease",
          "property_id": "29266c1a5693740a"
        }
      ],
      "property_id": "29266c1a5693740a"
    },
    {
      "address": "503 Linview Road",
      "estimate_list_price": 523276,
      "listings": [
        {
          "expand_estimate_list_price": 546500,
          "expand_listing_date": "2025-08-27",
          "expand_listing_event": "Price decrease",
          "property_id": "40a4e9405269d195"
        },
        {
          "expand_estimate_list_price": 499900,
          "expand_listing_date": "2025-09-04",
          "expand_listing_event": "Price decrease",
          "property_id": "40a4e9405269d195"
        }
      ],
      "property_id": "40a4e9405269d195"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 33808
  },
  "price_quote": false,
  "result_total": 101423,
  "time_ms": 360,
  "ui_info": {
    "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"
  }
}
Secondary suite permits
Request
Shell session
curl -X GET "https://api.houski.ca/properties?api_key=YOUR_API_KEY&country_abbreviation=ca&expand=permits&expand_permit_application_date_gte=2023-01-01&expand_permit_content_regex=(?i)\b(secondary|suite)\b&filter_expand_match=all&page=1&province_abbreviation=ab&results_per_page=3&select=estimate_list_price"
TypeScript code
const houski_properties_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('country_abbreviation', 'ca');
    url.searchParams.set('expand', 'permits');
    url.searchParams.set('expand_permit_application_date_gte', '2023-01-01');
    url.searchParams.set('expand_permit_content_regex', '(?i)\b(secondary|suite)\b');
    url.searchParams.set('filter_expand_match', 'all');
    url.searchParams.set('page', '1');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '3');
    url.searchParams.set('select', 'estimate_list_price');

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

    return data;
}

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

// Log the response
console.log(data);
})();
Response
JSON
{
  "cache_hit": true,
  "cost_cents": 1.16,
  "data": [
    {
      "address": "10101 112 Street",
      "estimate_list_price": 1945590,
      "permits": [
        {
          "expand_permit_application_date": "2026-05-08",
          "expand_permit_content": "Permit type: Plumbing|Status: Finalled|Description: \nCommercial Addition and Interior Renovation - NWP New Location for Trades Program\n72 Fixtures|Work item type: Institutional: New Development|Work class: 01-New construction|Construction type: 624-Post-secondary institution; technical institute, trade school|Occupancy code: A-2 Assembly for occupancies not elsewhere classified in Group A|Neighbourhood: GATEWAY|Subdivision: GATEWAY PHASE 3D|Valuation: N/A|Building area m2: N/A|Location type: Address|Jurisdiction: CGP|Parcel: 12573",
          "expand_permit_id": "PR260090-PL1",
          "expand_permit_type": "Building",
          "property_id": "ffc1a999b66e12e9"
        },
        {
          "expand_permit_application_date": "2026-05-12",
          "expand_permit_content": "Permit type: Electrical|Status: Under Inspection|Description: \nCommercial Addition and Interior Renovation - NWP New Location for Trades Program\nElectrical service upgrade from 120/208V to 347/600V service distribution\nMain electrical distribution equipment\nBranch power distribution systems\nInterior lighting systems\nEmergency lighting systems\nExit signage systems\nExterior lighting systems\nLighting control systems\nFire Alarm systems\nGeneral receptacle systems\nCommunication and data systems\nMechanical equipment electrical connections\n600A 347/600V|Work item type: Institutional: New Development|Work class: 01-New construction|Construction type: 624-Post-secondary institution; technical institute, trade school|Occupancy code: A-2 Assembly for occupancies not elsewhere classified in Group A|Neighbourhood: GATEWAY|Subdivision: GATEWAY PHASE 3D|Valuation: N/A|Building area m2: N/A|Location type: Address|Jurisdiction: CGP|Parcel: 12573",
          "expand_permit_id": "PR260090-EL1",
          "expand_permit_type": "Building",
          "property_id": "ffc1a999b66e12e9"
        },
        {
          "expand_permit_application_date": "2026-05-08",
          "expand_permit_content": "Permit type: Gas|Status: Finalled|Description: \nCommercial Addition and Interior Renovation - NWP New Location for Trades Program\nBTU 12M|Work item type: Institutional: New Development|Work class: 01-New construction|Construction type: 624-Post-secondary institution; technical institute, trade school|Occupancy code: A-2 Assembly for occupancies not elsewhere classified in Group A|Neighbourhood: GATEWAY|Subdivision: GATEWAY PHASE 3D|Valuation: N/A|Building area m2: N/A|Location type: Address|Jurisdiction: CGP|Parcel: 12573",
          "expand_permit_id": "PR260090-GS1",
          "expand_permit_type": "Building",
          "property_id": "ffc1a999b66e12e9"
        },
        {
          "expand_permit_application_date": "2026-04-28",
          "expand_permit_content": "Permit type: Building - Commercial|Status: Occupancy Released|Description: Commercial Alteration - Old Ford Hansen Location.  New Location for NWP Trades\nExterior and Interior Demolition of Structural components only|Work item type: Institutional: Alteration|Work class: 03-Alteration and improvements|Construction type: 624-Post-secondary institution; technical institute, trade school|Occupancy code: Not Required|Neighbourhood: GATEWAY|Subdivision: GATEWAY PHASE 3D|Valuation: 50000.0|Building area m2: 46|Location type: Address|Jurisdiction: CGP|Parcel: 12573",
          "expand_permit_id": "PR260067-BD1",
          "expand_permit_type": "Building",
          "expand_permit_value": 50000,
          "property_id": "ffc1a999b66e12e9"
        },
        {
          "expand_permit_application_date": "2026-05-06",
          "expand_permit_content": "Permit type: Building - Commercial|Status: Occupancy Released|Description: Commercial Alteration - Old Ford Hansen Location.  New Location for NWP Trades\nExterior and Interior Demolition of Structural components only|Work item type: Institutional: New Development|Work class: 01-New construction|Construction type: 624-Post-secondary institution; technical institute, trade school|Occupancy code: A-2 Assembly for occupancies not elsewhere classified in Group A|Neighbourhood: GATEWAY|Subdivision: GATEWAY PHASE 3D|Valuation: 9100000.0|Building area m2: 0|Location type: Address|Jurisdiction: CGP|Parcel: 12573",
          "expand_permit_id": "PR260090-BD1",
          "expand_permit_type": "Building",
          "expand_permit_value": 9100000,
          "property_id": "ffc1a999b66e12e9"
        }
      ],
      "property_id": "ffc1a999b66e12e9"
    },
    {
      "address": "9238 109 Avenue",
      "estimate_list_price": 433246,
      "permits": [
        {
          "expand_permit_application_date": "2023-09-25",
          "expand_permit_content": "Permit type: Gas|Status: Finalled|Description: Install radiant heater in detached garage. Secondary gas line from garage to house. Tie in house.\n40,000 BTU's|Work item type: Gas Unit Heater|Work class: N/A|Construction type: N/A|Occupancy code: N/A|Neighbourhood: MOUNTVIEW|Subdivision: N/A|Valuation: N/A|Building area m2: N/A|Location type: Address|Jurisdiction: CGP|Parcel: 3824",
          "expand_permit_id": "PR231026-GS1",
          "expand_permit_type": "Building",
          "property_id": "d34b56f57f521493"
        }
      ],
      "property_id": "d34b56f57f521493"
    },
    {
      "address": "9209 100 Street",
      "estimate_list_price": 2132727,
      "permits": [
        {
          "expand_permit_application_date": "2026-07-31",
          "expand_permit_content": "Permit type: Electrical|Status: Under Inspection|Description: \nCommercial Alteration - Boardwalk Park Estates\nInterior Renovations of Leasing Office and one suite\nAmps 30 Volts 240\n|Work item type: Commercial: Alteration|Work class: 03-Alteration and improvements|Construction type: 310-Apartment, apartment building, duplex, triplex, quadruple|Occupancy code: Not Required|Neighbourhood: HIGHLAND PARK|Subdivision: N/A|Valuation: 12000.0|Building area m2: N/A|Location type: Address|Jurisdiction: CGP|Parcel: 18930",
          "expand_permit_id": "PR251841-EL1",
          "expand_permit_type": "Building",
          "expand_permit_value": 12000,
          "property_id": "da070de392947ae"
        },
        {
          "expand_permit_application_date": "2025-11-20",
          "expand_permit_content": "Permit type: Building - Commercial|Status: Issued|Description: Commercial Alteration - Boardwalk Park Estates\nInterior Renovations of Leasing Office and one suite|Work item type: Commercial: Alteration|Work class: 03-Alteration and improvements|Construction type: 310-Apartment, apartment building, duplex, triplex, quadruple|Occupancy code: Not Required|Neighbourhood: HIGHLAND PARK|Subdivision: N/A|Valuation: 190000.0|Building area m2: 0|Location type: Address|Jurisdiction: CGP|Parcel: 18930",
          "expand_permit_id": "PR251841-BD1",
          "expand_permit_type": "Building",
          "expand_permit_value": 190000,
          "property_id": "da070de392947ae"
        }
      ],
      "property_id": "da070de392947ae"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 5051
  },
  "price_quote": false,
  "result_total": 15153,
  "time_ms": 664,
  "ui_info": {
    "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"
  }
}
High assessments in 2024
Request
Shell session
curl -X GET "https://api.houski.ca/properties?api_key=YOUR_API_KEY&country_abbreviation=ca&expand=assessments&expand_assessment_value_gte=750000&expand_assessment_year_eq=2024&filter_expand_match=all&page=1&province_abbreviation=ab&results_per_page=3&select=estimate_list_price"
TypeScript code
const houski_properties_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('country_abbreviation', 'ca');
    url.searchParams.set('expand', 'assessments');
    url.searchParams.set('expand_assessment_value_gte', '750000');
    url.searchParams.set('expand_assessment_year_eq', '2024');
    url.searchParams.set('filter_expand_match', 'all');
    url.searchParams.set('page', '1');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '3');
    url.searchParams.set('select', 'estimate_list_price');

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

    return data;
}

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

// Log the response
console.log(data);
})();
Response
JSON
{
  "cache_hit": true,
  "cost_cents": 0.65999997,
  "data": [
    {
      "address": "39 Greenfield Link",
      "assessments": [
        {
          "expand_assessment_value": 779400,
          "expand_assessment_year": 2024,
          "property_id": "32967a0637cb24fb"
        }
      ],
      "estimate_list_price": 1055844,
      "property_id": "32967a0637cb24fb"
    },
    {
      "address": "103 8701 94 Street",
      "assessments": [
        {
          "expand_assessment_value": 15506800,
          "expand_assessment_year": 2024,
          "property_id": "8cdc0d45450ca8bb"
        }
      ],
      "estimate_list_price": 623341,
      "property_id": "8cdc0d45450ca8bb"
    },
    {
      "address": "31 Greenfield Link",
      "assessments": [
        {
          "expand_assessment_value": 777700,
          "expand_assessment_year": 2024,
          "property_id": "c98df0fadfe00ef"
        }
      ],
      "estimate_list_price": 1047381,
      "property_id": "c98df0fadfe00ef"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 43001
  },
  "price_quote": false,
  "result_total": 129001,
  "time_ms": 1145,
  "ui_info": {
    "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"
  }
}

Important notes

  • Without filter_expand_match, expand filters only narrow which records appear inside each expanded array. Every property still comes back, just with fewer attached records.
  • filter_expand_match=all keeps a property only when every dataset listed in expand= produces at least one matching record for it. Use this when you want properties that satisfy all conditions at once, like permit data AND listing data.
  • filter_expand_match=any keeps a property when at least one dataset in expand= produces a matching record. Use this for permit data OR listing data.
  • With expand=permits,listings, a property that matches on permits but has no matching listings is kept by any and dropped by all. A property with neither is dropped by both.
  • Prefix a regex with (?i) for case-insensitive matching, for example expand_permit_content_regex=(?i)kitchen matches Kitchen and KITCHEN.
  • Use "\b" word boundaries for whole-word matches, for example "\bsuite\b" matches suite but not suitable.
  • You can combine multiple expand_* filters in one request. Each filter applies to its own dataset, and filter_expand_match decides how the per-dataset hits combine into the final property list.