For rental analysis

Zillow rent data for rental analysis

Compare asking rents and rent Zestimates across the homes you track. Know which number you are looking at, how apartment buildings are handled, and when the rent field will be empty.

The job

Rental analysis mixes two kinds of numbers that look alike. On a rental listing, the price is the asking rent a landlord set. On a home for sale, the rent Zestimate is Zillow's estimate of what it could rent for. Treating them as the same column quietly skews every average.

PropertiesAPI keeps them apart: price is the monthly rent only when homeStatus is FOR_RENT, rentZestimate is always Zillow's estimate, and the calculated rent-to-price ratio says which denominator it used.

The workflow

  1. Split by status. Check homeStatus first. FOR_RENT means price is the asking rent; FOR_SALE means price is the asking price and the rent signal is the rent Zestimate.
  2. Handle apartment buildings. A zillow.com/apartments link returns the building: price, beds, baths and living area describe its lowest-priced unit available now, and zpid is null.
  3. Compute yield with its basis. calculated.gross_yield_pct uses the rent Zestimate over the price, or over the Zestimate when there is no sale price. calculated.rent_to_price_basis says which.
  4. Keep the gaps visible. When Zillow shows no rent Zestimate the field is null. Count those homes separately instead of averaging them in as zero.

Asking rent vs rent Zestimate table

Python with pandas. Builds one row per home with the right rent column filled for its status.

Python
import os, requests, pandas as pd

BASE = "https://api.propertiesapi.com/v1"
HEADERS = {"x-api-key": os.environ["PROPERTIESAPI_KEY"]}
links = [l.strip() for l in open("rentals.txt") if l.strip()][:50]

r = requests.post(f"{BASE}/zillow/batch", json={"items": links}, headers=HEADERS, timeout=320)
r.raise_for_status()

rows = []
for item in r.json()["data"]:
    if not item["ok"]:
        rows.append({"input": links[item["index"]], "error": item["error"]["code"]})
        continue
    h, c = item["data"], item["data"]["calculated"]
    for_rent = h["homeStatus"] == "FOR_RENT"
    rows.append({
        "address": h["address"], "status": h["homeStatus"], "beds": h["beds"], "sqft": h["livingArea"],
        "asking_rent": h["price"] if for_rent else None,
        "asking_price": None if for_rent else h["price"],
        "rent_zestimate": h["rentZestimate"],
        "gross_yield_pct": c["gross_yield_pct"], "yield_basis": c["rent_to_price_basis"],
        "building": h["zpid"] is None,
    })

df = pd.DataFrame(rows)
print(df.groupby("status")[["asking_rent", "rent_zestimate"]].describe())
print("no rent Zestimate:", df["rent_zestimate"].isna().sum())

Fields that matter here

Response fields for rental analysis
FieldWhy it matters
price (FOR_RENT)The monthly asking rent on a rental listing. For a building, the rent of its lowest-priced unit available now.
rentZestimateZillow's monthly rent estimate, when Zillow shows one, for rentals and homes for sale alike.
calculated.rent_to_price_ratio, rent_to_price_basisAnnual rent Zestimate over the price or the Zestimate, and which one was used.
unitFor a building, the unit the price describes.
beds, baths, livingAreaNormalize rents per bedroom or per square foot before you compare homes.

What it won't do

  • No rent comps search: you choose the homes to compare.
  • A building link returns one unit's rent (the lowest-priced available now), not every unit's.
  • Rent Zestimate is Zillow's estimate. PropertiesAPI doesn't estimate rents of its own.
  • Not for tenant screening or any FCRA-covered decision.

Rental analysis: questions

Is price the rent or the sale price?+

It depends on homeStatus. For FOR_RENT it is the monthly rent; for homes for sale it is the asking price; for sold homes it is the sale price when disclosed.

Why is rentZestimate null for some homes?+

Zillow doesn't show a rent Zestimate for every home. Treat null as unknown, not zero.

Can I get every unit in an apartment building?+

Not yet. A building link returns the building with its lowest-priced unit available now.

What does it cost to track a list of rentals?+

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. You start with 50 free lookups.

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.