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.

FieldType
data.pricePerSquareFootnumber or null
data.calculated.price_per_sqftnumber or null
data.calculated.zestimate_per_sqftnumber 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

Recorded lookup of a home for sale
{
  "homeStatus": "FOR_SALE",
  "price": 400000,
  "livingArea": 1556,
  "pricePerSquareFoot": 257,
  "calculated": {
    "price_per_sqft": 257.07,
    "zestimate_per_sqft": 259.06
  }
}
Recorded lookup of a home that isn't listed
{
  "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 and jq
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})}'
Python
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"])
JavaScript (Node)
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.

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.