Land or building? Assessment value parts and parcel numbers

Photo of Alex Wilkinson
Alex Wilkinson
CEO of Houski
2026-10-19

An assessed value of 1.4 million dollars says very little on its own. On one lot it is a modest house on expensive land. On another it is a large new building on cheap land. Those two properties behave differently when the market moves, when the house burns, when a developer comes knocking, and when the tax bill arrives.

Many assessing authorities publish the split. Houski carries it beside the total, together with the authority's own number for the property:

  • assessment_land_value: the part of the assessed value the authority assigns to the land alone
  • assessment_improvement_value: the part it assigns to the buildings and other improvements on the land
  • parcel_number: the number the authority uses to identify the property, written exactly as the authority writes it, with its leading zeros and punctuation

How the parts relate to the total

The two parts are on the same basis and for the same year as assessment_value, so where the authority publishes both, they add up to the total. Houski checks that. If the parts do not add to the total, or a lone part is larger than the total, both parts are left empty rather than served in a form that contradicts the total.

Where the authority publishes no split, the parts are empty and assessment_value stands alone. An improvement value of zero is a real value, not a gap: it means the authority records land with no assessed building on it.

Pulling the split

The block below is a live call against the real API, filtered to Vancouver properties that carry a land value. The request and the response are generated every time this page renders:

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('assessment_land_value_gte', '1');
    url.searchParams.set('city', 'vancouver');
    url.searchParams.set('country_abbreviation', 'ca');
    url.searchParams.set('province_abbreviation', 'bc');
    url.searchParams.set('results_per_page', '5');
    url.searchParams.set('select', 'address,property_type,assessment_value,assessment_land_value,assessment_improvement_value,assessment_year,parcel_number');

    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": true,
  "cost_cents": 2.6499999,
  "data": [
    {
      "address": "2366 41 Avenue W",
      "assessment_improvement_value": 852000,
      "assessment_land_value": 2078000,
      "assessment_value": 2930000,
      "assessment_year": 2026,
      "parcel_number": "750078240000",
      "property_id": "100717c04998959",
      "property_type": "Commercial"
    },
    {
      "address": "2460 51 Avenue W",
      "assessment_improvement_value": 91300,
      "assessment_land_value": 3107000,
      "assessment_value": 3198300,
      "assessment_year": 2026,
      "parcel_number": "794075640000",
      "property_id": "100f24c228852e79",
      "property_type": "House"
    },
    {
      "address": "707 7128 Adera Street",
      "assessment_improvement_value": 278000,
      "assessment_land_value": 1030000,
      "assessment_value": 1308000,
      "assessment_year": 2026,
      "parcel_number": "124802880151",
      "property_id": "101c4dcfbb15f419",
      "property_type": "Apartment"
    },
    {
      "address": "507 1561 57 Avenue W",
      "assessment_improvement_value": 663000,
      "assessment_land_value": 1393000,
      "assessment_value": 2056000,
      "assessment_year": 2026,
      "parcel_number": "810124050040",
      "property_id": "101e32f7b2ea9c2e",
      "property_type": "Apartment"
    },
    {
      "address": "2122 47 Avenue W",
      "assessment_improvement_value": 10000,
      "assessment_land_value": 2674000,
      "assessment_value": 2684000,
      "assessment_year": 2026,
      "parcel_number": "765081780000",
      "property_id": "1033e36d67d07c8e",
      "property_type": "House"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 40787
  },
  "price_quote": false,
  "result_total": 203932,
  "time_ms": 33,
  "ui_info": {
    "city": "Vancouver",
    "city_id": "3d4b9ab2229768be",
    "city_link": "ca/bc/vancouver",
    "city_slug": "vancouver",
    "country": "Canada",
    "country_abbreviation": "CA",
    "country_abbreviation_id": "9ace2b6431b7f1be",
    "country_abbreviation_link": "ca",
    "country_slug": "canada",
    "province": "British Columbia",
    "province_abbreviation": "BC",
    "province_abbreviation_id": "84b27e64bc119a2",
    "province_abbreviation_link": "ca/bc",
    "province_slug": "british_columbia"
  }
}

The same pull for Seattle, with the state in the province_abbreviation parameter:

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('assessment_land_value_gte', '1');
    url.searchParams.set('city', 'seattle');
    url.searchParams.set('country_abbreviation', 'us');
    url.searchParams.set('province_abbreviation', 'wa');
    url.searchParams.set('results_per_page', '5');
    url.searchParams.set('select', 'address,property_type,assessment_value,assessment_land_value,assessment_improvement_value,assessment_year,parcel_number');

    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": true,
  "cost_cents": 2.6499999,
  "data": [
    {
      "address": "11722 25 Avenue NE",
      "assessment_improvement_value": 228000,
      "assessment_land_value": 600000,
      "assessment_value": 828000,
      "assessment_year": 2025,
      "parcel_number": "3448001225",
      "property_id": "100a02b7befee12",
      "property_type": "House"
    },
    {
      "address": "11347 17 Avenue NE",
      "assessment_improvement_value": 118000,
      "assessment_land_value": 609000,
      "assessment_value": 727000,
      "assessment_year": 2025,
      "parcel_number": "8901000485",
      "property_id": "100d76300f9fdf41",
      "property_type": "House"
    },
    {
      "address": "11032 20 Avenue NE",
      "assessment_improvement_value": 231000,
      "assessment_land_value": 632000,
      "assessment_value": 863000,
      "assessment_year": 2025,
      "parcel_number": "8901001296",
      "property_id": "1026d02cc160a1f7",
      "property_type": "House"
    },
    {
      "address": "11751 20 Avenue NE",
      "assessment_improvement_value": 102000,
      "assessment_land_value": 590000,
      "assessment_value": 692000,
      "assessment_year": 2025,
      "parcel_number": "6798100010",
      "property_id": "1065eed068489477",
      "property_type": "House"
    },
    {
      "address": "11014 15 Avenue NE",
      "assessment_improvement_value": 620000,
      "assessment_land_value": 406000,
      "assessment_value": 1026000,
      "assessment_year": 2025,
      "parcel_number": "8901000328",
      "property_id": "109b373710e363b0",
      "property_type": "House"
    }
  ],
  "error": "",
  "pagination": {
    "current_page": 1,
    "has_next_page": true,
    "has_previous_page": false,
    "page_total": 38292
  },
  "price_quote": false,
  "result_total": 191460,
  "time_ms": 24,
  "ui_info": {
    "city": "Seattle",
    "city_id": "6a23eb9e5bf4545c",
    "city_link": "us/wa/seattle",
    "city_slug": "seattle",
    "country": "United States",
    "country_abbreviation": "US",
    "country_abbreviation_id": "c148472ce4bd39d",
    "country_abbreviation_link": "us",
    "country_slug": "united_states",
    "province": "Washington",
    "province_abbreviation": "WA",
    "province_abbreviation_id": "bd83526ad9c0e644",
    "province_abbreviation_link": "us/wa",
    "province_slug": "washington"
  }
}

Divide the land value by the total in your own code and you have the land share of every property, which is the number most of the uses below turn on.

Market-level land values in one call

The aggregate endpoint returns one number for a whole market. Median assessed land value across Vancouver:

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

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

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

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

    return data;
}

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

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

Run it per community and you have a land value map of a city without pulling a single row.

What the split is good for

Redevelopment screening. A property whose land carries almost all of its assessed value is a property whose building is not holding much value. On a lot zoned for more, that is a redevelopment candidate. Developers and land assemblers screen for a high land share, a low improvement value and the zoning field together.

Insurance. The building is what burns. The land does not need rebuilding. The improvement value is not a replacement cost estimate, but it is a far better starting point for a coverage sanity check than a total that mixes in the land.

Tax appeals. An appeal that turns on an inflated land rate, or on a building assessed as if it were newer than it is, is easier to argue when each part can be compared against the neighbours separately.

Lending and portfolio monitoring. Land and buildings move differently. Land tends to carry the market cycle and buildings depreciate. A book that knows its land share knows which part of its collateral is doing what.

Appraisal. The split is the starting point for land residual and extraction work, and parcel_number lets an appraiser find the same property in the authority's own records.

Parcel numbers

parcel_number is the assessing authority's own identifier for the property. Depending on the place it is called a roll number, a parcel number, an account number or a property identification number. Use it to find the property in the authority's records, to match against a file the authority gave you, or to cite it in a report.

Two things to know. It is text, because the leading zeros and punctuation are part of it, so filter on it with _eq rather than a number comparison. And it is not unique across places, and where one roll record covers several addresses, each of them carries the same number. The Houski property_id is the key that is unique and stable. The parcel number is the bridge to someone else's system.

Coverage

These three fields exist only where the assessing authority publishes them, so coverage is wide but uneven. The land and improvement split is published across much of the United States and in parts of Canada. Parcel numbers cover a wider set of places, including several countries beyond North America. Before you build a workflow around any of them, run a count aggregation in your own market with the field filtered to a value, and you will know exactly how much of the city carries it.

Getting started

  1. Sign up for API access
  2. Pull the split for your city with the query above
  3. Count the coverage in your market with one aggregate call
  4. Compute the land share in your own code and rank properties by it
  5. Read the full descriptions in the fields reference

Most fields cost a tenth of a cent per field per property, each aggregation value costs one cent, and there is a 99 dollar monthly minimum. Details on the pricing page.


A total tells you what a property is assessed at. The parts tell you why. Explore the API or browse the datasets.