Most Automated Valuation Models (AVMs) rely on incomplete datasets, simplistic algorithms, and black-box approaches that produce valuations professionals can't trust or explain to clients.
Comprehensive property datasets, accessible machine learning, and demand for transparency now give developers the tools to build AVMs that work. This guide shows you how. If you prefer a ready-made solution, Houski's AVM endpoint provides documented valuations with full accuracy transparency and Canadian market coverage.
Why most AVMs are inaccurate
Data Quality Issues
- Incomplete coverage: Limited to Multiple Listing Service (MLS) listings or tax assessments, missing most of the market
- Inconsistent measurements: Square footage calculated differently across jurisdictions
- Missing renovations: Recent improvements that significantly impact value go unrecorded
- Outdated information: Assessment data that's 2-5 years behind current property conditions
- Location imprecision: Postal code-level data missing micro-location value drivers
Oversimplified modeling approaches
- Simplistic regression models: Linear models trying to capture non-linear relationships
- Insufficient location granularity: Treating entire neighborhoods as homogeneous
- Inadequate feature engineering: Missing interaction effects between variables
- One-size-fits-all modeling: Using the same approach for mansions and studio apartments
- Ignorance of market segments: Luxury properties valued like standard homes
- Temporal blindness: Failing to account for seasonal and cyclical patterns
Opacity without accountability
- Hidden limitations: Pretending the model works everywhere
- Missing context: Valuation without market trends or comparable listings
- No feedback mechanisms: No way to correct obvious errors
Building a better AVM: The foundation
1. Comprehensive Data Foundation
Accuracy starts with comprehensive property data. The Canadian market now has detailed information on 19+ million properties through APIs like Houski. The block below is a live call against the real API, so the request code and the JSON response always reflect the current schema and current data:
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('select', 'interior_sq_m,bedroom,den,bathroom_full,bathroom_half,construction_year,land_area_sq_m,property_type,heating_type_first,foundation_type,roof_material,assessment_value,assessment_year,latitude,longitude');
const response = await fetch(url);
const data = await response.json();
return data;
}
(async () => {
let data: PropertiesResponse = await houski_data();
// Log the response
console.log(data);
})();
{
"cache_hit": false,
"cost_cents": 7.500000953674316,
"data": [
{
"address": "31 Hawkside Park NW",
"assessment_value": 648500,
"assessment_year": 2026,
"bathroom_full": 3,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 1988,
"den": 1,
"foundation_type": "Wood",
"heating_type_first": "Gas furnace",
"interior_sq_m": 126.34708404541016,
"land_area_sq_m": 13583.0,
"latitude": 51.12946319580078,
"longitude": -114.17919921875,
"property_id": "10000f97f5cb7b9f",
"property_type": "Duplex",
"roof_material": "Asphalt"
},
{
"address": "6 1744 7 Street SW",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2006,
"den": 0,
"foundation_type": "Wood",
"heating_type_first": "Gas furnace",
"interior_sq_m": 125.882568359375,
"land_area_sq_m": 512.0,
"latitude": 51.03611755371094,
"longitude": -114.0792007446289,
"property_id": "10004f7afe0c1946",
"property_type": "House",
"roof_material": "Asphalt"
},
{
"address": "384 Copperpond Landng SE",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2006,
"den": 0,
"foundation_type": "Wood",
"heating_type_first": "Gas furnace",
"interior_sq_m": 125.882568359375,
"land_area_sq_m": 512.0,
"latitude": 50.925743103027344,
"longitude": -113.92975616455078,
"property_id": "10007f9761f49940",
"property_type": "House",
"roof_material": "Asphalt"
},
{
"address": "239 Dalhurst Way NW",
"assessment_value": 1110000,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 0,
"bedroom": 3,
"construction_year": 1971,
"den": 1,
"foundation_type": "Wood",
"heating_type_first": "Gas furnace",
"interior_sq_m": 108.46339416503906,
"land_area_sq_m": 724.0999755859375,
"latitude": 51.110740661621094,
"longitude": -114.1513900756836,
"property_id": "100086f6bc064d3f",
"property_type": "House",
"roof_material": "Asphalt"
},
{
"address": "52 Cedargrove Way SW",
"assessment_value": 662000,
"assessment_year": 2026,
"bathroom_full": 1,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 1984,
"den": 0,
"foundation_type": "Wood",
"heating_type_first": "Gas furnace",
"interior_sq_m": 136.4734344482422,
"land_area_sq_m": 430.2999877929687,
"latitude": 50.95145034790039,
"longitude": -114.12571716308594,
"property_id": "1000c277cd905d3b",
"property_type": "House",
"roof_material": "Asphalt"
},
{
"address": "28 Sundown Gr SE",
"assessment_value": 692500,
"assessment_year": 2026,
"bathroom_full": 3,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 1988,
"den": 1,
"foundation_type": "Wood",
"heating_type_first": "Gas furnace",
"interior_sq_m": 172.61241149902344,
"land_area_sq_m": 436.0,
"latitude": 50.899044036865234,
"longitude": -114.04895782470705,
"property_id": "1001109ab2aebbc0",
"property_type": "House",
"roof_material": "Asphalt"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 113490
},
"price_quote": false,
"result_total": 680936,
"time_ms": 105,
"ui_info": {
"city": "Calgary",
"city_id": "6ec95b53075d062c",
"city_link": "ca/ab/calgary",
"city_slug": "calgary",
"country": "Canada",
"country_abbreviation": "CA",
"country_abbreviation_id": "9ace2b6431b7f1be",
"country_abbreviation_link": "ca",
"country_slug": "canada",
"province": "Alberta",
"province_abbreviation": "AB",
"province_abbreviation_id": "aae1f05a0f89d2c7",
"province_abbreviation_link": "ca/ab",
"province_slug": "alberta"
}
}
Essential data requirements:
- Complete coverage: All properties, not just active listings
- Rich attributes: 50+ standardized characteristics per property
- Geographic precision: Exact coordinates for micro-location analysis
- Construction details: Materials, age, and condition indicators
- Market context: Recent listings, days on market, price adjustments
2. Sophisticated modeling approach
Modern AVMs need approaches that handle real estate's complexities:
- Ensemble methods: Combining multiple model types for better performance
- Geospatial modeling: Explicit handling of location effects
- Market segmentation: Separate models for different property types and price points
- Non-linear relationships: Capturing diminishing returns and threshold effects
- Temporal dynamics: Accounting for seasonality and market cycles
- Transfer learning: Leveraging patterns from data-rich areas to improve sparse regions
3. Transparent limitations
Honesty about what your model can't do builds credibility:
- Confidence intervals: Communicating uncertainty appropriate to each prediction
- Limitation disclosures: Being clear about where the model works best
- Explainability: Providing insight into which factors drive the valuation
- Comparable evidence: Showing similar properties that support the estimate
- Feedback mechanisms: Allowing users to flag problematic valuations
- Continuous validation: Regular backtesting against held-out data
Implementation: A developer's roadmap
If you'd rather skip the implementation, our predict endpoint returns the same shape of data through one API call.
Stage 1: Data acquisition and preparation
Build a property database using Houski's API. The block below is a live call against the real API showing the rich attribute set commonly pulled for training:
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('expand', 'listings');
url.searchParams.set('province_abbreviation', 'ab');
url.searchParams.set('select', 'latitude,longitude,property_type,construction_year,floor_above_ground,basement_type,basement_finish,roof_material_install_year,cooling_type_first,area_residential_list_price_per_sq_m,area_residential_rent_price_per_sq_m,area_commercial_list_price_per_sq_m,area_comparable_list_price_per_sq_m,area_comparable_property_tax_per_sq_m,area_comparable_assessment_value_per_sq_m,interior_sq_m,land_area_sq_m,land_frontage_m,land_depth_m,bedroom,den,bathroom_full,bathroom_half,heating_type_first,roof_material,foundation_type,fireplace,maintenance_fee,assessment_value,assessment_year,garage_parking_space_first,garage_type_first,demographic_income_median_pre_tax,demographic_household_size_1_person_percent,demographic_education_level_bachelors_degree_percent,demographic_dwellings_occupied_percent,demographic_transportation_car_truck_or_van_percent,demographic_municipal_population,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);
})();
{
"cache_hit": false,
"cost_cents": 21.94999122619629,
"data": [
{
"address": "31 Hawkside Park NW",
"area_commercial_list_price_per_sq_m": 5266,
"area_comparable_assessment_value_per_sq_m": 4235,
"area_comparable_list_price_per_sq_m": 4136,
"area_comparable_property_tax_per_sq_m": 24,
"area_residential_list_price_per_sq_m": 3702,
"area_residential_rent_price_per_sq_m": 16,
"assessment_value": 648500,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 3,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 1988,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 60.79999923706055,
"demographic_dwellings_occupied_percent": 0.9751861095428468,
"demographic_education_level_bachelors_degree_percent": 0.2956521809101105,
"demographic_household_size_1_person_percent": 0.3846153914928436,
"demographic_income_median_pre_tax": 58368,
"demographic_municipal_population": 845,
"demographic_transportation_car_truck_or_van_percent": 1.0,
"den": 1,
"fireplace": 1,
"floor_above_ground": 1,
"foundation_type": "Wood",
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 126.34708404541016,
"land_area_sq_m": 13583.0,
"land_depth_m": 187.2008056640625,
"land_frontage_m": 72.5584487915039,
"latitude": 51.12946319580078,
"longitude": -114.17919921875,
"maintenance_fee": 617,
"property_id": "10000f97f5cb7b9f",
"property_type": "Duplex",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
},
{
"address": "6 1744 7 Street SW",
"area_commercial_list_price_per_sq_m": 5288,
"area_comparable_assessment_value_per_sq_m": 2898,
"area_comparable_list_price_per_sq_m": 7428,
"area_comparable_property_tax_per_sq_m": 35,
"area_residential_list_price_per_sq_m": 4492,
"area_residential_rent_price_per_sq_m": 22,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2006,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 34.79999923706055,
"demographic_dwellings_occupied_percent": 0.8860103487968445,
"demographic_education_level_bachelors_degree_percent": 0.4469696879386902,
"demographic_household_size_1_person_percent": 0.5882353186607361,
"demographic_income_median_pre_tax": 64000,
"demographic_municipal_population": 825,
"demographic_transportation_car_truck_or_van_percent": 0.65625,
"den": 0,
"fireplace": 0,
"floor_above_ground": 2,
"foundation_type": "Wood",
"garage_parking_space_first": 0,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 125.882568359375,
"land_area_sq_m": 512.0,
"land_depth_m": 36.34501266479492,
"land_frontage_m": 14.087214469909668,
"latitude": 51.03611755371094,
"longitude": -114.0792007446289,
"maintenance_fee": 386,
"property_id": "10004f7afe0c1946",
"property_type": "House",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
},
{
"address": "384 Copperpond Landng SE",
"area_commercial_list_price_per_sq_m": 4943,
"area_comparable_assessment_value_per_sq_m": 2898,
"area_comparable_list_price_per_sq_m": 3296,
"area_comparable_property_tax_per_sq_m": 20,
"area_residential_list_price_per_sq_m": 3199,
"area_residential_rent_price_per_sq_m": 18,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2006,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 33.599998474121094,
"demographic_dwellings_occupied_percent": 0.9604031443595886,
"demographic_education_level_bachelors_degree_percent": 0.28032344579696655,
"demographic_household_size_1_person_percent": 0.2631579041481018,
"demographic_income_median_pre_tax": 68608,
"demographic_municipal_population": 3440,
"demographic_transportation_car_truck_or_van_percent": 0.934482753276825,
"den": 0,
"fireplace": 0,
"floor_above_ground": 2,
"foundation_type": "Wood",
"garage_parking_space_first": 0,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 125.882568359375,
"land_area_sq_m": 512.0,
"land_depth_m": 36.34501266479492,
"land_frontage_m": 14.087214469909668,
"latitude": 50.925743103027344,
"longitude": -113.92975616455078,
"maintenance_fee": 386,
"property_id": "10007f9761f49940",
"property_type": "House",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
},
{
"address": "239 Dalhurst Way NW",
"area_commercial_list_price_per_sq_m": 5266,
"area_comparable_assessment_value_per_sq_m": 3177,
"area_comparable_list_price_per_sq_m": 6224,
"area_comparable_property_tax_per_sq_m": 34,
"area_residential_list_price_per_sq_m": 6182,
"area_residential_rent_price_per_sq_m": 20,
"assessment_value": 1110000,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 2,
"bathroom_half": 0,
"bedroom": 3,
"construction_year": 1971,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 37.20000076293945,
"demographic_dwellings_occupied_percent": 0.9367088675498962,
"demographic_education_level_bachelors_degree_percent": 0.43396225571632385,
"demographic_household_size_1_person_percent": 0.13793103396892548,
"demographic_income_median_pre_tax": 56320,
"demographic_transportation_car_truck_or_van_percent": 1.0,
"den": 1,
"fireplace": 1,
"floor_above_ground": 1,
"foundation_type": "Wood",
"garage_parking_space_first": 0,
"garage_type_first": "None",
"heating_type_first": "Gas furnace",
"interior_sq_m": 108.46339416503906,
"land_area_sq_m": 724.0999755859375,
"land_depth_m": 43.2224235534668,
"land_frontage_m": 16.752878189086914,
"latitude": 51.110740661621094,
"longitude": -114.1513900756836,
"maintenance_fee": 568,
"property_id": "100086f6bc064d3f",
"property_type": "House",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
},
{
"address": "52 Cedargrove Way SW",
"area_commercial_list_price_per_sq_m": 5288,
"area_comparable_assessment_value_per_sq_m": 3266,
"area_comparable_list_price_per_sq_m": 4674,
"area_comparable_property_tax_per_sq_m": 26,
"area_residential_list_price_per_sq_m": 4789,
"area_residential_rent_price_per_sq_m": 16,
"assessment_value": 662000,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 1,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 1984,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 39.599998474121094,
"demographic_dwellings_occupied_percent": 0.9748201370239258,
"demographic_education_level_bachelors_degree_percent": 0.2098214328289032,
"demographic_household_size_1_person_percent": 0.33128833770751953,
"demographic_income_median_pre_tax": 54784,
"demographic_municipal_population": 1810,
"demographic_transportation_car_truck_or_van_percent": 0.8846153616905212,
"den": 0,
"fireplace": 1,
"floor_above_ground": 2,
"foundation_type": "Wood",
"garage_parking_space_first": 0,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 136.4734344482422,
"land_area_sq_m": 430.2999877929687,
"land_depth_m": 33.319271087646484,
"land_frontage_m": 12.914446830749512,
"latitude": 50.95145034790039,
"listings": [
{
"expand_estimate_list_price": 574900,
"expand_listing_date": "2022-07-26",
"expand_listing_event": "Listed",
"property_id": "1000c277cd905d3b"
},
{
"expand_estimate_list_price": 555000,
"expand_listing_date": "2022-08-04",
"expand_listing_event": "Price decrease",
"property_id": "1000c277cd905d3b"
},
{
"expand_estimate_list_price": 539000,
"expand_listing_date": "2022-08-30",
"expand_listing_event": "Price decrease",
"property_id": "1000c277cd905d3b"
},
{
"expand_estimate_list_price": 525000,
"expand_listing_date": "2022-09-08",
"expand_listing_event": "Unlisted",
"property_id": "1000c277cd905d3b"
},
{
"expand_estimate_list_price": 539000,
"expand_listing_date": "2022-09-15",
"expand_listing_event": "Unlisted",
"property_id": "1000c277cd905d3b"
}
],
"longitude": -114.12571716308594,
"maintenance_fee": 370,
"property_id": "1000c277cd905d3b",
"property_type": "House",
"roof_material": "Asphalt",
"roof_material_install_year": 2019
},
{
"address": "28 Sundown Gr SE",
"area_commercial_list_price_per_sq_m": 4943,
"area_comparable_assessment_value_per_sq_m": 4046,
"area_comparable_list_price_per_sq_m": 5096,
"area_comparable_property_tax_per_sq_m": 28,
"area_residential_list_price_per_sq_m": 4838,
"area_residential_rent_price_per_sq_m": 18,
"assessment_value": 692500,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 3,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 1988,
"cooling_type_first": "Central",
"demographic_age_median_of_the_population": 42.0,
"demographic_dwellings_occupied_percent": 1.0,
"demographic_education_level_bachelors_degree_percent": 0.2535211145877838,
"demographic_household_size_1_person_percent": 0.10810811072587968,
"demographic_income_median_pre_tax": 61440,
"demographic_municipal_population": 545,
"demographic_transportation_car_truck_or_van_percent": 0.945945918560028,
"den": 1,
"fireplace": 1,
"floor_above_ground": 2,
"foundation_type": "Wood",
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 172.61241149902344,
"land_area_sq_m": 436.0,
"land_depth_m": 33.53923034667969,
"land_frontage_m": 12.999701499938965,
"latitude": 50.899044036865234,
"longitude": -114.04895782470705,
"maintenance_fee": 386,
"property_id": "1001109ab2aebbc0",
"property_type": "House",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 113490
},
"price_quote": false,
"result_total": 680936,
"time_ms": 234,
"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"
}
}
Training data should include:
- Core property attributes (from Houski's API): physical characteristics, location coordinates, building info, lot details
- Listing history (Houski listings): list prices, days on market, price changes, listing types
- Location context (Houski neighborhood data): schools, crime, walkability, transit, demographics
Stage 2: Feature engineering
Transform raw data into modeling-ready features:
- Relative measurements: Houski area fields, size percentile within segment, age vs. surroundings, rooms vs. neighborhood average
- Location features: distance to amenities, neighborhood price trends, school quality, crime relative to city, walkability, transit, and bicycle scores
- Time-based features: days since recent comparable listing, market velocity, seasonal adjustment, neighborhood price trend, inventory over time
- Interaction terms: size × neighborhood, age × renovation, bedrooms × property type, location × school district, condition × price point
Stage 3: Model development
- Market segmentation: separate models by property type, price tier, region, and unusual cases
- Model selection and ensemble: gradient boosting for main valuation, neural networks for interactions, geospatial models for location, linear baselines, random forests for importance
- Hyperparameter optimization: temporal cross-validation, Bayesian tuning, mean absolute error (MAE) and median absolute percentage error (MAPE) rather than only root mean squared error (RMSE), validation across market conditions
- Confidence modeling: predictive intervals, uncertainty quantification, property-specific scoring, market-condition impact
See our performance metrics on the AVM information page.
Stage 4: Deployment and transparency
- API design: clear input/output docs, standardized error handling, rate limiting, model versioning
- Explainability: feature importance per valuation, supporting comparables, market trends, key drivers
- User feedback: error reporting, professional override workflows, continuous learning, performance tracking
- Dashboard: confidence intervals, historical trends, similar properties, local indicators
Our predict endpoint lets you skip rolling your own AVM.
Houski's model accuracy: Transparent performance metrics
Accuracy metrics from our production models, measured on held-out test data the models never saw during training. Full breakdown on our AVM information page.
City-level models (highest accuracy)
City-specific models deliver the best performance by learning local market patterns:
| City | R² Score | Median MAPE | Within 10% |
|---|---|---|---|
| Calgary, AB | 0.95 | 4.6% | 80.2% |
| Edmonton, AB | 0.90 | 5.5% | 71.8% |
| Vancouver, BC | 0.93 | 5.7% | 72.0% |
| Mississauga, ON | 0.90 | 6.6% | 66.5% |
| Vaughan, ON | 0.91 | 6.6% | 65.9% |
| Toronto, ON | 0.85 | 8.0% | 58.6% |
Calgary's 4.6% median error means a $600,000 home is typically within $27,600. Roughly 80% of Calgary estimates fall within 10% of the actual value on held-out test data. Available through our predict endpoint for date-conditioned valuations across historical periods, or AVM endpoint for comprehensive reports with confidence scores.
Provincial models
When city models aren't available, provincial models provide strong regional accuracy:
| Province | R² Score | Median MAPE | Within 10% |
|---|---|---|---|
| BC | 0.83 | 7.6% | 59.6% |
| MB | 0.67 | 9.9% | 50.5% |
| AB | 0.69 | 10.0% | 49.8% |
National baseline (Canada)
For areas without sufficient local data:
| Metric | Value |
|---|---|
| R² Score | 0.70 |
| Median MAPE | 13.5% |
| Within 10% | 40.0% |
How this compares
Other Canadian AVM providers don't publicly disclose accuracy metrics. The best publicly reported off-market accuracy from major US providers sits around 7-8% median error.
Our city models outperform these benchmarks: Calgary at 4.6%, Edmonton at 5.5%, Vancouver at 5.7%. To our knowledge, these are the most accurate property valuations available in Canada. Numbers fluctuate as we refine models. Check the AVM information page for current metrics.
Understanding these metrics
Median MAPE is the typical error. 5% means half of estimates are within 5% of actual value. We use median rather than mean because outliers like $10M mansions shouldn't skew expectations for typical homes.
R² Score measures how much price variation the model explains. 0.95 means it accounts for 95% of price differences between properties.
Within 10%/20% answers: "How often will estimates be close enough for my use case?"
The hierarchical approach
The system automatically selects the most accurate available model:
- City model (if trained for that city)
- Provincial model (if no city model exists)
- National model (fallback for sparse data areas)
We only deploy city models when they outperform provincial models, so you always get the best estimate possible.
See which model applies to any location on our AVM information page, and click into city models for full performance breakdowns.
Supercharging your AVM with geospatial context
Basic models use postal codes. Accurate valuations need granular location data. Houski's /geocoding and /map endpoints provide it.
1. Residential property context
Comparable properties in the immediate area are fundamental for any valuation. The block below is a live call returning residential context within 500 metres of a target coordinate:
const houski_data = async (): Promise<GeocodingResponse> => {
// You must copy the GeocodingResponse type declarations from the
// Houski API documentation to strongly type the response
const url = new URL('https://api.houski.ca/geocoding');
url.searchParams.set('api_key', 'YOUR_API_KEY');
url.searchParams.set('expand', 'listings');
url.searchParams.set('latitude', '51.0447');
url.searchParams.set('longitude', '-114.0719');
url.searchParams.set('property_type_eq', 'House');
url.searchParams.set('radius', '0.5');
url.searchParams.set('select', 'latitude,longitude,interior_sq_m,bedroom,den,bathroom_full,bathroom_half,assessment_value,assessment_year');
url.searchParams.set('shape', 'circle');
const response = await fetch(url);
const data = await response.json();
return data;
}
(async () => {
let data: GeocodingResponse = await houski_data();
// Log the response
console.log(data);
})();
{
"cache_hit": false,
"cost_cents": 4.440000057220459,
"data": [
{
"address": "201 505 8 Avenue SW",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"den": 0,
"interior_sq_m": 125.882568359375,
"latitude": 51.045658111572266,
"longitude": -114.0718231201172,
"property_id": "328ddfdcd712fa26"
},
{
"address": "305 505 8 Avenue SW",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"den": 0,
"interior_sq_m": 125.882568359375,
"latitude": 51.045658111572266,
"longitude": -114.0718231201172,
"property_id": "62614d31007508e9"
},
{
"address": "200 505 8 Avenue SW",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"den": 0,
"interior_sq_m": 125.882568359375,
"latitude": 51.045658111572266,
"longitude": -114.0718231201172,
"property_id": "736257e5099784e0"
},
{
"address": "500 505 8 Avenue SW",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"den": 0,
"interior_sq_m": 125.882568359375,
"latitude": 51.045658111572266,
"longitude": -114.0718231201172,
"property_id": "7ea72c951f47c018"
},
{
"address": "310 505 8 Avenue SW",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"den": 0,
"interior_sq_m": 125.882568359375,
"latitude": 51.045658111572266,
"longitude": -114.0718231201172,
"property_id": "905b5b3e094e0bc0"
},
{
"address": "515 505 8 Avenue SW",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"den": 0,
"interior_sq_m": 125.882568359375,
"latitude": 51.045658111572266,
"longitude": -114.0718231201172,
"property_id": "9412f76df2925649"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 495
},
"price_quote": false,
"result_total": 2968,
"time_ms": 106
}
This returns attributes plus listing history:
- Recent comparable listings
- Price trends in the micro-neighborhood
- Time on market for similar properties
- Price adjustments during listings
2. Recent permit activity
Permits signal unrealized value or neighborhood transformation that traditional AVMs miss. The block below is a live call returning recent permit activity in the area:
const houski_data = async (): Promise<GeocodingResponse> => {
// You must copy the GeocodingResponse type declarations from the
// Houski API documentation to strongly type the response
const url = new URL('https://api.houski.ca/geocoding');
url.searchParams.set('api_key', 'YOUR_API_KEY');
url.searchParams.set('expand', 'permits');
url.searchParams.set('expand_permit_application_date_gte', '2023-06-01');
url.searchParams.set('filter_expand_match', 'all');
url.searchParams.set('latitude', '51.0447');
url.searchParams.set('longitude', '-114.0719');
url.searchParams.set('property_type_in', 'House,Commercial');
url.searchParams.set('radius', '0.5');
url.searchParams.set('shape', 'circle');
const response = await fetch(url);
const data = await response.json();
return data;
}
(async () => {
let data: GeocodingResponse = await houski_data();
// Log the response
console.log(data);
})();
{
"cache_hit": false,
"cost_cents": 0.2800000011920929,
"data": [
{
"address": "513 9 Avenue SW",
"permits": [
{
"expand_permit_application_date": "2025-03-10",
"expand_permit_content": "Status: Completed|Issued date: 2025-04-07T00:00:00.000|Completed date: 2025-07-04T00:00:00.000|Estimated project cost: 5000.0|Permit class: Special Function Ten|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Temporary|Work class group: Unspecified|Work class mapped: N/A|applicant: N/A|contractor: N/A|estimated project cost: 5000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2025-04068",
"expand_permit_type": "Building",
"property_id": "e9baf46145362e25"
},
{
"expand_permit_application_date": "2024-04-29",
"expand_permit_content": "Status: Completed|Issued date: 2024-06-04T00:00:00.000|Completed date: 2024-07-04T00:00:00.000|Estimated project cost: 5000.0|Permit class: Special Function Ten|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Temporary|Work class group: Unspecified|Work class mapped: N/A|applicant: EXPLORON|contractor: N/A|estimated project cost: 5000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2024-08042",
"expand_permit_type": "Building",
"property_id": "e9baf46145362e25"
},
{
"expand_permit_application_date": "2026-06-18",
"expand_permit_content": "Status: Completed|Issued date: 2026-06-24T00:00:00.000|Completed date: 2026-07-03T00:00:00.000|Estimated project cost: 5000.0|Permit class: Special Function Ten|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Temporary|Work class group: Unspecified|Work class mapped: N/A|applicant: N/A|contractor: N/A|estimated project cost: 5000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2026-11251",
"expand_permit_type": "Building",
"property_id": "e9baf46145362e25"
},
{
"expand_permit_application_date": "2024-01-19",
"expand_permit_content": "Status: Released|Category: Signs - Discretionary Use - Third Party Signs|Description: TEMPORARY USE: SIGN - CLASS G (DIGITAL THIRD PARTY ADVERTISING SIGN - 3 YEARS)|Proposed use code: C2721|Proposed use description: SIGN - CLASS G|Permitted/discretionary: Discretionary|Land use district: CR20-C20/R20|Land use district description: Commercial Residential District|Concurrent LOC: N/A|Decision: Approval|Decision by: Development Authority|Decision date: 2024-03-05|Canceled/refused date: N/A|SDAB Number: N/A|SDAB hearing date: N/A|SDAB Decision: N/A|SDAB decision date: N/A",
"expand_permit_id": "DP2024-00444",
"expand_permit_type": "Development",
"property_id": "e9baf46145362e25"
}
],
"property_id": "e9baf46145362e25"
},
{
"address": "525 8 Avenue SW",
"permits": [
{
"expand_permit_application_date": "2026-04-28",
"expand_permit_content": "Status: Completed|Issued date: 2026-06-13T00:00:00.000|Completed date: 2026-06-29T00:00:00.000|Estimated project cost: 8716.75|Permit class: Special Function Ten|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Temporary|Work class group: Unspecified|Work class mapped: N/A|applicant: TENT EVENT|contractor: N/A|estimated project cost: 8716.75|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2026-06987",
"expand_permit_type": "Building",
"property_id": "301a806c3b139f6"
},
{
"expand_permit_application_date": "2023-06-08",
"expand_permit_content": "Status: File Closed|Issued date: 2023-06-15T00:00:00.000|Completed date: 2023-11-16T00:00:00.000|Estimated project cost: 4500.0|Permit class: Special Function Ten|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Temporary|Work class group: Unspecified|Work class mapped: N/A|applicant: SPECIAL EVENT RENTALS|contractor: N/A|estimated project cost: 4500.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2023-08836",
"expand_permit_type": "Building",
"property_id": "301a806c3b139f6"
},
{
"expand_permit_application_date": "2023-08-28",
"expand_permit_content": "Status: Completed|Issued date: 2023-08-30T00:00:00.000|Completed date: 2023-09-05T00:00:00.000|Estimated project cost: 4500.0|Permit class: Special Function Ten|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Temporary|Work class group: Unspecified|Work class mapped: N/A|applicant: SPECIAL EVENT RENTALS|contractor: N/A|estimated project cost: 4500.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2023-14501",
"expand_permit_type": "Building",
"property_id": "301a806c3b139f6"
},
{
"expand_permit_application_date": "2025-03-07",
"expand_permit_content": "Status: Completed|Issued date: 2025-05-26T00:00:00.000|Completed date: 2025-06-30T00:00:00.000|Estimated project cost: 9100.0|Permit class: Special Function Ten|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Temporary|Work class group: Unspecified|Work class mapped: N/A|applicant: N/A|contractor: N/A|estimated project cost: 9100.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2025-03971",
"expand_permit_type": "Building",
"property_id": "301a806c3b139f6"
},
{
"expand_permit_application_date": "2024-06-12",
"expand_permit_content": "Status: Expired|Issued date: 2024-07-10T00:00:00.000|Completed date: 2025-07-10T00:00:00.000|Estimated project cost: 5700.0|Permit class: Special Function Ten|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Temporary|Work class group: Unspecified|Work class mapped: N/A|applicant: SPECIAL EVENT RENTALS|contractor: N/A|estimated project cost: 5700.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2024-11636",
"expand_permit_type": "Building",
"property_id": "301a806c3b139f6"
}
],
"property_id": "301a806c3b139f6"
},
{
"address": "404 9 Avenue SW",
"permits": [
{
"expand_permit_application_date": "2023-06-23",
"expand_permit_content": "Status: Completed|Issued date: 2023-06-27T00:00:00.000|Completed date: 2023-10-26T00:00:00.000|Estimated project cost: 72000.0|Permit class: Industrial|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Repair|Work class group: Improvement|Work class mapped: Existing|applicant: N/A|contractor: N/A|estimated project cost: 72000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2023-09977",
"expand_permit_type": "Building",
"property_id": "4b31244b21b9173a"
},
{
"expand_permit_application_date": "2025-06-12",
"expand_permit_content": "Status: Completed|Issued date: 2025-07-31T00:00:00.000|Completed date: 2026-04-07T00:00:00.000|Estimated project cost: 143000.0|Permit class: Industrial|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Repair|Work class group: Improvement|Work class mapped: Existing|applicant: C C D WESTERN|contractor: N/A|estimated project cost: 143000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2025-11279",
"expand_permit_type": "Building",
"property_id": "4b31244b21b9173a"
},
{
"expand_permit_application_date": "2023-11-22",
"expand_permit_content": "Status: Released|Category: Signs - Discretionary Use|Description: TEMPORARY USE: SIGN - CLASS E (DIGITAL MESSAGE SIGN) - 3 YEARS|Proposed use code: C2710|Proposed use description: SIGN - CLASS E|Permitted/discretionary: Discretionary|Land use district: CR20-C20/R20|Land use district description: Commercial Residential District|Concurrent LOC: N/A|Decision: Approval|Decision by: Development Authority|Decision date: 2023-12-04|Canceled/refused date: N/A|SDAB Number: N/A|SDAB hearing date: N/A|SDAB Decision: N/A|SDAB decision date: N/A",
"expand_permit_id": "DP2023-08243",
"expand_permit_type": "Development",
"property_id": "4b31244b21b9173a"
}
],
"property_id": "4b31244b21b9173a"
},
{
"address": "409 8 Avenue SW",
"permits": [
{
"expand_permit_application_date": "2025-10-21",
"expand_permit_content": "Status: Cancelled|Issued date: N/A|Completed date: 2025-11-04T00:00:00.000|Estimated project cost: N/A|Permit class: Industrial|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: New|Work class group: New|Work class mapped: New|applicant: N/A|contractor: N/A|estimated project cost: N/A|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2025-20604",
"expand_permit_type": "Building",
"property_id": "346e1324c2ac737c"
}
],
"property_id": "346e1324c2ac737c"
},
{
"address": "4100 525 8 Avenue SW",
"permits": [
{
"expand_permit_application_date": "2026-02-02",
"expand_permit_content": "Status: Completed|Issued date: 2026-02-24T00:00:00.000|Completed date: 2026-04-21T00:00:00.000|Estimated project cost: 160000.0|Permit class: Commercial|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Alteration|Work class group: Improvement|Work class mapped: Existing|applicant: PRIME PROJECTS|contractor: PRIME PROJECTS|estimated project cost: 160000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2026-01516",
"expand_permit_type": "Building",
"property_id": "1457550bf2e11164"
}
],
"property_id": "1457550bf2e11164"
},
{
"address": "4050 525 8 Avenue SW",
"permits": [
{
"expand_permit_application_date": "2023-11-14",
"expand_permit_content": "Status: Completed|Issued date: 2023-12-10T00:00:00.000|Completed date: 2024-04-16T00:00:00.000|Estimated project cost: 100000.0|Permit class: Commercial|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Alteration|Work class group: Improvement|Work class mapped: Existing|applicant: PRIME PROJECTS|contractor: PRIME PROJECTS|estimated project cost: 100000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2023-19625",
"expand_permit_type": "Building",
"property_id": "1ddd0c66b231abb7"
},
{
"expand_permit_application_date": "2023-12-21",
"expand_permit_content": "Status: Completed|Issued date: 2024-02-02T00:00:00.000|Completed date: 2024-04-16T00:00:00.000|Estimated project cost: 1271000.0|Permit class: Commercial|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Alteration|Work class group: Improvement|Work class mapped: Existing|applicant: PRIME PROJECTS|contractor: PRIME PROJECTS|estimated project cost: 1271000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2023-21843",
"expand_permit_type": "Building",
"property_id": "1ddd0c66b231abb7"
}
],
"property_id": "1ddd0c66b231abb7"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 62
},
"price_quote": false,
"result_total": 368,
"time_ms": 257
}
Critical signals that most AVMs miss:
- Recent renovations not yet in tax records
- New commercial developments impacting residential values
- Upcoming residential densification
- Neighborhood building quality improvements
3. Amenity proximity
Nearby amenities impact values but are hard to quantify without specialized data. The block below is a live call returning commercial amenities within one kilometre:
const houski_data = async (): Promise<GeocodingResponse> => {
// You must copy the GeocodingResponse type declarations from the
// Houski API documentation to strongly type the response
const url = new URL('https://api.houski.ca/geocoding');
url.searchParams.set('api_key', 'YOUR_API_KEY');
url.searchParams.set('commercial_use_neq', 'Not applicable');
url.searchParams.set('latitude', '51.0447');
url.searchParams.set('longitude', '-114.0719');
url.searchParams.set('radius', '1');
url.searchParams.set('select', 'building_name,commercial_use,latitude,longitude');
url.searchParams.set('shape', 'circle');
const response = await fetch(url);
const data = await response.json();
return data;
}
(async () => {
let data: GeocodingResponse = await houski_data();
// Log the response
console.log(data);
})();
{
"cache_hit": false,
"cost_cents": 0.9000000357627869,
"data": [
{
"address": "345 10 Avenue SW",
"building_name": "Craft Beer Market",
"commercial_use": "Restaurant",
"latitude": 51.04343032836914,
"longitude": -114.0707550048828,
"property_id": "423b33c34b270fa5"
},
{
"address": "522 11 Avenue SW",
"building_name": "West Coast Theatre Office Building",
"commercial_use": "Culture center",
"latitude": 51.04291915893555,
"longitude": -114.07271575927734,
"property_id": "6557ff585fafd50e"
},
{
"address": "3400 421 7 Avenue SW",
"commercial_use": "Office",
"latitude": 51.04661560058594,
"longitude": -114.07093048095705,
"property_id": "154ec01740fe98bc"
},
{
"address": "535 7 Avenue SW",
"building_name": "City TV",
"commercial_use": "Audio recording studio",
"latitude": 51.04652786254883,
"longitude": -114.0734634399414,
"property_id": "eafa8d1508e0a410"
},
{
"address": "617 8 Avenue SW",
"building_name": "Globe Cinema",
"commercial_use": "Cinema",
"latitude": 51.04561233520508,
"longitude": -114.07501220703124,
"property_id": "7ebf16e342fe404c"
},
{
"address": "522 6 Avenue SW",
"building_name": "Local 522",
"commercial_use": "Restaurant",
"latitude": 51.048004150390625,
"longitude": -114.07276153564452,
"property_id": "4905d20dc4e0e6db"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 13
},
"price_quote": false,
"result_total": 75,
"time_ms": 91
}
Quantifies key value factors:
- Proximity to grocery stores, restaurants, retail
- Access to medical facilities
- Distance to employment centers
- Desirable businesses (high-end vs. discount)
4. Neighborhood market statistics
Use the aggregate endpoint for neighborhood-level statistics. The block below is a live call returning a median estimate for a target community:
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_list_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);
})();
{
"cache_hit": false,
"cost_cents": 1.0,
"data": [
{
"aggregation": "median",
"field": "estimate_list_price",
"value": "627360.500"
}
],
"error": "",
"price_quote": false,
"time_ms": 56
}
Integrating geospatial context into your model
To incorporate location data into your AVM, you would orchestrate parallel calls to the properties endpoint for the subject, the geocoding endpoint for nearby residential context, permits, and amenities, and the aggregate endpoint for neighbourhood medians. The primary call against the subject property looks like this:
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('expand', 'listings');
url.searchParams.set('property_id_eq', 'bd9c6fb24c31c772');
url.searchParams.set('select', 'address,latitude,longitude,community,city,province_abbreviation,country_abbreviation,estimate_list_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);
})();
{
"cache_hit": false,
"cost_cents": 0.2199999988079071,
"data": [
{
"address": "302 610 17 Avenue SW",
"city": "Calgary",
"community": "Beltline",
"country_abbreviation": "CA",
"estimate_list_price": 304696,
"latitude": 51.03819274902344,
"listings": [
{
"expand_estimate_list_price": 325000,
"expand_listing_date": "2023-08-21",
"expand_listing_event": "Listed",
"property_id": "bd9c6fb24c31c772"
},
{
"expand_estimate_list_price": 315000,
"expand_listing_date": "2023-10-12",
"expand_listing_event": "Price decrease",
"property_id": "bd9c6fb24c31c772"
},
{
"expand_estimate_list_price": 299000,
"expand_listing_date": "2023-11-11",
"expand_listing_event": "Price decrease",
"property_id": "bd9c6fb24c31c772"
},
{
"expand_estimate_list_price": 299000,
"expand_listing_date": "2023-12-18",
"expand_listing_event": "Unlisted",
"property_id": "bd9c6fb24c31c772"
}
],
"longitude": -114.07510375976562,
"property_id": "bd9c6fb24c31c772",
"province_abbreviation": "AB"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": false,
"has_previous_page": false,
"page_total": 1
},
"price_quote": false,
"result_total": 1,
"time_ms": 40,
"ui_info": {
"address": "302 610 17 Avenue SW",
"address_link": "ca/ab/calgary/beltline/302-610-17-avenue-sw",
"address_slug": "302-610-17-avenue-sw",
"city": "Calgary",
"city_id": "6ec95b53075d062c",
"city_link": "ca/ab/calgary",
"city_slug": "calgary",
"community": "Beltline",
"community_id": "ecc51da246c7dd4a",
"community_link": "ca/ab/calgary/beltline",
"community_slug": "beltline",
"country": "Canada",
"country_abbreviation": "CA",
"country_abbreviation_id": "9ace2b6431b7f1be",
"country_abbreviation_link": "ca",
"country_slug": "canada",
"parent_address": "610 17 Avenue SW",
"parent_property_id": "52a7d622eafe5319",
"property_id": "bd9c6fb24c31c772",
"province": "Alberta",
"province_abbreviation": "AB",
"province_abbreviation_id": "aae1f05a0f89d2c7",
"province_abbreviation_link": "ca/ab",
"province_slug": "alberta"
}
}
Incorporating geospatial data captures factors traditional models miss:
- Microneighborhood effects: Properties blocks apart can have very different values
- Emerging trends: Increasing permit activity correlates with value increases
- Amenity premiums: Quantify the exact premium for specific amenities
- Development impact: Measure how new commercial development affects nearby values
Real-world example: A modular AVM architecture
A simplified example using Houski's property API. The architecture would loop through something like fetch property, classify segment, gather geospatial context, engineer features, run model, calculate confidence, find comparables. The primary underlying call against the property endpoint looks like this:
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('expand', 'listings,assessments');
url.searchParams.set('property_id_eq', 'bd9c6fb24c31c772');
const response = await fetch(url);
const data = await response.json();
return data;
}
(async () => {
let data: PropertiesResponse = await houski_data();
// Log the response
console.log(data);
})();
{
"cache_hit": false,
"cost_cents": 0.07999999821186066,
"data": [
{
"address": "302 610 17 Avenue SW",
"assessments": [
{
"expand_assessment_value": 301500,
"expand_assessment_year": 2026,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 284000,
"expand_assessment_year": 2014,
"property_id": "bd9c6fb24c31c772"
}
],
"listings": [
{
"expand_estimate_list_price": 325000,
"expand_listing_date": "2023-08-21",
"expand_listing_event": "Listed",
"property_id": "bd9c6fb24c31c772"
},
{
"expand_estimate_list_price": 315000,
"expand_listing_date": "2023-10-12",
"expand_listing_event": "Price decrease",
"property_id": "bd9c6fb24c31c772"
},
{
"expand_estimate_list_price": 299000,
"expand_listing_date": "2023-11-11",
"expand_listing_event": "Price decrease",
"property_id": "bd9c6fb24c31c772"
},
{
"expand_estimate_list_price": 299000,
"expand_listing_date": "2023-12-18",
"expand_listing_event": "Unlisted",
"property_id": "bd9c6fb24c31c772"
}
],
"property_id": "bd9c6fb24c31c772"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": false,
"has_previous_page": false,
"page_total": 1
},
"price_quote": false,
"result_total": 1,
"time_ms": 64,
"ui_info": {
"address": "302 610 17 Avenue SW",
"address_link": "ca/ab/calgary/beltline/302-610-17-avenue-sw",
"address_slug": "302-610-17-avenue-sw",
"city": "Calgary",
"city_id": "6ec95b53075d062c",
"city_link": "ca/ab/calgary",
"city_slug": "calgary",
"community": "Beltline",
"community_id": "ecc51da246c7dd4a",
"community_link": "ca/ab/calgary/beltline",
"community_slug": "beltline",
"country": "Canada",
"country_abbreviation": "CA",
"country_abbreviation_id": "9ace2b6431b7f1be",
"country_abbreviation_link": "ca",
"country_slug": "canada",
"parent_address": "610 17 Avenue SW",
"parent_property_id": "52a7d622eafe5319",
"property_id": "bd9c6fb24c31c772",
"province": "Alberta",
"province_abbreviation": "AB",
"province_abbreviation_id": "aae1f05a0f89d2c7",
"province_abbreviation_link": "ca/ab",
"province_slug": "alberta"
}
}
Benefits:
- Modularity: Components handle specific aspects
- Flexibility: Models update independently
- Transparency: Clear value derivation
- Context: Information beyond the estimate
- Confidence: Honest uncertainty communication
Beyond the algorithm: Making your AVM valuable
A great automated valuation is useful, not just accurate. Our predict endpoint returns the model's value at any date you pass in. The AVM endpoint delivers point-in-time valuations with confidence scores, model metrics, and comparables.
What the predict endpoint provides
- Date-conditioned valuations: Ask the model what it would estimate for a property on any given date - strong for reconstructing historical trajectories, not for true forecasting (the model is a gradient-boosted tree and does not extrapolate past its training window)
- Batch processing: Value multiple properties in a single request
- Scenario modeling: Override property characteristics to test "what if" scenarios
- Trend analysis: See how estimated values changed across past periods
What the AVM endpoint provides
- Three valuations: List price, sale price, and monthly rent estimates
- Confidence scores: Know how reliable each estimate is
- Model metrics: Full accuracy statistics (R², MAPE, hit rates, error distributions)
- Comparable properties: Up to 10 similar properties within 5km with list price and estimated sale date
- Property overrides: Test how changes to bedrooms, size, etc. affect value
- Generated reports: Shareable URL with full valuation details
Conclusion: The future belongs to transparent, accurate AVMs
The winners won't be those with black-box models, but those who combine accuracy with transparency. The next generation of AVMs will:
- Explain key factors driving each valuation
- Adapt to changing market conditions
- Incorporate quantitative and qualitative information
- Learn continuously from new market data and feedback
With Houski's API, developers have the data foundation to build automated valuation models that work without enterprise budgets or massive data science teams. To skip the build phase, our predict endpoint offers date-conditioned valuations across past and present, and the AVM endpoint provides comprehensive current valuations. Both use the same underlying models, with metrics on our AVM information page.
Start with our API documentation, or jump to the predict endpoint or AVM endpoint.
