Rent-to-price ratio and gross yield

These calculated fields compare a year of rent with the home's value: the rent-to-price ratio, which value it used, and the same ratio as a gross yield percent.

FieldType
data.calculated.rent_to_price_rationumber or null
data.calculated.rent_to_price_basis"price", "zestimate" or null
data.calculated.gross_yield_pctnumber 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

rent_to_price_ratio is the Rent Zestimate times twelve, divided by the price. When there is no sale or asking price, PropertiesAPI divides by the Zestimate instead, and rent_to_price_basis says which one was used: price or zestimate.

gross_yield_pct is the same ratio times one hundred, rounded to two decimals. It is a gross figure: before vacancy, taxes, insurance, HOA fees, repairs and financing.

Both use Zillow's figures as inputs and plain arithmetic, so they are a quick screen across homes you already looked up, not a forecast of returns. For rentals, price is the asking rent, so the ratio always uses the Zestimate there.

Because the inputs are Zillow's estimates, the ratio shares their gaps. Homes without a Rent Zestimate, such as land, small multi-family buildings and some new builds, get no ratio at all, and a recorded Manhattan condo with neither estimate came back with all three fields null.

Recorded example

Recorded lookup of a home for sale
{
  "price": 400000,
  "rentZestimate": 3090,
  "calculated": {
    "rent_to_price_ratio": 0.0927,
    "rent_to_price_basis": "price",
    "gross_yield_pct": 9.27
  }
}
Recorded lookup of a home that isn't listed
{
  "price": null,
  "zestimate": 1032400,
  "rentZestimate": 8050,
  "calculated": {
    "rent_to_price_ratio": 0.0936,
    "rent_to_price_basis": "zestimate",
    "gross_yield_pct": 9.36
  }
}

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

  • There is no Rent Zestimate for the home.
  • There is neither a sale or asking price nor a Zestimate to divide by.
  • rent_to_price_basis is null exactly when the ratio is null.

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 | {calculated: (.calculated | {rent_to_price_ratio, rent_to_price_basis, gross_yield_pct})}'
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"]
if c["gross_yield_pct"] is not None:
    print(f"gross yield {c['gross_yield_pct']}% on {c['rent_to_price_basis']}")
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 { gross_yield_pct, rent_to_price_basis } = home.calculated;
if (gross_yield_pct != null) console.log(`gross yield ${gross_yield_pct}% on ${rent_to_price_basis}`);

Common mistakes

  • Mixing ratios with different bases in one ranking. Group or filter on rent_to_price_basis.
  • Reading gross yield as net yield. Subtract costs before comparing with other investments.
  • Treating the result as advice. It is arithmetic on Zillow's estimates and the listing price, provided as-is.

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

Rent-to-price ratio and gross yield questions

How is gross yield calculated?+

A year of the Rent Zestimate divided by the price, or by the Zestimate when there is no price, times one hundred.

Why does the basis say zestimate?+

The home has no sale or asking price, or it is a rental, so the Zestimate was the denominator.

Is this a cap rate?+

No. A cap rate uses net operating income; gross yield ignores every cost.