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 in every country where Houski has a model that passes its accuracy checks.
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 market now has detailed property information through APIs like Houski, which covers 16 countries across North America, Europe and Asia. 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": true,
"cost_cents": 7.500001,
"data": [
{
"address": "518 Rochester Terrace NW",
"assessment_value": 1300000,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2023,
"den": 0,
"foundation_type": "Poured concrete",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 511.2,
"latitude": 51.11072,
"longitude": -114.2748,
"property_id": "103f92f6cf7bbdd9",
"property_type": "Land",
"roof_material": "Asphalt"
},
{
"address": "36 Crimson Ridge Heights NW",
"assessment_value": 194000,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2024,
"den": 0,
"foundation_type": "Poured concrete",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 4369.5,
"latitude": 51.107574,
"longitude": -114.25946,
"property_id": "104fb85a9c002e5d",
"property_type": "Commercial",
"roof_material": "Asphalt"
},
{
"address": "54 Rowmont Link NW",
"assessment_value": 853500,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2023,
"den": 0,
"foundation_type": "Poured concrete",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 369.2,
"latitude": 51.106037,
"longitude": -114.275,
"property_id": "1055f97323e53f25",
"property_type": "House",
"roof_material": "Asphalt"
},
{
"address": "499 Rochester Terrace NW",
"assessment_value": 888000,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2023,
"den": 0,
"foundation_type": "Poured concrete",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 391.6,
"latitude": 51.111366,
"longitude": -114.27512,
"property_id": "1106094a42c3757d",
"property_type": "Land",
"roof_material": "Asphalt"
},
{
"address": "304 30 Rochester View NW",
"assessment_value": 105000,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 2,
"construction_year": 1800,
"den": 0,
"foundation_type": "Poured concrete",
"heating_type_first": "Gas furnace",
"interior_sq_m": 121.70197,
"land_area_sq_m": 97.0,
"latitude": 51.109074,
"longitude": -114.26745,
"property_id": "1198b011e799062c",
"property_type": "Townhouse",
"roof_material": "Asphalt"
},
{
"address": "95 Royston He NW",
"assessment_value": 918500,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2023,
"den": 0,
"foundation_type": "Poured concrete",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 842.8,
"latitude": 51.107533,
"longitude": -114.272934,
"property_id": "11aa161875771a70",
"property_type": "Land",
"roof_material": "Asphalt"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 110113
},
"price_quote": false,
"result_total": 660677,
"time_ms": 35,
"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. One rule first: Houski's terms of service allow training a model on Houski data only when the data was bought from us for that purpose, so a training set comes from a dataset purchase or a custom dataset rather than from everyday API calls. The block below is a live call against the real API showing the rich attribute set such a dataset commonly carries:
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": true,
"cost_cents": 21.899992,
"data": [
{
"address": "518 Rochester Terrace NW",
"area_commercial_list_price_per_sq_m": 6817,
"area_comparable_list_price_per_sq_m": 4615,
"area_comparable_property_tax_per_sq_m": 23,
"area_residential_list_price_per_sq_m": 4210,
"area_residential_rent_price_per_sq_m": 17,
"assessment_value": 1300000,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2023,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 47.2,
"demographic_dwellings_occupied_percent": 0.9597315,
"demographic_education_level_bachelors_degree_percent": 0.38408303,
"demographic_household_size_1_person_percent": 0.104166664,
"demographic_income_median_pre_tax": 243546,
"demographic_municipal_population": 2130,
"demographic_transportation_car_truck_or_van_percent": 0.9375,
"den": 0,
"fireplace": 1,
"floor_above_ground": 2,
"foundation_type": "Poured concrete",
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 511.2,
"land_depth_m": 36.31661,
"land_frontage_m": 14.076205,
"latitude": 51.11072,
"longitude": -114.2748,
"maintenance_fee": 0,
"property_id": "103f92f6cf7bbdd9",
"property_type": "Land",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
},
{
"address": "36 Crimson Ridge Heights NW",
"area_commercial_list_price_per_sq_m": 6817,
"area_comparable_list_price_per_sq_m": 4777,
"area_comparable_property_tax_per_sq_m": 26,
"area_residential_list_price_per_sq_m": 4422,
"area_residential_rent_price_per_sq_m": 16,
"assessment_value": 194000,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2024,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 49.2,
"demographic_dwellings_occupied_percent": 0.980198,
"demographic_education_level_bachelors_degree_percent": 0.33333334,
"demographic_household_size_1_person_percent": 0.05263158,
"demographic_income_median_pre_tax": 217021,
"demographic_municipal_population": 320,
"demographic_transportation_car_truck_or_van_percent": 1.0,
"den": 0,
"fireplace": 1,
"floor_above_ground": 2,
"foundation_type": "Poured concrete",
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 4369.5,
"land_depth_m": 106.17584,
"land_frontage_m": 41.15343,
"latitude": 51.107574,
"longitude": -114.25946,
"maintenance_fee": 0,
"property_id": "104fb85a9c002e5d",
"property_type": "Commercial",
"roof_material": "Asphalt",
"roof_material_install_year": 2024
},
{
"address": "54 Rowmont Link NW",
"area_commercial_list_price_per_sq_m": 6817,
"area_comparable_list_price_per_sq_m": 4568,
"area_comparable_property_tax_per_sq_m": 22,
"area_residential_list_price_per_sq_m": 4362,
"area_residential_rent_price_per_sq_m": 15,
"assessment_value": 853500,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2023,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 47.2,
"demographic_dwellings_occupied_percent": 0.9597315,
"demographic_education_level_bachelors_degree_percent": 0.38408303,
"demographic_household_size_1_person_percent": 0.104166664,
"demographic_income_median_pre_tax": 243546,
"demographic_municipal_population": 2130,
"demographic_transportation_car_truck_or_van_percent": 0.9375,
"den": 0,
"fireplace": 1,
"floor_above_ground": 2,
"foundation_type": "Poured concrete",
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 369.2,
"land_depth_m": 30.863182,
"land_frontage_m": 11.962474,
"latitude": 51.106037,
"longitude": -114.275,
"maintenance_fee": 0,
"property_id": "1055f97323e53f25",
"property_type": "House",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
},
{
"address": "499 Rochester Terrace NW",
"area_commercial_list_price_per_sq_m": 6817,
"area_comparable_list_price_per_sq_m": 4632,
"area_comparable_property_tax_per_sq_m": 23,
"area_residential_list_price_per_sq_m": 4210,
"area_residential_rent_price_per_sq_m": 17,
"assessment_value": 888000,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2023,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 47.2,
"demographic_dwellings_occupied_percent": 0.9597315,
"demographic_education_level_bachelors_degree_percent": 0.38408303,
"demographic_household_size_1_person_percent": 0.104166664,
"demographic_income_median_pre_tax": 243546,
"demographic_municipal_population": 2130,
"demographic_transportation_car_truck_or_van_percent": 0.9375,
"den": 0,
"fireplace": 1,
"floor_above_ground": 2,
"foundation_type": "Poured concrete",
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 391.6,
"land_depth_m": 31.785658,
"land_frontage_m": 12.320022,
"latitude": 51.111366,
"longitude": -114.27512,
"maintenance_fee": 0,
"property_id": "1106094a42c3757d",
"property_type": "Land",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
},
{
"address": "304 30 Rochester View NW",
"area_commercial_list_price_per_sq_m": 6817,
"area_comparable_list_price_per_sq_m": 4095,
"area_comparable_property_tax_per_sq_m": 12,
"area_residential_list_price_per_sq_m": 4090,
"area_residential_rent_price_per_sq_m": 16,
"assessment_value": 105000,
"assessment_year": 2026,
"basement_finish": "Not applicable",
"basement_type": "None",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 2,
"construction_year": 1800,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 49.2,
"demographic_dwellings_occupied_percent": 0.980198,
"demographic_education_level_bachelors_degree_percent": 0.33333334,
"demographic_household_size_1_person_percent": 0.05263158,
"demographic_income_median_pre_tax": 217021,
"demographic_municipal_population": 320,
"demographic_transportation_car_truck_or_van_percent": 1.0,
"den": 0,
"fireplace": 0,
"floor_above_ground": 3,
"foundation_type": "Poured concrete",
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 121.70197,
"land_area_sq_m": 97.0,
"land_depth_m": 15.819608,
"land_frontage_m": 6.1316314,
"latitude": 51.109074,
"longitude": -114.26745,
"maintenance_fee": 0,
"property_id": "1198b011e799062c",
"property_type": "Townhouse",
"roof_material": "Asphalt",
"roof_material_install_year": 2010
},
{
"address": "95 Royston He NW",
"area_commercial_list_price_per_sq_m": 6817,
"area_comparable_list_price_per_sq_m": 4327,
"area_comparable_property_tax_per_sq_m": 24,
"area_residential_list_price_per_sq_m": 4260,
"area_residential_rent_price_per_sq_m": 15,
"assessment_value": 918500,
"assessment_year": 2026,
"basement_finish": "Finished",
"basement_type": "Full",
"bathroom_full": 2,
"bathroom_half": 1,
"bedroom": 3,
"construction_year": 2023,
"cooling_type_first": "None",
"demographic_age_median_of_the_population": 47.2,
"demographic_dwellings_occupied_percent": 0.9597315,
"demographic_education_level_bachelors_degree_percent": 0.38408303,
"demographic_household_size_1_person_percent": 0.104166664,
"demographic_income_median_pre_tax": 243546,
"demographic_municipal_population": 2130,
"demographic_transportation_car_truck_or_van_percent": 0.9375,
"den": 0,
"fireplace": 1,
"floor_above_ground": 2,
"foundation_type": "Poured concrete",
"garage_parking_space_first": 2,
"garage_type_first": "Attached",
"heating_type_first": "Gas furnace",
"interior_sq_m": 169.45374,
"land_area_sq_m": 842.8,
"land_depth_m": 46.63072,
"land_frontage_m": 18.073921,
"latitude": 51.107533,
"longitude": -114.272934,
"maintenance_fee": 0,
"property_id": "11aa161875771a70",
"property_type": "Land",
"roof_material": "Asphalt",
"roof_material_install_year": 2023
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 110113
},
"price_quote": false,
"result_total": 660677,
"time_ms": 88,
"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
Every Houski model is scored on held-out test data it never saw during training, and the results are published per model on our AVM information page: the R² score, the median absolute percentage error, and the share of estimates within 5, 10, 15 and 20 percent of the observed value. The models are refit every night, so the page is the place to read current figures rather than a table in a blog post. City models are usually the most accurate, because they learn local market patterns, and the figures are available through our predict endpoint for date-conditioned valuations or the AVM endpoint for full reports with confidence scores.
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 or state model (if no city model exists)
- National model (fallback for sparse data areas)
A city or provincial model is only deployed when it beats the model above it on both median error and R² score, so you always get the best estimate available. A property is only ever valued by the models of its own country, and where a country has no model that passes these checks, the property gets no valuation rather than a borrowed one.
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": true,
"cost_cents": 2.96,
"data": [
{
"address": "1111 4 Street SW",
"assessment_value": 197600000,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 0,
"bedroom": 2,
"den": 0,
"interior_sq_m": 158.21255,
"latitude": 51.042336,
"longitude": -114.07212,
"property_id": "cff7f22a1664c2a2"
},
{
"address": "1215 5 Street SW",
"assessment_value": 47390000,
"assessment_year": 2026,
"bathroom_full": 2,
"bathroom_half": 0,
"bedroom": 2,
"den": 0,
"interior_sq_m": 101.44969,
"latitude": 51.04107,
"longitude": -114.07458,
"property_id": "34a830a9b9745c08"
},
{
"address": "1200 6 Street SW",
"assessment_value": 76530000,
"assessment_year": 2026,
"bathroom_full": 1,
"bathroom_half": 0,
"bedroom": 2,
"den": 0,
"interior_sq_m": 76.83081,
"latitude": 51.041355,
"longitude": -114.0758,
"property_id": "5db0d244b6dc5405"
},
{
"address": "140 10 Avenue SW",
"assessment_value": 42800000,
"assessment_year": 2026,
"bathroom_full": 1,
"bathroom_half": 0,
"bedroom": 1,
"den": 0,
"interior_sq_m": 68.28374,
"latitude": 51.04363,
"longitude": -114.06506,
"property_id": "c9652d41ac84be4b"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": false,
"has_previous_page": false,
"page_total": 1
},
"price_quote": false,
"result_total": 4,
"time_ms": 779
}
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": true,
"cost_cents": 1.92,
"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",
"expand_permit_value": 5000,
"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",
"expand_permit_value": 5000,
"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",
"expand_permit_value": 5000,
"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": "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",
"expand_permit_value": 72000,
"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",
"expand_permit_value": 143000,
"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": "525 8 Avenue SW",
"permits": [
{
"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",
"expand_permit_value": 4500,
"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",
"expand_permit_value": 4500,
"property_id": "301a806c3b139f6"
},
{
"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",
"expand_permit_value": 8717,
"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",
"expand_permit_value": 9100,
"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",
"expand_permit_value": 5700,
"property_id": "301a806c3b139f6"
}
],
"property_id": "301a806c3b139f6"
},
{
"address": "529 9 Avenue SW",
"permits": [
{
"expand_permit_application_date": "2024-01-17",
"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-02-23|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-00364",
"expand_permit_type": "Development",
"property_id": "9e81f8cf2a8f538e"
}
],
"property_id": "9e81f8cf2a8f538e"
},
{
"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": "401 9 Avenue SW",
"permits": [
{
"expand_permit_application_date": "2023-09-21",
"expand_permit_content": "Status: Completed|Issued date: 2023-10-23T00:00:00.000|Completed date: 2024-02-27T00:00:00.000|Estimated project cost: 236532.2|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: PANEL CONSTRUCTION COMPANY|contractor: PANEL CONSTRUCTION COMPANY|estimated project cost: 236532.2|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2023-16215",
"expand_permit_type": "Building",
"expand_permit_value": 236532,
"property_id": "f1189e736af0de82"
},
{
"expand_permit_application_date": "2025-03-20",
"expand_permit_content": "Status: Completed|Issued date: 2025-03-28T00:00:00.000|Completed date: 2025-11-19T00:00:00.000|Estimated project cost: 1500.0|Permit class: Commercial|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Fire/ Security Alarm|Work class group: Unspecified|Work class mapped: N/A|applicant: CANEM SYSTEMS|contractor: N/A|estimated project cost: 1500.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2025-04727",
"expand_permit_type": "Building",
"expand_permit_value": 1500,
"property_id": "f1189e736af0de82"
},
{
"expand_permit_application_date": "2026-08-14",
"expand_permit_content": "Status: Issued Permit|Issued date: 2026-09-28T00:00:00.000|Completed date: N/A|Estimated project cost: 985000.0|Permit class: General|Permit type: Commercial / Multi Family Project|Permit type mapped: Building|Work class: Alteration|Work class group: Improvement|Work class mapped: Existing|applicant: N/A|contractor: GOVAN BROWN & ASSOCIATES|estimated project cost: 985000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2026-15411",
"expand_permit_type": "Building",
"expand_permit_value": 985000,
"property_id": "f1189e736af0de82"
},
{
"expand_permit_application_date": "2026-10-08",
"expand_permit_content": "Status: Issued Permit|Issued date: 2026-10-28T00:00:00.000|Completed date: N/A|Estimated project cost: 400000.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: READ JONES CHRISTOFFERSEN|contractor: N/A|estimated project cost: 400000.0|Total square feet affected: N/A|Housing units affected: 0",
"expand_permit_id": "BP2026-19362",
"expand_permit_type": "Building",
"expand_permit_value": 400000,
"property_id": "f1189e736af0de82"
}
],
"property_id": "f1189e736af0de82"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 41
},
"price_quote": false,
"result_total": 241,
"time_ms": 2038
}
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": true,
"cost_cents": 0.90000004,
"data": [
{
"address": "525 8 Avenue SW",
"building_name": "Boston Consulting Group",
"commercial_use": "Other",
"latitude": 51.045322,
"longitude": -114.072426,
"property_id": "301a806c3b139f6"
},
{
"address": "351 10 Avenue SW",
"building_name": "Thai Sa-on",
"commercial_use": "Restaurant",
"latitude": 51.043438,
"longitude": -114.07102,
"property_id": "4c151cb7ffe03667"
},
{
"address": "751 3 Street SW",
"building_name": "Brass Monocle",
"commercial_use": "Other",
"latitude": 51.045864,
"longitude": -114.070564,
"property_id": "834911956b701e1"
},
{
"address": "345 10 Avenue SW",
"building_name": "Craft Beer Market",
"commercial_use": "Restaurant",
"latitude": 51.04343,
"longitude": -114.070755,
"property_id": "423b33c34b270fa5"
},
{
"address": "530 8 Avenue SW",
"building_name": "Travelers Canada Calgary Office",
"commercial_use": "Other",
"latitude": 51.04629,
"longitude": -114.07296,
"property_id": "ba4e9791f6aec2e5"
},
{
"address": "1015 4 Street SW",
"building_name": "Tim Hortons",
"commercial_use": "Cafe",
"latitude": 51.042896,
"longitude": -114.07199,
"property_id": "6a5165cef32bd8d2"
}
],
"error": "",
"pagination": {
"current_page": 1,
"has_next_page": true,
"has_previous_page": false,
"page_total": 37
},
"price_quote": false,
"result_total": 220,
"time_ms": 673
}
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": true,
"cost_cents": 1.0,
"data": [
{
"aggregation": "median",
"field": "estimate_list_price",
"value": "631924"
}
],
"error": "",
"price_quote": false,
"time_ms": 15
}
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": true,
"cost_cents": 0.58000004,
"data": [
{
"address": "302 610 17 Avenue SW",
"city": "Calgary",
"community": "Beltline",
"country_abbreviation": "CA",
"estimate_list_price": 271133,
"latitude": 51.038193,
"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.0751,
"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": 50,
"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": true,
"cost_cents": 2.6200001,
"data": [
{
"address": "302 610 17 Avenue SW",
"assessments": [
{
"expand_assessment_value": 301500,
"expand_assessment_year": 2026,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 182500,
"expand_assessment_year": 2005,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 196500,
"expand_assessment_year": 2006,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 237000,
"expand_assessment_year": 2007,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 362500,
"expand_assessment_year": 2008,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 320500,
"expand_assessment_year": 2009,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 288500,
"expand_assessment_year": 2010,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 341000,
"expand_assessment_year": 2011,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 329500,
"expand_assessment_year": 2012,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 279000,
"expand_assessment_year": 2013,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 291000,
"expand_assessment_year": 2015,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 316500,
"expand_assessment_year": 2016,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 270500,
"expand_assessment_year": 2018,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 245500,
"expand_assessment_year": 2019,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 227000,
"expand_assessment_year": 2020,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 209000,
"expand_assessment_year": 2021,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 285000,
"expand_assessment_year": 2017,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 210500,
"expand_assessment_year": 2022,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 219000,
"expand_assessment_year": 2023,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 245500,
"expand_assessment_year": 2024,
"property_id": "bd9c6fb24c31c772"
},
{
"expand_assessment_value": 291000,
"expand_assessment_year": 2025,
"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": 285,
"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 from January 2021 to today. 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 date from January 2021 to today, which is strong for reconstructing historical trajectories. It does not forecast: the model is a gradient-boosted tree that does not extrapolate past its training window, so a date after today is refused
- 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.
