crewai-zillapi
CrewAI tools for Zillapi, a REST API for Zillow property data.
Give a CrewAI agent the ability to look up a property by address, zpid or Zillow URL, pull valuations, price history, tax history, schools, photos and comparable homes, and search for sale, for rent or sold listings inside a geographic area.
Install
pip install crewai-zillapi
Get an API key
Create a key at zillapi.com. You get 100 credits at signup, no card, one time. Paid plans start at $5 per month. See pricing.
Set the key in your environment:
export ZILLAPI_KEY="zk_your_key_here"
Quick start
from crewai import Agent
from crewai_zillapi import (
ZillapiPropertyByAddressTool,
ZillapiPropertyDetailTool,
ZillapiListingSearchTool,
)
analyst = Agent(
role="Real estate analyst",
goal="Answer questions about properties and local markets with real data",
backstory="You research homes and neighborhoods using live Zillow data.",
tools=[
ZillapiPropertyByAddressTool(),
ZillapiPropertyDetailTool(),
ZillapiListingSearchTool(),
],
)
Use a single tool directly:
import json
from crewai_zillapi import ZillapiPropertyByAddressTool
result = json.loads(
ZillapiPropertyByAddressTool().run(address="350 5th Ave, New York NY 10118")
)
print(result["data"]["zpid"])
Tools
| Tool | What it does | Credit cost |
|---|---|---|
ZillapiPropertyByAddressTool |
Resolve a street address to a full property record | 3 per successful call |
ZillapiPropertyByZpidTool |
Full property record for a known zpid | 1 per successful call |
ZillapiPropertyDetailTool |
One detail section for a zpid | 1 per successful call |
ZillapiPropertyByUrlTool |
Resolve a Zillow URL to a property or building | 1 per record returned |
ZillapiListingSearchTool |
Search listings inside a bounding box | 1 per listing returned |
ZillapiJobTool |
Poll an async job and read its results | 0, free |
ZillapiAccountTool |
Plan, remaining credit balance, recent usage | 0, free |
Failed calls are never charged.
ZillapiPropertyDetailTool sections: zestimate, price-history, tax-history, schools,
photos, agent, nearby, open-houses, facts.
Searching an area
A listing search needs a real bounding box in decimal degrees. A place name on its own is not accepted, so convert the place to coordinates first.
import json
from crewai_zillapi import ZillapiListingSearchTool
result = json.loads(
ZillapiListingSearchTool().run(
west=-73.99, south=40.74, east=-73.98, north=40.75,
status="for_sale", beds_min=2, price_max=2_000_000, max_items=25,
)
)
Because a search costs 1 credit per listing returned, keep max_items tight. Asking for more
than 50 listings runs the search asynchronously and returns a job_id, which you poll with
ZillapiJobTool until its status is succeeded, then read with action="results".
Response shape
Every tool returns a JSON string with a stable envelope, and the tools never raise from execution. An agent can always parse the result.
{
"success": true,
"data": { "zpid": "1234567", "price": 1250000 },
"request_id": "req_abc123"
}
{ "success": false, "error": { "code": "invalid_filters", "message": "..." } }
data is the payload itself, so you never have to reach through a second wrapper.
request_id is worth logging if you need to ask about a specific call. List endpoints
also return a meta object alongside data.
Match on code, never on message.
| Code | Meaning |
|---|---|
missing_api_key |
ZILLAPI_KEY is not set |
invalid_api_key |
The key was rejected |
out_of_credits |
No credits left, top up to continue |
invalid_filters |
A search was sent without a bounding box |
invalid_search_url |
The Zillow search URL was not usable |
missing_input |
A required argument was absent |
not_found |
Nothing matched the address, zpid or URL |
job_not_ready |
The async job has not finished yet |
rate_limited |
Too many requests, respect Retry-After |
service_unavailable |
The data provider is temporarily unavailable |
timeout |
The request timed out |
network |
The API could not be reached |
Coverage
These tools cover the synchronous, agent friendly surface of the API. The full REST API also offers batch property jobs, chained search with details, building unit extraction and outbound webhooks. See the API documentation and the OpenAPI spec.
Zillapi is also available as an MCP server for MCP compatible clients.
Notes
Zillapi is an independent service and is not affiliated with, endorsed by, or sponsored by Zillow, Inc. Zillow is a trademark of its respective owner. Use of the data is subject to the Zillapi terms.
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file crewai_zillapi-0.1.1.tar.gz.
File metadata
- Download URL: crewai_zillapi-0.1.1.tar.gz
- Upload date:
- Size: 13.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4df9dcd1ce08986667e024c0284152a2ee51a421989a67f3632dcef2f0ef6957
|
|
| MD5 |
6755c8d8e7f65be2f9c96fcab0e2e15a
|
|
| BLAKE2b-256 |
bb08c6e76d511008695f8176a4bb0b81be9a2bf4d27cb7d2f8ffacaf144bb0ff
|
File details
Details for the file crewai_zillapi-0.1.1-py3-none-any.whl.
File metadata
- Download URL: crewai_zillapi-0.1.1-py3-none-any.whl
- Upload date:
- Size: 12.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
67856712c712a9a975b253010df09e4b65f1b42f5e88877129876e62f87062c3
|
|
| MD5 |
a412c94e2e954e263f3158271c7be4e0
|
|
| BLAKE2b-256 |
ada7086e8eddbd0c3054f63247f1aa191fb9cd263414cb25a1a7763d15952a46
|