!

How Canadian title companies are speeding up property verification with APIs

Photo of Alex Wilkinson
Alex Wilkinson
CEO of Houski
2026-03-07

Canadian title insurance and conveyancing processes an enormous volume of property closings every year. Each requires verifying details, confirming addresses, cross-referencing assessments, and validating that the legal description matches reality.

The cost of errors is significant: A single mistake in property identification can lead to claims costing tens of thousands to resolve. Yet much of this work still depends on manual lookups across multiple systems.

Property verification APIs cut errors and improve processing speed by replacing manual lookups with a single call.

The verification challenge

Every title closing needs answers to:

  1. Does this property exist? Is the address valid and standardized?
  2. Is the description accurate? Do the legal description and physical characteristics match?
  3. What's the property worth? Is the closing value reasonable?
  4. Are there red flags? Assessment anomalies, unusual characteristics, potential issues?

Traditionally that meant:

  • Manual lookups in municipal assessment databases
  • Cross-referencing multiple address formats
  • Comparing client-provided details against official records
  • Physical verification for unusual cases

Each manual step introduces delay and error.

API-powered property verification

Modern title operations automate verification by checking details against comprehensive databases. A verification workflow chains two calls: first /search to resolve the client-supplied address to a property_id, then /properties to pull the full record for comparison. The /properties call looks something like this:

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

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

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('property_id_eq', 'bd9c6fb24c31c772');
    url.searchParams.set('select', 'address,city,province_abbreviation,postal_code,property_type,construction_year,interior_sq_m,land_area_sq_m,assessment_value,assessment_year,estimate_sale_price,latitude,longitude');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 0.6800000071525574,
  "data": [
    {
      "address": "302 610 17 Avenue SW",
      "assessment_value": 301500,
      "assessment_year": 2026,
      "city": "Calgary",
      "construction_year": 1979,
      "estimate_sale_price": 293364,
      "interior_sq_m": 92.43848419189452,
      "land_area_sq_m": 0.0,
      "latitude": 51.03819274902344,
      "longitude": -114.07510375976562,
      "postal_code": "T2S0B4",
      "property_id": "bd9c6fb24c31c772",
      "property_type": "Apartment",
      "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": 25,
  "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"
  }
}

Compare each field returned against the client-supplied details (property type, lot size, closing value relative to estimate_sale_price) to produce a verified-or-needs-review flag.

For complete API documentation, see our Search API docs and Properties API docs.

Key capabilities for title operations

1. Address standardization

Convert any address format to a standardized, verified address. Hit the /search endpoint with the raw input, take the first property_id back, then pull the canonical address components from /properties:

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

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

    const url = new URL('https://api.houski.ca/search');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('max_results', '1');
    url.searchParams.set('query', '123+main+st+calgary');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 0.019999999552965164,
  "data": [
    {
      "address": "1215 19489 Main Street SE",
      "property_id": "1a0d9646b3b7fee4"
    }
  ],
  "error": "",
  "match_meta": [
    {
      "match_value": 0.8333333134651184,
      "property_id": "1a0d9646b3b7fee4"
    }
  ],
  "price_quote": false,
  "result_total": 1,
  "time_ms": 557
}

The standardized components (address, city, province_abbreviation, postal_code) come back on the /properties follow-up against the resolved property_id.

The Search endpoint handles fuzzy address matching. See our Search API docs.

2. Geocoding for legal descriptions

Convert addresses to coordinates by first resolving the address through /search, then pulling the coordinates from /properties using the returned property_id:

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

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

    const url = new URL('https://api.houski.ca/search');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('max_results', '1');
    url.searchParams.set('query', '123+main+st+calgary+AB');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 0.019999999552965164,
  "data": [
    {
      "address": "1215 19489 Main Street SE",
      "property_id": "1a0d9646b3b7fee4"
    }
  ],
  "error": "",
  "match_meta": [
    {
      "match_value": 0.8518518805503845,
      "property_id": "1a0d9646b3b7fee4"
    }
  ],
  "price_quote": false,
  "result_total": 1,
  "time_ms": 583
}
API request
TypeScript code
const houski_data = async (): Promise<PropertiesResponse> => {

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

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('property_id_eq', 'bd9c6fb24c31c772');
    url.searchParams.set('select', 'address,latitude,longitude');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 0.03999999910593033,
  "data": [
    {
      "address": "302 610 17 Avenue SW",
      "latitude": 51.03819274902344,
      "longitude": -114.07510375976562,
      "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": 46,
  "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"
  }
}

3. Property characteristic verification

Verify that property characteristics in legal documents match official records. Pull just the fields that appear on the legal description, then compare each to the document values:

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

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

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('property_id_eq', 'bd9c6fb24c31c772');
    url.searchParams.set('select', 'property_type,construction_year,interior_sq_m,land_area_sq_m,floor_above_ground,bedroom,bathroom_full');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 0.6299999952316284,
  "data": [
    {
      "address": "302 610 17 Avenue SW",
      "bathroom_full": 1,
      "bedroom": 2,
      "construction_year": 1979,
      "floor_above_ground": 1,
      "interior_sq_m": 92.43848419189452,
      "land_area_sq_m": 0.0,
      "property_id": "bd9c6fb24c31c772",
      "property_type": "Apartment"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": false,
    "has_previous_page": false,
    "page_total": 1
  },
  "price_quote": false,
  "result_total": 1,
  "time_ms": 25,
  "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"
  }
}

Flag a discrepancy any time the document and database values differ outside a reasonable tolerance (10 sqm on lot size, exact match on year built).

4. Assessment value cross-reference

Compare closing values against assessment records by pulling the assessment fields and the model-based estimate in one call:

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

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

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('property_id_eq', 'bd9c6fb24c31c772');
    url.searchParams.set('select', 'assessment_value,assessment_year,estimate_sale_price,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);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 0.41999998688697815,
  "data": [
    {
      "address": "302 610 17 Avenue SW",
      "assessment_value": 301500,
      "assessment_year": 2026,
      "estimate_list_price": 304696,
      "estimate_sale_price": 293364,
      "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": 47,
  "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"
  }
}

Compute the closing-to-assessment ratio and the closing-to-estimate ratio, then flag any outliers (ratios above 1.5 against assessment, or below 0.7 against the market estimate).

5. Batch verification for volume processing

For volume processing, loop the verification workflow over a list of closings in parallel. The underlying per-closing call is the same /properties lookup shown above.

Integration patterns

Direct API integration

For custom title production systems, wrap the three building blocks (find property, verify characteristics, cross-reference value) in a single service class. Each method calls the /search or /properties endpoint shown above, and the orchestration layer decides whether the file proceeds or routes for manual review.

Scheduled re-verification

Run a nightly or weekly batch job over your active-policy book to catch property characteristics that have changed since the original underwrite. We would loop through something like this for each policy:

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

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

    const url = new URL('https://api.houski.ca/properties');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('property_id_eq', 'bd9c6fb24c31c772');
    url.searchParams.set('select', 'assessment_value,property_type,interior_sq_m');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": false,
  "cost_cents": 0.23000001907348633,
  "data": [
    {
      "address": "302 610 17 Avenue SW",
      "assessment_value": 301500,
      "interior_sq_m": 92.43848419189452,
      "property_id": "bd9c6fb24c31c772",
      "property_type": "Apartment"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": false,
    "has_previous_page": false,
    "page_total": 1
  },
  "price_quote": false,
  "result_total": 1,
  "time_ms": 47,
  "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"
  }
}

Compare the new values to what was on file at underwrite time. Flag any policy where the assessment, property type, or interior area has moved enough to warrant review.

Benefits for title operations

Reduced errors

Automated verification catches what manual review misses:

  • Address format inconsistencies
  • Property type mismatches
  • Unusual value relationships
  • Missing or incorrect characteristics

Faster processing

Multiple manual lookups happen in milliseconds:

  • Instant address verification
  • One-call property data retrieval
  • Automated cross-referencing
  • Batch processing

Lower costs

  • Reduced analyst time per file
  • Fewer errors to correct
  • Scales without proportional staff increases
  • Pay-per-use pricing

Improved client experience

  • Same-day verifications
  • Fewer callbacks for missing information
  • Proactive issue identification
  • Transparent verification status

Pricing for title companies

  • Property lookups: Per-field pricing starting at fractions of a cent per field per property (see the API pricing page and per-field rates in the API fields documentation)
  • Search/geocoding: Minimal cost per lookup
  • Volume pricing: Discounts for high-volume operations

A typical residential title file with address verification and property data retrieval runs under $0.50, a fraction of manual lookup time.

Getting started

  1. Get started with the API - Get your API key
  2. Test the search endpoint - Try address lookups
  3. Review properties endpoint - Explore available fields
  4. Build a verification workflow - Start with a single use case
  5. Contact us - Discuss volume pricing

The future of title operations

Title is evolving toward instant verification and automated underwriting. Companies investing in API-based verification today will be positioned to offer faster, more accurate service as client expectations rise.


Ready to modernize verification? Explore Houski's API documentation or contact us to discuss integration.