Home value API: get an estimated value for any address

Photo of Alex Wilkinson
Alex Wilkinson
CEO of Houski
2026-11-13

A home value API has one job: take an address and say what the home is worth. The Houski API does that job at three levels of depth, and each level has its own price. This post explains the three levels, shows a live request for two of them, and says which one fits which task.

The three levels are:

  1. The estimate fields, which come back on any request for $0.001 per value.
  2. The value history from the /predict endpoint, which runs from 2021-01-01 to today.
  3. The full automated valuation model (AVM) from the /avm endpoint, at $5.00 per request.

Level 1: estimated value fields on any request

Nearly every property in the Houski data carries three estimate fields:

  • estimate_sale_price, the estimated price the home would sell for
  • estimate_list_price, the estimated price the home would be listed at
  • estimate_rent_monthly, the estimated monthly rent

These are ordinary fields. You name them in the select parameter of any request, beside the bedroom count or the construction year, and they come back in the same row. The simplest way to go from an address to a value is the /search endpoint, which is a fuzzy address lookup that copes with typing errors and half-typed addresses.

The block below is a live call against the real API. The request code and the JSON answer are generated each time this page loads.

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', '5');
    url.searchParams.set('query', '123+main+st+calgary');
    url.searchParams.set('select', 'address,property_type,estimate_list_price,bedroom,bathroom_half,bathroom_full');

    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": true,
  "cost_cents": 2.1499999,
  "data": [
    {
      "address": "123 Main Street",
      "bathroom_full": 1,
      "bathroom_half": 0,
      "bedroom": 3,
      "estimate_list_price": 123919,
      "property_id": "aafadb43ded908a3",
      "property_type": "Townhouse"
    },
    {
      "address": "123 Main Street",
      "bathroom_full": 1,
      "bathroom_half": 0,
      "bedroom": 3,
      "estimate_list_price": 234224,
      "property_id": "ae06f5914a609e6d",
      "property_type": "House"
    },
    {
      "address": "123 Midcrest Crescent SE",
      "bathroom_full": 2,
      "bathroom_half": 0,
      "bedroom": 3,
      "estimate_list_price": 585563,
      "property_id": "d5f6e3fa9a720e57",
      "property_type": "House"
    },
    {
      "address": "123 Masters Street SE",
      "bathroom_full": 3,
      "bathroom_half": 1,
      "bedroom": 4,
      "estimate_list_price": 676479,
      "property_id": "4a7f48fcb67f69a4",
      "property_type": "House"
    },
    {
      "address": "123 Marquis Green SE",
      "bathroom_full": 4,
      "bathroom_half": 1,
      "bedroom": 3,
      "estimate_list_price": 770055,
      "property_id": "8708c4475c5f506c",
      "property_type": "House"
    }
  ],
  "error": "",
  "match_meta": [
    {
      "match_value": 0.7,
      "property_id": "aafadb43ded908a3"
    },
    {
      "match_value": 0.7,
      "property_id": "ae06f5914a609e6d"
    },
    {
      "match_value": 0.7,
      "property_id": "d5f6e3fa9a720e57"
    },
    {
      "match_value": 0.7,
      "property_id": "4a7f48fcb67f69a4"
    },
    {
      "match_value": 0.7,
      "property_id": "8708c4475c5f506c"
    }
  ],
  "price_quote": false,
  "result_total": 5,
  "time_ms": 58
}

Each match carries its property_id. Keep that identifier, because the other two levels use it.

The same fields work as filters and sorts on the /properties endpoint, as in estimate_list_price_lte=500000.

Money comes back in each country's own currency, so a Canadian home is valued in Canadian dollars and a British home in pounds.

Level 2: home value history from the /predict endpoint

A single number says what a home is worth today. Lenders, analysts and investors often need to know how that value moved. The /predict endpoint returns the modelled value of a property for any date from 2021-01-01 to today.

The request below asks for the last 12 months, one value per month, of the estimated sale price and the estimated list price for two properties.

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

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

    const url = new URL('https://api.houski.ca/predict');
    url.searchParams.set('api_key', 'YOUR_API_KEY');
    url.searchParams.set('fields', 'estimate_sale_price,estimate_list_price');
    url.searchParams.set('last', '12');
    url.searchParams.set('period', 'month');
    url.searchParams.set('property_id', '10004f7afe0c1946,10007f9761f49940');

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

    return data;
}

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

// Log the response
console.log(data);
})();
API response
JSON
{
  "cache_hit": true,
  "cost_cents": 5.2000003,
  "data": [
    {
      "predictions": [
        {
          "date": "2025-11-19",
          "estimate_list_price": 503596.62,
          "estimate_sale_price": 491714.6
        },
        {
          "date": "2025-12-19",
          "estimate_list_price": 503596.62,
          "estimate_sale_price": 487381.16
        },
        {
          "date": "2026-01-18",
          "estimate_list_price": 502996.2,
          "estimate_sale_price": 487471.8
        },
        {
          "date": "2026-02-17",
          "estimate_list_price": 499529.9,
          "estimate_sale_price": 487848.5
        },
        {
          "date": "2026-03-19",
          "estimate_list_price": 495628.38,
          "estimate_sale_price": 486190.84
        },
        {
          "date": "2026-04-18",
          "estimate_list_price": 489586.97,
          "estimate_sale_price": 486741.53
        },
        {
          "date": "2026-05-18",
          "estimate_list_price": 483026.47,
          "estimate_sale_price": 486030.9
        },
        {
          "date": "2026-06-17",
          "estimate_list_price": 484215.47,
          "estimate_sale_price": 484096.8
        },
        {
          "date": "2026-07-17",
          "estimate_list_price": 471493.97,
          "estimate_sale_price": 472717.25
        },
        {
          "date": "2026-08-16",
          "estimate_list_price": 475712.0,
          "estimate_sale_price": 475662.56
        },
        {
          "date": "2026-09-15",
          "estimate_list_price": 478846.75,
          "estimate_sale_price": 475862.22
        },
        {
          "date": "2026-10-15",
          "estimate_list_price": 475366.44,
          "estimate_sale_price": 475862.22
        },
        {
          "date": "2026-11-14",
          "estimate_list_price": 470631.88,
          "estimate_sale_price": 480141.3
        }
      ],
      "property_id": "10007f9761f49940"
    },
    {
      "predictions": [
        {
          "date": "2025-11-19",
          "estimate_list_price": 929791.7,
          "estimate_sale_price": 874678.8
        },
        {
          "date": "2025-12-19",
          "estimate_list_price": 929660.44,
          "estimate_sale_price": 871236.4
        },
        {
          "date": "2026-01-18",
          "estimate_list_price": 930732.94,
          "estimate_sale_price": 868737.3
        },
        {
          "date": "2026-02-17",
          "estimate_list_price": 926609.4,
          "estimate_sale_price": 879383.56
        },
        {
          "date": "2026-03-19",
          "estimate_list_price": 891511.06,
          "estimate_sale_price": 871795.7
        },
        {
          "date": "2026-04-18",
          "estimate_list_price": 894893.6,
          "estimate_sale_price": 872757.4
        },
        {
          "date": "2026-05-18",
          "estimate_list_price": 955042.6,
          "estimate_sale_price": 880124.4
        },
        {
          "date": "2026-06-17",
          "estimate_list_price": 966044.2,
          "estimate_sale_price": 869267.75
        },
        {
          "date": "2026-07-17",
          "estimate_list_price": 945719.94,
          "estimate_sale_price": 872487.7
        },
        {
          "date": "2026-08-16",
          "estimate_list_price": 946715.25,
          "estimate_sale_price": 872487.7
        },
        {
          "date": "2026-09-15",
          "estimate_list_price": 940915.06,
          "estimate_sale_price": 941196.0
        },
        {
          "date": "2026-10-15",
          "estimate_list_price": 951996.3,
          "estimate_sale_price": 960910.6
        },
        {
          "date": "2026-11-14",
          "estimate_list_price": 965975.06,
          "estimate_sale_price": 947889.7
        }
      ],
      "property_id": "10004f7afe0c1946"
    }
  ],
  "error": "",
  "price_quote": false,
  "result_total": 2,
  "time_ms": 24
}

Two points about /predict matter before you build on it.

It does not forecast. The history ends today. The endpoint will not return a value for next year, and no parameter makes it do so. If your product shows a future value, that projection is yours to make and to label.

It accepts overrides. You can replace a characteristic of the home, such as bedroom or interior_sq_m, and the endpoint returns the value the model gives the changed home. That is the tool for renovation modelling. Ask for the value of a home as it stands, ask again with one more bedroom, and the difference is the modelled effect of the renovation. Contractors can put a number beside a quote, and investors can compare the cost of the work with the value it adds.

Level 3: a full automated valuation from the /avm endpoint

The /avm endpoint produces a full valuation of one home, including similar nearby properties that support the figure. This is the level for a decision that rests on one property: a loan file, an insurance placement, a purchase offer.

A full valuation costs $5.00 per request, which is far more than any other request in the API. Treat it with care:

  • Quote first. Add price_quote=true to the request. The API returns the cost with an empty data field and no charge.
  • Always confirm with the person paying. If your application or an AI assistant starts a valuation for a user, show the quoted price and wait for a clear yes before sending the real request.
  • Do not loop it. For a list of homes, use the estimate fields from level 1. Save /avm for the one property that needs the full report.

How accurate the home value estimates are

An estimate is only useful if you know how far to trust it. The model accuracy page gives the measured accuracy of the valuation models. Read it before you put a value in front of a customer.

Values that no record states are worked out by Houski, and they are labelled Inferred. Many fields have a matching _source field that says whether a value is a link to a public record, Observed, Inferred or User.

What a home value request costs

Billing is on the values returned, never on how much was searched. An estimate field costs $0.001 per value, and a field with no value for a home is not billed. Adding price_quote=true to any request returns its cost for free. Pay as you go has a $99 monthly minimum in United States dollars, and every account sets its own maximum monthly spend. The pricing page has the full table.

Get started

One schema covers more than 220 million properties across Canada, the United States, Great Britain, much of Europe and South Korea, with data updated daily. Get a key and send your first request with the quick start guide.