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-after wait, and stop waiting at a timeout you set.
  • Track the credits you have left from the X-Credits-Remaining header 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.

Terminal (once published)
pip install propertiesapi
Python
from 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.

Terminal (once published)
npm install propertiesapi
JavaScript (ESM)
import { 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:

StatuscodeClassWhen
401missing_api_key, invalid_api_key, revoked_api_keyAuthenticationErrorThe key is missing, unknown or revoked.
402credits_exhausted, spend_limit_reachedCreditsExhaustedError, SpendLimitReachedErrorYour lookups are used up, or your monthly spending limit is reached. The error carries the dashboard link.
404not_foundNotFoundErrorNo Zillow property matches the input.
409address_ambiguousAddressAmbiguousErrorZillow's closest match is a different home. candidate.detailUrl is its Zillow link.
429rate_limited, daily_share_exhaustedRateLimitedError, DailyShareExhaustedErrorToo many requests, or today's Free lookups are used. retry_after (Python) or retryAfter (Node.js) has the wait.
503upstream_busy, live_lookups_capped, store_unavailableServiceUnavailableErrorLive 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:

n8n 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 ms

Zapier

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:

Webhooks by Zapier
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.