Property tax: taxAnnualAmount, taxAssessedValue, propertyTaxRate, parcelId
Four fields summarise the home's property tax: the yearly tax amount, the assessed value, the tax rate as a percent, and the county parcel number.
| Field | Type |
|---|---|
data.taxAnnualAmount | number or null |
data.taxAssessedValue | number or null |
data.propertyTaxRate | number or null (percent) |
data.parcelId | string or null |
What it means
taxAnnualAmount is the yearly property tax shown in the listing's facts, in whole dollars in our recorded lookups. taxAssessedValue is the assessed value behind it. On a recorded Austin listing both matched the newest year of taxHistory to the dollar.
propertyTaxRate is a percent: a value a little under one and a half means about one and a half percent of value a year. In our recorded lookups homes in the same city carried the same rate, so treat it as the area rate Zillow uses for its payment estimate, not a figure computed from this home's own bill.
parcelId is the county's parcel number, also called the APN. Its format depends on the county: some use short numbers, others long strings with leading zeros. It is the key to use when you match the home with county records you already have.
Recorded example
{
"taxAnnualAmount": 12241,
"taxAssessedValue": 598179,
"propertyTaxRate": 1.46,
"parcelId": "229286"
}{
"taxAnnualAmount": null,
"taxAssessedValue": null,
"propertyTaxRate": 0,
"parcelId": null
}Values are copied from recorded lookups of public Zillow pages, with the other fields of data left out. They show the shape and typical values, not today's data for these homes.
When it is null
- taxAnnualAmount and taxAssessedValue are usually null for sold and off-market homes, because they come from the listing's facts. Use taxHistory then.
- parcelId is null when the listing doesn't show one, which happened for a recorded New York condo.
- propertyTaxRate can come back as zero when Zillow shows no rate. A recorded Manhattan condo returned zero; treat it as unknown.
Read it in code
Send a Zillow link, a zpid or an address to GET /v1/zillow/property with your key in the x-api-key header, then read the field from data:
curl -sG "https://api.propertiesapi.com/v1/zillow/property" \
-H "x-api-key: $PROPERTIESAPI_KEY" \
--data-urlencode "url=https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/" \
| jq '.data | {taxAnnualAmount, taxAssessedValue, propertyTaxRate, parcelId}'import os
import requests
r = requests.get(
"https://api.propertiesapi.com/v1/zillow/property",
params={"url": "https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/"},
headers={"x-api-key": os.environ["PROPERTIESAPI_KEY"]},
timeout=120,
)
r.raise_for_status()
home = r.json()["data"]
tax, rate = home["taxAnnualAmount"], home["propertyTaxRate"]
if not rate: # None or zero: unknown
rate = None
print("annual tax:", tax, "| rate %:", rate, "| APN:", home["parcelId"])const url = "https://www.zillow.com/homedetails/1704-Shelbourne-Dr-Austin-TX-78752/29412761_zpid/";
const res = await fetch(
`https://api.propertiesapi.com/v1/zillow/property?url=${encodeURIComponent(url)}`,
{ headers: { "x-api-key": process.env.PROPERTIESAPI_KEY } },
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { data: home } = await res.json();
const rate = home.propertyTaxRate || null; // zero means unknown
console.log({ annualTax: home.taxAnnualAmount, ratePct: rate, apn: home.parcelId });Common mistakes
- Treating a propertyTaxRate of zero as a tax-free home.
- Storing parcelId as a number, which drops leading zeros and breaks matching.
- Dividing taxAnnualAmount by price to get the rate. Assessed value and price differ; use propertyTaxRate or the county's own rate.
Related
- taxHistory
- monthlyHoaFee
- price and currency
- Every field of the property endpoint
- Guide: Enrich a Property Address List with Python and Export to CSV
- All response fields
Zillow is a trademark of Zillow, Inc. PropertiesAPI is an independent service and is not affiliated with, endorsed by or sponsored by Zillow.
Property tax: taxAnnualAmount, taxAssessedValue, propertyTaxRate, parcelId questions
Is propertyTaxRate a percent or a fraction?+
A percent. A value near one and a half means about one and a half percent a year.
What is parcelId?+
The county's parcel number (APN) as the listing shows it, returned as a string.
Does the API return the owner from tax records?+
No. PropertiesAPI returns no owner or contact data for the property.