Zillow API for real estate agents
Clients send you Zillow links all day. Turn each link into a one-page brief with the price history, tax history, days on market and price cuts, so you walk into the conversation with the same facts your client is looking at.
The job
Buyers shop on Zillow, so the conversation often starts with a link and a question: is this a good price? The facts that answer it are spread across the page: the listing's price changes, when it last sold and for how much, the tax history, how long it has been listed.
A small script or team tool can pull those facts from the link and lay them out the same way every time. It complements your MLS rather than replacing it: you get exactly what the client sees on Zillow, in a format you can paste into an email or a CMA appendix.
The workflow
- Start from the client's link. Paste the Zillow link the client sent. A link names the exact home, so there is no address matching to get wrong.
- Pull the listing story. priceHistory lists the listing, price change and sale events newest first; calculated.last_price_change and calculated.price_drops_count summarize the current listing.
- Add the carrying costs. taxHistory, taxAnnualAmount and monthlyHoaFee give the buyer a first view of what the home costs to own.
- Send the brief. Format it for an email or a note in your CRM. Link back to the Zillow page with detailUrl so the client can see the source.
A listing brief from a Zillow link
Node.js (built-in fetch). Prints a short brief you can paste into an email. Swap console.log for your CRM's note API.
const BASE = "https://api.propertiesapi.com/v1";
const link = process.argv[2]; // a zillow.com/homedetails link from your client
const url = new URL(`${BASE}/zillow/property`);
url.searchParams.set("url", link);
const res = await fetch(url, { headers: { "x-api-key": process.env.PROPERTIESAPI_KEY }, signal: AbortSignal.timeout(120_000) });
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const h = body.data;
const c = h.calculated;
const money = (n) => (n == null ? "not shown" : "$" + n.toLocaleString("en-US"));
console.log(`${h.address} (${h.statusText ?? h.homeStatus})`);
console.log(`Asking ${money(h.price)}, Zestimate ${money(h.zestimate)}, ${h.beds ?? "?"} bd / ${h.baths ?? "?"} ba, ${h.livingArea ?? "?"} sqft`);
console.log(`On the market ${c.days_on_market ?? "n/a"} days, ${c.price_drops_count ?? 0} price cuts`);
if (c.last_price_change) console.log(`Last change ${c.last_price_change.date}: ${money(c.last_price_change.previous_price)} to ${money(c.last_price_change.price)}`);
if (c.last_sale_price) console.log(`Last sold ${c.last_sale_date} for ${money(c.last_sale_price)}`);
console.log(`Taxes ${money(h.taxAnnualAmount)} a year, HOA ${money(h.monthlyHoaFee)} a month`);
for (const e of h.priceHistory.slice(0, 5)) console.log(` ${e.date} ${e.event} ${money(e.price)}`);
console.log(h.detailUrl);Fields that matter here
| Field | Why it matters |
|---|---|
| priceHistory | Listing, price change, pending and sold events as Zillow shows them, newest first. |
| calculated.last_price_change | The latest price change in the current listing, with the previous price and the change. |
| calculated.last_sale_price | The most recent disclosed sale price from the history, with its date. |
| taxHistory | Tax paid and assessed value by year. |
| agentName, brokerName | The listing agent and brokerage as shown on the listing, useful when you call the listing side. |
| photos | Photo URLs as published on the listing. Link to them; don't re-host them. |
What it won't do
- It isn't MLS data and doesn't replace your MLS. It returns what the public Zillow page shows.
- No comps search: it won't find nearby sales for a CMA. Look up the comps you choose, one by one or in a batch.
- Zestimate is Zillow's estimate, shown when Zillow has one. Don't present it as an appraisal.
- No owner or contact data for homes that aren't listed.
Real estate agents: questions
Can I put this data on my website?+
Look up and show data responsibly: link to the Zillow page, don't re-host photos, and check the terms that apply to your use. Many agents use it for internal prep and client emails.
Does this work for rentals?+
Yes. For a rental listing, price is the monthly rent, and the rent Zestimate is included when Zillow shows one.
What does one brief cost?+
Zillow links and addresses cost the same: 1 credit per successful lookup. Repeat lookups of the same home within 24 hours come from our cache and are free.
Do I have to write code?+
No. The Google Sheets formulas return the same fields from a link, and Zapier or Make can run the lookup when a client fills in a form.
Try it on your own list
50 free lookups, no card, no approval.
Zillow is a trademark of Zillow, Inc. PropertiesAPI is an independent service and is not affiliated with, endorsed by or sponsored by Zillow.