Property data for proptech builders: The API stack powering the next generation of real estate apps

Photo of Alex Wilkinson
Alex Wilkinson
CEO of Houski
2026-02-23

Every successful proptech company has the same foundation: comprehensive, reliable property data. Whether you're building a home valuation tool, investment platform, mortgage comparison site, or AI-powered assistant, the quality and depth of your data determines what you can build.

The challenge? Getting property data has historically been expensive, complicated, and locked behind Multiple Listing Service (MLS) board memberships with restrictive usage terms.

Houski's property data API changes this. With more than 220 million properties across 16 countries, 400+ data fields per property, and developer-friendly pricing, we provide the infrastructure layer proptech builders need to ship faster.

Why property data is the proptech foundation

Consider what today's leading platforms do:

  • Zillow: Property search, automated valuations, market trends
  • Redfin: Real-time listings, price estimates, neighborhood data
  • Opendoor: Instant offers, condition assessment, market timing
  • Compass: Agent tools, market analytics, client matching

Strip away the user experience (UX) layer and branding, and these are all property data products. They collect, process, and present property information in ways that create value.

Building a competitive product requires the same foundational data layer:

TypeScript code
// The data stack behind every proptech app
interface ProptechDataLayer {
  // Core property data
  properties: {
    physical: 'bedrooms, bathrooms, sq footage, lot size';
    financial: 'assessments, taxes, valuations';
    location: 'coordinates, neighborhoods';
    history: 'listings, permits, assessments';
  };

  // Derived analytics
  analytics: {
    valuations: 'automated valuation estimates with confidence scores';
    trends: 'historical valuation trajectories, area benchmarks';
    comparables: 'similar properties, recent listings';
    predictions: 'date-conditioned valuations across past dates';
  };

  // Integration capabilities
  apis: {
    search: 'fuzzy address lookup';
    properties: 'filter by any combination of fields, plus bounding box and polygon';
    geocoding: 'coordinates to nearby properties';
    aggregation: 'one aggregation per location, batchable in a single call';
    bulk: 'CSV dataset exports for entire provinces, states and countries';
  };
}

What you can build with Houski's API

Home valuation tools

Build instant home value estimators that rival established players. We would first resolve the address with /search, then call /avm with the resulting property_id. The block below is a live call against the real automated valuation model (AVM) endpoint:

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

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

    const url = new URL('https://api.houski.ca/avm');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('property_id', 'bd9c6fb24c31c772');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": true,
  "cost_cents": 500.0,
  "data": {
    "address": "302 610 17 Avenue SW",
    "bathroom_full": 1,
    "bathroom_half": 1,
    "bedroom": 2,
    "city": "Calgary",
    "comparable_properties": [
      {
        "address": "802 616 15 Avenue SW",
        "distance_km": 0.11240647,
        "estimate_sale_date_sold": "2026-06-22",
        "image": "b596dd0be7e65ba5_87146c39",
        "interior_sq_m": 89.000374,
        "latitude": 51.039192,
        "list_price": 269900,
        "longitude": -114.07533
      },
      {
        "address": "303 616 15 Avenue SW",
        "distance_km": 0.11240647,
        "estimate_sale_date_sold": "2025-10-22",
        "image": "c0290e1291b85f6f_f2c54242",
        "interior_sq_m": 88.35006,
        "latitude": 51.039192,
        "list_price": 267500,
        "longitude": -114.07533
      },
      {
        "address": "501 1209 6 Street SW",
        "distance_km": 0.40037048,
        "estimate_sale_date_sold": "2025-07-16",
        "image": "bfe19f1bd25edec5_6d6f31cf",
        "interior_sq_m": 92.99517,
        "latitude": 51.041553,
        "list_price": 269000,
        "longitude": -114.07714
      },
      {
        "address": "402 820 15 Avenue SW",
        "distance_km": 0.3949422,
        "estimate_sale_date_sold": "2026-07-20",
        "image": "d630851caec37a97_e6d637d7",
        "interior_sq_m": 95.03902,
        "latitude": 51.039337,
        "list_price": 270000,
        "longitude": -114.080444
      },
      {
        "address": "604 330 15 Avenue SW",
        "distance_km": 0.36335313,
        "estimate_sale_date_sold": "2024-03-02",
        "image": "5fe35f1f84713e8e_feba293b",
        "interior_sq_m": 89.836494,
        "latitude": 51.03906,
        "list_price": 265000,
        "longitude": -114.0701
      },
      {
        "address": "204 330 15 Avenue SW",
        "distance_km": 0.36335313,
        "estimate_sale_date_sold": "2025-07-04",
        "image": "1bfdde85fb55e04d_5932f4ab",
        "interior_sq_m": 89.557785,
        "latitude": 51.03906,
        "list_price": 264900,
        "longitude": -114.0701
      },
      {
        "address": "101 523 15 Avenue SW",
        "distance_km": 0.15784955,
        "estimate_sale_date_sold": "2023-08-29",
        "image": "6d3f02fca68d547e_b6f2526e",
        "interior_sq_m": 91.97324,
        "latitude": 51.038586,
        "list_price": 288888,
        "longitude": -114.07294
      },
      {
        "address": "606 537 14 Avenue SW",
        "distance_km": 0.1804406,
        "estimate_sale_date_sold": "2023-12-02",
        "image": "9e126925987ae5c0_56a2deed",
        "interior_sq_m": 89.46488,
        "latitude": 51.03956,
        "list_price": 255000,
        "longitude": -114.073715
      },
      {
        "address": "305 235 15 Avenue SW",
        "distance_km": 0.49067223,
        "estimate_sale_date_sold": "2025-11-24",
        "image": "c4b5e786dc389a35_4c1ca2ae",
        "interior_sq_m": 88.442955,
        "latitude": 51.038467,
        "list_price": 269999,
        "longitude": -114.06811
      },
      {
        "address": "205 235 15 Avenue SW",
        "distance_km": 0.49067223,
        "estimate_sale_date_sold": "2024-06-29",
        "image": "80a93745ce38ee61_80fbaf17",
        "interior_sq_m": 88.16425,
        "latitude": 51.038467,
        "list_price": 269900,
        "longitude": -114.06811
      }
    ],
    "comparable_properties_total": 29040,
    "construction_year": 1979,
    "country": "Canada",
    "den": 0,
    "estimate_list_price": {
      "confidence_score": 95.00434,
      "model_metrics": {
        "coefficient_of_variation": 34.37363413774068,
        "error_10th_percentile": 4142.26904296875,
        "error_25th_percentile": 10785.3046875,
        "error_50th_percentile": 25437.125,
        "error_75th_percentile": 53379.21875,
        "error_90th_percentile": 106661.171875,
        "error_95th_percentile": 183243.8125,
        "forecast_std_dev": 219811.484375,
        "mae": 59226.43359375,
        "mape": 8.339874267578125,
        "mean_bias": -8763.900390625,
        "median_bias": 496.109375,
        "median_mape": 4.995657920837402,
        "mse": 48393924608.0,
        "over_prediction_rate": 50.6266753604289,
        "pct_error_10th": 0.8739217519760132,
        "pct_error_90th": 15.445496559143066,
        "rmse": 219986.1875,
        "testing_r_squared": 0.94,
        "training_r_squared": 0.99,
        "under_prediction_rate": 49.37332463957111,
        "within_10_pct": 77.64978627834529,
        "within_15_pct": 89.26320365138012,
        "within_20_pct": 94.435992175614,
        "within_5_pct": 50.03260160834601
      },
      "value": 271133.47
    },
    "estimate_rent_monthly": {
      "confidence_score": 93.86368,
      "model_metrics": {
        "coefficient_of_variation": 23.273093277937697,
        "error_10th_percentile": 29.049169540405273,
        "error_25th_percentile": 75.1527099609375,
        "error_50th_percentile": 168.203125,
        "error_75th_percentile": 335.72265625,
        "error_90th_percentile": 647.5496215820312,
        "error_95th_percentile": 1060.30810546875,
        "forecast_std_dev": 679.4482421875,
        "mae": 318.021240234375,
        "mape": 10.556913375854492,
        "mean_bias": -41.29466247558594,
        "median_bias": -4.029541015625,
        "median_mape": 6.1363205909729,
        "mse": 463356.25,
        "over_prediction_rate": 49.3053225048661,
        "pct_error_10th": 1.0789308547973633,
        "pct_error_90th": 20.960853576660156,
        "rmse": 680.7027587890625,
        "testing_r_squared": 0.7,
        "training_r_squared": 0.84,
        "under_prediction_rate": 50.6946774951339,
        "within_10_pct": 68.61534331163165,
        "within_15_pct": 82.13974092220954,
        "within_20_pct": 89.09322773340492,
        "within_5_pct": 42.42566615209075
      },
      "value": 2373.0881
    },
    "estimate_sale_price": {
      "confidence_score": 94.26222,
      "model_metrics": {
        "coefficient_of_variation": 45.40137217851901,
        "error_10th_percentile": 5040.875,
        "error_25th_percentile": 12724.40625,
        "error_50th_percentile": 28462.125,
        "error_75th_percentile": 58169.59375,
        "error_90th_percentile": 115548.2578125,
        "error_95th_percentile": 188690.921875,
        "forecast_std_dev": 286273.5,
        "mae": 67500.0390625,
        "mape": 10.191784858703612,
        "mean_bias": -9652.046875,
        "median_bias": -987.84375,
        "median_mape": 5.737776279449463,
        "mse": 82045485056.0,
        "over_prediction_rate": 48.96551724137931,
        "pct_error_10th": 1.0408254861831665,
        "pct_error_90th": 18.17011833190918,
        "rmse": 286435.84375,
        "testing_r_squared": 0.91,
        "training_r_squared": 0.95,
        "under_prediction_rate": 51.03448275862069,
        "within_10_pct": 73.1776047460141,
        "within_15_pct": 85.44308490915833,
        "within_20_pct": 91.67222840192808,
        "within_5_pct": 45.761957730812014
      },
      "value": 294333.06
    },
    "image": "bd9c6fb24c31c772_7e931788",
    "interior_sq_m": 92.438484,
    "latitude": 51.038193,
    "longitude": -114.0751,
    "price_history": [
      {
        "date": "2025-05-21",
        "estimate_list_price": 313377.78,
        "estimate_rent_monthly": 2289.2402,
        "estimate_sale_price": 320429.56
      },
      {
        "date": "2025-06-20",
        "estimate_list_price": 313439.94,
        "estimate_rent_monthly": 2308.8833,
        "estimate_sale_price": 315973.0
      },
      {
        "date": "2025-07-20",
        "estimate_list_price": 314960.94,
        "estimate_rent_monthly": 2308.8833,
        "estimate_sale_price": 316800.66
      },
      {
        "date": "2025-08-19",
        "estimate_list_price": 312448.5,
        "estimate_rent_monthly": 2358.0667,
        "estimate_sale_price": 315292.72
      },
      {
        "date": "2025-09-18",
        "estimate_list_price": 311678.0,
        "estimate_rent_monthly": 2350.9622,
        "estimate_sale_price": 309836.12
      },
      {
        "date": "2025-10-18",
        "estimate_list_price": 307468.38,
        "estimate_rent_monthly": 2351.636,
        "estimate_sale_price": 308248.16
      },
      {
        "date": "2025-11-17",
        "estimate_list_price": 307162.97,
        "estimate_rent_monthly": 2376.993,
        "estimate_sale_price": 301529.72
      },
      {
        "date": "2025-12-17",
        "estimate_list_price": 303381.53,
        "estimate_rent_monthly": 2335.967,
        "estimate_sale_price": 294457.44
      },
      {
        "date": "2026-01-16",
        "estimate_list_price": 298996.94,
        "estimate_rent_monthly": 2320.4446,
        "estimate_sale_price": 294480.2
      },
      {
        "date": "2026-02-15",
        "estimate_list_price": 288514.38,
        "estimate_rent_monthly": 2320.4446,
        "estimate_sale_price": 294480.2
      },
      {
        "date": "2026-03-17",
        "estimate_list_price": 291996.88,
        "estimate_rent_monthly": 2303.094,
        "estimate_sale_price": 294480.2
      },
      {
        "date": "2026-04-16",
        "estimate_list_price": 290117.44,
        "estimate_rent_monthly": 2308.4219,
        "estimate_sale_price": 293803.03
      },
      {
        "date": "2026-05-16",
        "estimate_list_price": 288908.4,
        "estimate_rent_monthly": 2308.5254,
        "estimate_sale_price": 293588.22
      },
      {
        "date": "2026-06-15",
        "estimate_list_price": 285737.0,
        "estimate_rent_monthly": 2324.2617,
        "estimate_sale_price": 293907.0
      },
      {
        "date": "2026-07-15",
        "estimate_list_price": 281405.28,
        "estimate_rent_monthly": 2332.7334,
        "estimate_sale_price": 293034.9
      },
      {
        "date": "2026-08-14",
        "estimate_list_price": 276388.28,
        "estimate_rent_monthly": 2373.0881,
        "estimate_sale_price": 294551.25
      },
      {
        "date": "2026-09-13",
        "estimate_list_price": 277337.25,
        "estimate_rent_monthly": 2343.6184,
        "estimate_sale_price": 296753.6
      },
      {
        "date": "2026-10-13",
        "estimate_list_price": 276858.66,
        "estimate_rent_monthly": 2373.0881,
        "estimate_sale_price": 296753.6
      },
      {
        "date": "2026-11-12",
        "estimate_list_price": 271133.47,
        "estimate_rent_monthly": 2373.0881,
        "estimate_sale_price": 294333.06
      }
    ],
    "property_id": "bd9c6fb24c31c772",
    "property_type": "Apartment",
    "property_warning_flags": [
      {
        "description": "Monthly fees run about 4% of the estimated value each year, above the typical range. High fees can weigh on resale.",
        "warning": "High monthly fees"
      },
      {
        "description": "This property appears to have been converted between residential and commercial use. Conversions can carry permit, zoning, and insurance complications worth confirming.",
        "warning": "Use conversion"
      }
    ],
    "province": "Alberta",
    "score_air_quality": 6,
    "score_bicycle": 10,
    "score_cell_coverage": 10,
    "score_curb_appeal": 4,
    "score_earthquake": 9,
    "score_education": 9,
    "score_entertainment": 10,
    "score_family": 0,
    "score_fire": 10,
    "score_flood": 9,
    "score_food_and_drink": 10,
    "score_hurricane": 10,
    "score_internet": 10,
    "score_nature": 6,
    "score_parking": 10,
    "score_quiet": 2,
    "score_retirement": 0,
    "score_safety": 6,
    "score_shopping": 9,
    "score_smell": 6,
    "score_tornado": 8,
    "score_total": 7,
    "score_total_percent": 0.72800004,
    "score_traffic": 0,
    "score_transit": 10,
    "score_walkability": 10,
    "score_water_quality": 8,
    "valuation_date": "2026-11-12"
  },
  "error": "",
  "price_quote": false,
  "time_ms": 281,
  "url": "https://www.houski.ca/avm-report/bd9c6fb24c31c772_a49b86c7"
}

The AVM endpoint returns estimates, confidence scores, and model metrics (R-squared, median percentage error, hit rates within accuracy bands) so you can build transparent valuation products.

See our Search API docs and AVM API docs.

Investment analysis platforms

Help investors identify opportunities and analyze deals. The block below is a live /properties call returning the fields an investment screener needs to compute cap rate, cash-on-cash, and price per square metre:

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('bedroom_gte', '3');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('property_type_eq', 'House');
    url.searchParams.set('province_abbreviation', 'ab');
    url.searchParams.set('results_per_page', '10');
    url.searchParams.set('select', 'address,property_type,bedroom,bathroom_full,interior_sq_m,construction_year,estimate_sale_price,estimate_rent_monthly,assessment_value,property_taxes,latitude,longitude');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 8.5,
  "data": [
    {
      "address": "54 Rowmont Link NW",
      "assessment_value": 853500,
      "bathroom_full": 2,
      "bedroom": 3,
      "construction_year": 2023,
      "estimate_rent_monthly": 2852,
      "estimate_sale_price": 850575,
      "interior_sq_m": 169.45374,
      "latitude": 51.106037,
      "longitude": -114.275,
      "property_id": "1055f97323e53f25",
      "property_taxes": 5676,
      "property_type": "House"
    },
    {
      "address": "40 Rowmont Common NW",
      "assessment_value": 660000,
      "bathroom_full": 3,
      "bedroom": 3,
      "construction_year": 2024,
      "estimate_rent_monthly": 2956,
      "estimate_sale_price": 698422,
      "interior_sq_m": 173.07692,
      "latitude": 51.106346,
      "longitude": -114.2781,
      "property_id": "11d2132629e36a28",
      "property_taxes": 4389,
      "property_type": "House"
    },
    {
      "address": "16 Rowmont Common NW",
      "assessment_value": 758500,
      "bathroom_full": 3,
      "bedroom": 3,
      "construction_year": 2024,
      "estimate_rent_monthly": 3034,
      "estimate_sale_price": 805834,
      "interior_sq_m": 173.07692,
      "latitude": 51.10631,
      "longitude": -114.27743,
      "property_id": "11f8d3671079fb5e",
      "property_taxes": 5044,
      "property_type": "House"
    },
    {
      "address": "435 Crimson Ridge Place NW",
      "assessment_value": 840000,
      "bathroom_full": 2,
      "bedroom": 3,
      "construction_year": 2023,
      "estimate_rent_monthly": 2930,
      "estimate_sale_price": 856192,
      "interior_sq_m": 185.43292,
      "latitude": 51.10885,
      "longitude": -114.26332,
      "property_id": "1209fe3057284c96",
      "property_taxes": 5586,
      "property_type": "House"
    },
    {
      "address": "288 Crimson Ridge Place NW",
      "assessment_value": 988000,
      "bathroom_full": 2,
      "bedroom": 3,
      "construction_year": 2024,
      "estimate_rent_monthly": 3184,
      "estimate_sale_price": 962443,
      "interior_sq_m": 185.43292,
      "latitude": 51.109528,
      "longitude": -114.26061,
      "property_id": "1277c8e032dd2f50",
      "property_taxes": 6570,
      "property_type": "House"
    },
    {
      "address": "48 Rowley Terrace NW",
      "assessment_value": 871000,
      "bathroom_full": 2,
      "bedroom": 3,
      "construction_year": 2021,
      "estimate_rent_monthly": 3120,
      "estimate_sale_price": 885747,
      "interior_sq_m": 203.64261,
      "latitude": 51.10516,
      "longitude": -114.2675,
      "property_id": "12c72dfadc700db1",
      "property_taxes": 5792,
      "property_type": "House"
    },
    {
      "address": "24 Rowley Common NW",
      "assessment_value": 844000,
      "bathroom_full": 2,
      "bedroom": 3,
      "construction_year": 2021,
      "estimate_rent_monthly": 2936,
      "estimate_sale_price": 849602,
      "interior_sq_m": 161.60349,
      "latitude": 51.105263,
      "longitude": -114.27002,
      "property_id": "12e3ffac04ec3562",
      "property_taxes": 5613,
      "property_type": "House"
    },
    {
      "address": "370 Rowley Way NW",
      "assessment_value": 1320000,
      "bathroom_full": 2,
      "bedroom": 3,
      "construction_year": 2022,
      "estimate_rent_monthly": 4682,
      "estimate_sale_price": 1611606,
      "interior_sq_m": 285.02414,
      "latitude": 51.104504,
      "longitude": -114.268036,
      "property_id": "132a75dd38341a25",
      "property_taxes": 7783,
      "property_type": "House"
    },
    {
      "address": "21 Royston Grove NW",
      "assessment_value": 972000,
      "bathroom_full": 2,
      "bedroom": 3,
      "construction_year": 2025,
      "estimate_rent_monthly": 3141,
      "estimate_sale_price": 967340,
      "interior_sq_m": 212.69974,
      "latitude": 51.107815,
      "longitude": -114.27981,
      "property_id": "13ee743ebe1c6938",
      "property_taxes": 6464,
      "property_type": "House"
    },
    {
      "address": "91 Royston Park NW",
      "assessment_value": 902000,
      "bathroom_full": 2,
      "bedroom": 3,
      "construction_year": 2025,
      "estimate_rent_monthly": 2981,
      "estimate_sale_price": 889796,
      "interior_sq_m": 170.28986,
      "latitude": 51.10854,
      "longitude": -114.279335,
      "property_id": "145b4b70a1b793f6",
      "property_taxes": 5998,
      "property_type": "House"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 31006
  },
  "price_quote": false,
  "result_total": 310056,
  "time_ms": 36,
  "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"
  }
}

For the full list of filterable fields, see Properties API docs and Filtering guide.

Neighborhood intelligence

Power location-based features with aggregate market data. The block below is a live /aggregate call returning the median estimated sale price for Calgary, and adding a community parameter narrows it to one neighbourhood:

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

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

    const url = new URL('https://api.houski.ca/aggregate');
    url.searchParams.set('aggregation', 'median');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'calgary');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('field', 'estimate_sale_price');
    url.searchParams.set('province_abbreviation', 'ab');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 1.0,
  "data": [
    {
      "aggregation": "median",
      "field": "estimate_sale_price",
      "value": "628238"
    }
  ],
  "error": "",
  "price_quote": false,
  "time_ms": 15
}

See Aggregate API docs.

Property search and filtering

Build powerful search experiences with flexible filtering. The block below is a live /properties call combining city, property type, size, and price filters with sorting:

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('bathroom_full_gte', '2');
    url.searchParams.set('bedroom_gte', '2');
    url.searchParams.set('city', 'toronto');
    url.searchParams.set('construction_year_gte', '2010');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('estimate_sale_price_lte', '800000');
    url.searchParams.set('estimate_sale_price_sort', 'asc');
    url.searchParams.set('interior_sq_m_gte', '80');
    url.searchParams.set('property_type_eq', 'Apartment');
    url.searchParams.set('province_abbreviation', 'on');
    url.searchParams.set('results_per_page', '10');
    url.searchParams.set('select', 'address,bedroom,bathroom_full,interior_sq_m,estimate_sale_price,latitude,longitude');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 4.3999996,
  "data": [
    {
      "address": "1611 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "10bbc94c6c6eb453"
    },
    {
      "address": "1504 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "10e922a085921fa1"
    },
    {
      "address": "3314 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "13a3bdd4a72101b9"
    },
    {
      "address": "1607 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "14662250fe35be68"
    },
    {
      "address": "105 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "14d6378ab5f73117"
    },
    {
      "address": "409 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "14e8faf6d305cf9b"
    },
    {
      "address": "1203 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "15cabce7f33a499d"
    },
    {
      "address": "1205 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "16578d403afc432f"
    },
    {
      "address": "608 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "19c303c6a4e83fc9"
    },
    {
      "address": "2710 40 Gerrard Street E",
      "bathroom_full": 2,
      "bedroom": 3,
      "estimate_sale_price": 229189,
      "interior_sq_m": 102.193344,
      "latitude": 43.659782,
      "longitude": -79.38068,
      "property_id": "1ac3d8605a3ee244"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 840
  },
  "price_quote": false,
  "result_total": 8391,
  "time_ms": 34,
  "ui_info": {
    "city": "Toronto",
    "city_id": "6cdbdee2492718ed",
    "city_link": "ca/on/toronto",
    "city_slug": "toronto",
    "country": "Canada",
    "country_abbreviation": "CA",
    "country_abbreviation_id": "9ace2b6431b7f1be",
    "country_abbreviation_link": "ca",
    "country_slug": "canada",
    "province": "Ontario",
    "province_abbreviation": "ON",
    "province_abbreviation_id": "146699ee774499d3",
    "province_abbreviation_link": "ca/on",
    "province_slug": "ontario"
  }
}

AI and LLM integration

Build AI-powered property assistants with our Model Context Protocol (MCP) server:

JSON
// Claude Desktop MCP configuration
{
  "mcpServers": {
    "houski-property-data": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://www.houski.ca/mcp"
      ]
    }
  }
}

The key is not part of the connection. Every Houski tool takes an api_key argument of its own, so the assistant passes your key with each call. AI assistants can then answer natural language questions:

  • "What's the average price of 3-bedroom houses in Kitsilano?"
  • "Find me condos under $500k near downtown Calgary with good transit scores"
  • "Compare investment potential between Edmonton and Calgary duplexes"

Technical architecture for proptech

Recommended stack

┌─────────────────────────────────────────────────┐
│              Your Application UI                 │
├─────────────────────────────────────────────────┤
│           Application Backend (API)              │
├──────────────┬──────────────┬───────────────────┤
│   Caching    │  Rate Limit  │  Error Handling   │
│   (Redis)    │   Manager    │    & Retry        │
├──────────────┴──────────────┴───────────────────┤
│              Houski API Client                   │
├─────────────────────────────────────────────────┤
│              Houski Property API                 │
│  /properties  /avm  /search  /location  /map    │
└─────────────────────────────────────────────────┘

Best practices

Cache aggressively: Property data is stable. Cache for 24+ hours to reduce API calls and improve response times.

TypeScript code
const getCachedProperty = async (propertyId) => {
  const cacheKey = `property:${propertyId}`;
  const cached = await redis.get(cacheKey);

  if (cached) {
    return JSON.parse(cached);
  }

  const data = await fetchFromHouski(propertyId);
  await redis.setex(cacheKey, 86400, JSON.stringify(data)); // 24 hour TTL

  return data;
};

Select only needed fields: The API charges per field. Request only what you need.

TypeScript code
// Good: Select specific fields
url.searchParams.set('select', 'address,bedroom,estimate_sale_price');

// Avoid: Requesting all fields when you only need a few

Handle pagination properly: Use the pagination.has_next_page flag in the response to decide whether to fetch the next page. We would loop through pages something like this, bumping the page parameter each iteration until has_next_page is false:

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

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

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('city', 'toronto');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('page', '1');
    url.searchParams.set('province_abbreviation', 'on');
    url.searchParams.set('results_per_page', '20');

    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": 0.39999998,
  "data": [
    {
      "address": "202 783 Bathurst Street",
      "property_id": "100b6a71ce98fa1e"
    },
    {
      "address": "14 Washington Avenue",
      "property_id": "101310cbec8c8e92"
    },
    {
      "address": "321 341 Bloor Street W",
      "property_id": "103d1adb9d27bdf5"
    },
    {
      "address": "70 Major Street",
      "property_id": "104119ae8611dd2a"
    },
    {
      "address": "320 341 Bloor Street W",
      "property_id": "104cf3cd73f8adc5"
    },
    {
      "address": "200 555 Bloor Street W",
      "property_id": "104e16e5cf2e61ac"
    },
    {
      "address": "209 409 Huron Street",
      "property_id": "1051c22f305ba103"
    },
    {
      "address": "B2 409 Huron Street",
      "property_id": "1074f0246313ebda"
    },
    {
      "address": "1111 720 Spadina Avenue",
      "property_id": "1076f6d3d45d26e7"
    },
    {
      "address": "416C 60 Harbord Street",
      "property_id": "107bb7cc5cc9544c"
    },
    {
      "address": "259 Brunswick Avenue",
      "property_id": "10a52db2ac248fba"
    },
    {
      "address": "2 12 Ulster Street",
      "property_id": "10b9560a673bd944"
    },
    {
      "address": "12 Robert Street",
      "property_id": "10c69b8c28a39573"
    },
    {
      "address": "916 341 Bloor Street W",
      "property_id": "10e3e25b9a512f9e"
    },
    {
      "address": "1 44 Sussex Avenue",
      "property_id": "110f59c95e08047b"
    },
    {
      "address": "1307 341 Bloor Street W",
      "property_id": "1117fdf4b7385885"
    },
    {
      "address": "513 341 Bloor Street W",
      "property_id": "111a1c7c1deecb5c"
    },
    {
      "address": "1808 666 Spadina Avenue",
      "property_id": "111f48f872a03f03"
    },
    {
      "address": "1 61 Borden Street",
      "property_id": "11243857f7311c0"
    },
    {
      "address": "1015 666 Spadina Avenue",
      "property_id": "1124c4603525df9b"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 68131
  },
  "price_quote": false,
  "result_total": 1362608,
  "time_ms": 22,
  "ui_info": {
    "city": "Toronto",
    "city_id": "6cdbdee2492718ed",
    "city_link": "ca/on/toronto",
    "city_slug": "toronto",
    "country": "Canada",
    "country_abbreviation": "CA",
    "country_abbreviation_id": "9ace2b6431b7f1be",
    "country_abbreviation_link": "ca",
    "country_slug": "canada",
    "province": "Ontario",
    "province_abbreviation": "ON",
    "province_abbreviation_id": "146699ee774499d3",
    "province_abbreviation_link": "ca/on",
    "province_slug": "ontario"
  }
}

Pricing for startups and scale-ups

Pay-as-you-go

  • Property data: Most fields cost a tenth of a cent per field per property
  • AVM valuations: $5.00 per request
  • Search/geocoding: Billed per field per row, the same way as property data
  • $99/month minimum, billed monthly, no long-term commitment

Annual contracts

Need an annual contract instead of monthly usage billing? Houski offers unlimited use for a flat annual fee, within fair use. Contact sales for that, or for custom data packages.

Cost optimization tips

  1. Cache responses: most property data is stable. Cache 24+ hours
  2. Select minimal fields: only request what you use
  3. Batch requests: use pagination instead of many small requests
  4. Use price quotes: test queries with price_quote=true to see costs first
  5. Set a maximum monthly spend on your dashboard, so a runaway loop cannot surprise you

Getting started: Your first week

Day 1: Explore the API

  1. Sign up for your API key
  2. Read the quick start guide
  3. Make your first API call

Days 2-3: Build a prototype

Pick one feature (home valuation, search, neighborhood scores) and build a prototype using the examples above.

Days 4-5: Refine and test

  • Add error handling and edge cases
  • Implement caching
  • Test with various property types and locations

Day 6-7: Plan your product

Map out additional features. Review the full fields documentation to discover data points you might not have considered.

Why build on Houski

Comprehensive coverage

More than 220 million properties across 16 countries with 400+ data fields each, every money value in its own country's currency. No cobbling together multiple sources.

Transparent pricing

Know what you'll pay before making a request. No hidden fees.

Developer experience

Modern easy API with JSON responses, comprehensive documentation, code examples in TypeScript, JavaScript, Rust, Go, Python, Java, C# and curl, and responsive support.

No MLS restrictions

No board membership requirements. Display the data inside your own product, including products you sell to other businesses, under clear terms of service.

AI-ready

MCP server integration so your app can leverage AI assistants with full property data access.

Resources for builders


The best time to start building was yesterday. The second best is now.

Get your API key and start building.