SDKs and integrations
Official clients for Python and Node.js, an n8n node and a Zapier app. They wrap the same two endpoints as the REST API, with the same key, credits and limits.
Status: the packages are built and tested, and are coming to PyPI, npm and Zapier. None of them is published yet. Until then, call the REST API directly; each section below shows how.
What the clients do
- Look up one property by Zillow link, zpid or address, or many in one call. Lists longer than one batch request are split for you (up to 50 items per request) and come back in your order.
- Raise a typed error for each API error code, for example an address-ambiguous error that carries Zillow's closest match.
- Retry rate-limit and busy responses after the server's
retry-afterwait, and stop waiting at a timeout you set. - Track the credits you have left from the
X-Credits-Remainingheader on every response. - No dependencies: the Python client uses only the standard library, the Node.js client uses the built-in fetch.
Get a key
Sign in and create a key on your dashboard. The clients read it from the PROPERTIESAPI_KEY environment variable, or you can pass it in. Keep the key on your server.
Python
Coming to PyPI. Not published yet: the install command below works once it is.
Package propertiesapi, Python 3.8+, typed.
pip install propertiesapifrom propertiesapi import PropertiesAPI, AddressAmbiguousError
client = PropertiesAPI() # reads PROPERTIESAPI_KEY
home = client.get_property(url="https://www.zillow.com/homedetails/1600-Main-St-Austin-TX-78701/0000000_zpid/")
print(home.data["price"], home.data["zestimate"], client.credits_remaining)
try:
home = client.get_property(address="1600 Main St, Austin, TX 78701")
except AddressAmbiguousError as e:
# Zillow's closest match is a different home; look it up by its link if it's the one you meant
home = client.get_property(url=e.candidate["detailUrl"])
batch = client.get_properties(["1600 Main St, Austin, TX 78701", {"zpid": "11026031"}])
for item in batch.results:
print(item.index, item.data["address"] if item.ok else item.error.code)Options: timeout, batch_timeout, max_retries and max_retry_wait. client.request() calls any endpoint with the same auth, retries and errors.
Node.js and TypeScript
Coming to npm. Not published yet: the install command below works once it is.
Package propertiesapi, Node 18+, ESM and CommonJS, with TypeScript types included.
npm install propertiesapiimport { PropertiesAPI, AddressAmbiguousError } from "propertiesapi";
const client = new PropertiesAPI(); // reads PROPERTIESAPI_KEY
const home = await client.getProperty({ url: "https://www.zillow.com/homedetails/1600-Main-St-Austin-TX-78701/0000000_zpid/" });
console.log(home.data.price, home.data.zestimate, client.creditsRemaining);
try {
await client.getProperty({ address: "1600 Main St, Austin, TX 78701" });
} catch (e) {
if (e instanceof AddressAmbiguousError) console.log("Closest match:", e.candidate?.detailUrl);
else throw e;
}
const batch = await client.getProperties(["1600 Main St, Austin, TX 78701", { zpid: "11026031" }]);
for (const r of batch.results) console.log(r.index, r.ok ? r.data.address : r.error.code);CommonJS works too: const { PropertiesAPI } = require("propertiesapi"). Options: timeoutMs, batchTimeoutMs, maxRetries, maxRetryWaitMs and a custom fetch.
Errors in the clients
Every error has status, code, message and details, as in the error reference. The main classes:
| Status | code | Class | When |
|---|---|---|---|
| 401 | missing_api_key, invalid_api_key, revoked_api_key | AuthenticationError | The key is missing, unknown or revoked. |
| 402 | credits_exhausted, spend_limit_reached | CreditsExhaustedError, SpendLimitReachedError | Your lookups are used up, or your monthly spending limit is reached. The error carries the dashboard link. |
| 404 | not_found | NotFoundError | No Zillow property matches the input. |
| 409 | address_ambiguous | AddressAmbiguousError | Zillow's closest match is a different home. candidate.detailUrl is its Zillow link. |
| 429 | rate_limited, daily_share_exhausted | RateLimitedError, DailyShareExhaustedError | Too many requests, or today's Free lookups are used. retry_after (Python) or retryAfter (Node.js) has the wait. |
| 503 | upstream_busy, live_lookups_capped, store_unavailable | ServiceUnavailableError | Live lookups are busy or paused. Honor the retry wait. |
A failed item in a batch doesn't raise: each result has an ok flag and, when it failed, the same typed error.
n8n
Coming to npm. Not published yet: the install command below works once it is.
Community node n8n-nodes-propertiesapi, with a PropertiesAPI credential (your API key) and two operations: Get Property (by link, zpid or address) and Batch Lookup (one lookup per input item, each output paired with its input). Once published, install it in n8n from Settings > Community Nodes > Install with the name n8n-nodes-propertiesapi.
Until then, use n8n's built-in HTTP Request node:
Method: GET
URL: https://api.propertiesapi.com/v1/zillow/property
Query: url = <a Zillow link> (or zpid, or address)
Header: x-api-key = <your key>
Timeout: 120000 msZapier
Coming to Zapier. Not published yet: the app isn't listed in Zapier until it is.
The PropertiesAPI app connects with your API key and adds an action, Look Up a Zillow Property (by link, zpid or address), and a search, Find Property by Address. Each returns flat fields such as price, Zestimate, beds, baths and the credits you have left.
Until then, if your Zapier plan includes Webhooks by Zapier, add a Webhooks step:
Event: GET
URL: https://api.propertiesapi.com/v1/zillow/property
Query: address = <an address> (or url, or zpid)
Headers: X-API-Key = <your key>A live lookup takes typically 8 seconds, up to about 20 seconds, and Zapier limits how long a step can run. If Zapier stops waiting, the lookup can still finish and be cached; running the step again soon after returns it from the cache.
Credits and limits
The SDKs and integrations call the same API, so billing is the same: 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. Failed lookups cost nothing. Set a client timeout of at least 120 seconds: an occasional lookup takes longer. The clients' default timeouts already allow for that.
Support
Questions or bugs: support@propertiesapi.com. Also see the quickstart, the OpenAPI spec and Use with Claude (MCP).
Data is provided as-is, as shown on public Zillow pages, without any guarantee of accuracy or completeness. n8n is a trademark of n8n GmbH; Zapier is a trademark of Zapier, Inc. Zillow is a trademark of Zillow, Inc. PropertiesAPI is an independent service and is not affiliated with, endorsed by or sponsored by Zillow.