scrapedAt and data freshness

scrapedAt is the moment the home's Zillow page was read, as an ISO timestamp in UTC. It tells you how current every other field in the response is.

FieldType
data.scrapedAtstring (ISO 8601) or null

What it means

Every value in a response is a reading of the public page at one moment: prices, statuses, day counts and estimates all change later. scrapedAt is that moment, so store it next to anything you keep.

The response's meta block adds two more signals. meta.cached is true when the response came from the cache instead of a live lookup, and meta.fetched_at is when PropertiesAPI fetched it. The x-cache header says HIT or MISS as well.

A cached response carries the original scrapedAt, so you can always tell how old the reading is. To get a newer reading, wait until the cache window has passed and look the home up again.

In a batch request each item carries its own meta, so one batch can mix live readings and cached ones. Read scrapedAt and meta.cached per item, not once per batch, and keep them with each stored row.

Recorded example

Recorded lookup of a home for sale
{
  "scrapedAt": "2026-10-19T19:02:18.515Z"
}

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

  • scrapedAt was present on every recorded lookup. It is null only if the collected record carries no timestamp.

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 | {scrapedAt}'
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"]
from datetime import datetime, timezone
read_at = datetime.fromisoformat(home["scrapedAt"].replace("Z", "+00:00"))
age_h = (datetime.now(timezone.utc) - read_at).total_seconds() / 3600
print(f"read {age_h:.1f} hours ago | cached: {r.json()['meta']['cached']}")
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 ageHours = (Date.now() - Date.parse(home.scrapedAt)) / 36e5;
console.log(`read ${ageHours.toFixed(1)} hours ago`);

Common mistakes

  • Using the time your code received the response as the data time. A cache hit can be hours older.
  • Comparing daysOnZillow or page views across lookups without their scrapedAt.
  • Parsing the timestamp as local time. It is UTC, ending in Z.

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

scrapedAt and data freshness questions

How fresh is the data?+

As fresh as scrapedAt says. A live lookup reads the page when you ask; a cache hit returns an earlier reading.

Do cache hits cost credits?+

No. Repeat lookups of the same home within the cache window come from cache and are free.

Is scrapedAt in UTC?+

Yes. It is an ISO timestamp ending in Z.