Price per square foot
There are three price per square foot figures in a response: Zillow's own pricePerSquareFoot, and two that PropertiesAPI calculates from the returned price, Zestimate and living area.
| Field | Type |
|---|---|
data.pricePerSquareFoot | number or null |
data.calculated.price_per_sqft | number or null |
data.calculated.zestimate_per_sqft | number or null |
Fields under data.calculated are calculated by PropertiesAPI from the other fields in the same response. They are not Zillow estimates.
What it means
pricePerSquareFoot is Zillow's figure, a whole number. For a listed home it is the price over the living area. For a home that isn't listed, our recorded lookups show it is based on the Zestimate instead, because there is no price.
calculated.price_per_sqft is price divided by livingArea, rounded to cents, and only when price is a sale or asking price. It is null for rentals, where price is a monthly rent, and for homes that aren't listed.
calculated.zestimate_per_sqft is the Zestimate divided by livingArea. Comparing it with price_per_sqft shows how the asking price sits against Zillow's estimate per square foot. All calculated figures are plain arithmetic on fields in the same response, not estimates.
Recorded example
{
"homeStatus": "FOR_SALE",
"price": 400000,
"livingArea": 1556,
"pricePerSquareFoot": 257,
"calculated": {
"price_per_sqft": 257.07,
"zestimate_per_sqft": 259.06
}
}{
"homeStatus": "OTHER",
"price": null,
"zestimate": 1032400,
"livingArea": 1280,
"pricePerSquareFoot": 807,
"calculated": {
"price_per_sqft": null,
"zestimate_per_sqft": 806.56
}
}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
- livingArea is missing or zero, so there is nothing to divide by.
- price_per_sqft: the home is a rental or isn't listed, or there is no price.
- zestimate_per_sqft: Zillow shows no Zestimate for the home.
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 | {pricePerSquareFoot, calculated: (.calculated | {price_per_sqft, zestimate_per_sqft})}'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"]
c = home["calculated"]
print("Zillow:", home["pricePerSquareFoot"], "| price/sqft:", c["price_per_sqft"], "| Zestimate/sqft:", c["zestimate_per_sqft"])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 { price_per_sqft, zestimate_per_sqft } = home.calculated;
console.log({ zillow: home.pricePerSquareFoot, price_per_sqft, zestimate_per_sqft });Common mistakes
- Mixing pricePerSquareFoot across statuses. On an off-market home it reflects the Zestimate, not a price.
- Computing price per square foot for a rental from its monthly rent and comparing it with sale homes.
- Expecting the calculated figure to equal Zillow's exactly. Zillow rounds to whole dollars; the calculated value keeps cents.
Related
- livingArea and lotSize
- Price vs Zestimate
- price and currency
- Every field of the property endpoint
- Guide: Build a Property Research Dashboard with Python
- 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.
Price per square foot questions
Why do pricePerSquareFoot and price_per_sqft differ slightly?+
Zillow rounds to a whole number; PropertiesAPI keeps two decimals.
Why is price_per_sqft null for a rental?+
A rental's price is a monthly rent, so a sale price per square foot doesn't apply.
Are calculated fields Zillow data?+
No. PropertiesAPI calculates them from the returned fields. They are not Zillow estimates.