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 Python and Node.js clients install from this site: each section below has the command, and the SHA-256 checksums are in SHA256SUMS. They aren't on PyPI or the npm registry. The n8n node and the Zapier app aren't published yet; until they are, call the REST API from n8n or Zapier as shown below.

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.
  • Type every documented field, data.calculated and meta.completeness included. An apartment building has zpid null, and each result's id is its zpid or, for a building, its detailUrl.
  • Raise a typed error for each API error code, for example an address-ambiguous error that carries Zillow's closest match. A failed batch item gets the same class as the same error on a single lookup.
  • Retry only the errors that come with a retry-after wait (rate limits, busy, the daily caps), after that wait, and stop waiting at a cap you set. Other errors are raised at once.
  • Track the credits you have left from the X-Credits-Remaining and X-Credits-Prepaid-Remaining headers, on every response and every error, with the rate limit and any spending limit.
  • 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

Package propertiesapi, Python 3.8+, typed. Install the wheel from this site:

Terminal
pip install https://propertiesapi.com/sdk/propertiesapi-0.2.0-py3-none-any.whl

The source distribution is propertiesapi-0.2.0.tar.gz. To pin the wheel, add its URL with --hash=sha256: and the checksum from SHA256SUMS to your requirements file.

Python
from propertiesapi import PropertiesAPI, AddressAmbiguousError

client = PropertiesAPI()  # reads PROPERTIESAPI_KEY

home = client.get_property(url="https://www.zillow.com/homedetails/2640-Steiner-St-San-Francisco-CA-94115/15073305_zpid/")
print(home.data["price"], home.data["zestimate"], client.credits_remaining)

try:
    home = client.get_property(address="2640 Steiner St, San Francisco, CA 94115")
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(["2640 Steiner St, San Francisco, CA 94115", {"zpid": "2064142765"}])
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

Package propertiesapi, Node 18+, ESM and CommonJS, with TypeScript types included. Install the tarball from this site:

Terminal
npm install https://propertiesapi.com/sdk/propertiesapi-0.2.0.tgz

npm records the URL in your package.json and the tarball's integrity hash in your lockfile. The SHA-256 checksum is in SHA256SUMS.

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/2640-Steiner-St-San-Francisco-CA-94115/15073305_zpid/" });
console.log(home.data.price, home.data.zestimate, client.creditsRemaining);

try {
  await client.getProperty({ address: "2640 Steiner St, San Francisco, CA 94115" });
} catch (e) {
  if (e instanceof AddressAmbiguousError) console.log("Closest match:", e.candidate?.detailUrl);
  else throw e;
}

const batch = await client.getProperties(["2640 Steiner St, San Francisco, CA 94115", { zpid: "2064142765" }]);
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 for the address is a different home. candidate.detailUrl is its Zillow link.
409zpid_mismatchZpidMismatchErrorZillow answered the link or zpid with a different home. Not an address problem; both classes are a ConflictError.
429rate_limited, daily_share_exhausted, env_key_daily_capRateLimitedError, DailyShareExhaustedErrorToo many requests, or today's lookups are used. retry_after (Python) or retryAfter (Node.js) has the wait.
502upstream_error and the other upstream codesUpstreamErrorThe live lookup failed upstream. Not billed and not retried by the client.
503upstream_busy, live_lookups_capped, store_unavailableServiceUnavailableErrorLive lookups are busy or paused. Honor the retry wait. Other 503 codes mean live lookups are off on our side and aren't retried.
504upstream_timeout, batch_deadline, request_timeoutGatewayTimeoutErrorThe lookup or the request took too long. Not billed; safe to retry.

A failed item in a batch doesn't raise: each result has an ok flag and, when it failed, the same typed error, with the status of its code. Every error also has retryable (whether to retry after retry_after / retryAfter) and the response's credits.

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.

Self-hosted n8n can also install a community node by hand with npm in its nodes folder (~/.n8n/nodes), and npm accepts a tarball URL there as well as a package name. The node isn't hosted here yet. Until then, use n8n's built-in HTTP Request node (step by step in the Zillow API with n8n guide):

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, the calculated fields and the credits you have left, with an id that is the zpid or, for an apartment building, its Zillow link.

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 6 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.

Guides by language and tool

Until the packages are published, these guides call the REST API directly: all integrations, curl, PHP, Ruby, Go, Java, C#, Rust, Excel, Airtable, Zapier, Make and the MCP server.

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.