priceHistory

priceHistory is the list of past events on the home's Zillow page: listings, price changes, pending sales, removals and sales, each with a date and a price.

FieldType
data.priceHistoryarray of { date, event, price, pricePerSquareFoot, priceChangeRate, source }

What it means

Each entry has date (YYYY-MM-DD), event, price, pricePerSquareFoot, priceChangeRate and source. The list is newest first, the order Zillow shows it in.

event is Zillow's wording. In our recorded lookups the values were Listed for sale, Listed for rent, Price change, Pending sale, Contingent, Listing removed and Sold. Match them case-insensitively and keep unknown values instead of dropping them.

priceChangeRate is a fraction, not a percent: a small negative number means a price cut of that share. source names who reported the event, usually the MLS or the brokerage. A home's history can span many years and several separate listings.

Recorded example

Recorded lookup of a home for sale
{
  "priceHistory": [
    {
      "date": "2026-10-15",
      "event": "Price change",
      "price": 400000,
      "pricePerSquareFoot": 257,
      "priceChangeRate": 0.012658227848101266,
      "source": "Unlock MLS"
    },
    {
      "date": "2026-08-25",
      "event": "Price change",
      "price": 395000,
      "pricePerSquareFoot": 254,
      "priceChangeRate": -0.05952380952380952,
      "source": "eXp Realty"
    },
    {
      "date": "2026-07-30",
      "event": "Listed for sale",
      "price": 420000,
      "pricePerSquareFoot": 270,
      "priceChangeRate": 0,
      "source": "eXp Realty"
    }
  ]
}

Values are copied from recorded lookups of public Zillow pages, with the other fields of data left out; long lists are cut to their first entries and long text to its opening words. They show the shape and typical values, not today's data for these homes.

When it is null

  • The array is empty, not null, when the page shows no history. Apartment building rentals had none in our recorded lookups.
  • Inside an event, price is null when the price wasn't shown, for example a Listing removed event or a sale whose price isn't disclosed.

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 | {priceHistory}'
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"]
for e in home["priceHistory"]:  # newest first
    rate = e["priceChangeRate"]
    pct = None if rate is None else round(rate * 100, 2)
    print(e["date"], e["event"], e["price"], pct)
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();
for (const e of home.priceHistory) { // newest first
  const pct = e.priceChangeRate == null ? null : +(e.priceChangeRate * 100).toFixed(2);
  console.log(e.date, e.event, e.price, pct);
}

Common mistakes

  • Assuming oldest first. Sort by date if you need chronological order, and keep the original order for events on the same day.
  • Multiplying priceChangeRate by one hundred twice. It is already a fraction; multiply once to get a percent.
  • Reading the first Sold event as the latest sale without checking the order. calculated.last_sale_price and last_sale_date already pick the most recent one.

Zillow is a trademark of Zillow, Inc. PropertiesAPI is an independent service and is not affiliated with, endorsed by or sponsored by Zillow.

priceHistory questions

Is price history included in every lookup?+

Yes, as data.priceHistory, at no extra cost. It can be empty.

How far back does it go?+

As far back as the home's Zillow page shows. Some homes show decades of events, others only the current listing.

Can I get price history for every home in a ZIP code?+

No. The API looks up one known home per request; for many homes, send a list to the batch endpoint.