Zillow MCP Server
Pricing
from $50.00 / 1,000 properties
Zillow MCP Server
Zillow MCP server for AI agents — property and housing data. Real estate tools that search homes by ZIP code, search by Zillow URL, or look one up by address or zpid. Returns address, price, agent email and phone, Zestimate, schools, and price history. Connect Claude, Cursor or ChatGPT to /mcp.
Pricing
from $50.00 / 1,000 properties
Rating
0.0
(0)
Developer
Andrey Afanasenko
Maintained by CommunityActor stats
0
Bookmarked
49
Total users
12
Monthly active users
3 days ago
Last modified
Categories
Share
Connect Claude Desktop, Cursor, or ChatGPT to live Zillow listings and agent contacts via 3 narrow tools — search by ZIP, paste any Zillow URL, or look up a single property by ID. From $0.05 per property on paid plans, $0.08 on Free.
Same data and pricing as the parent Zillow Property & Agent Data Scraper — but exposed as Model Context Protocol tools so your AI agent picks the right one by intent. Beyond what Zillow's official API offers: full filter set, agent emails and phone numbers, photo galleries, price-history arrays, school ratings, and 70+ output columns per row.
What it does
This is a Model Context Protocol (MCP) server that exposes Zillow scraping to AI agents — and a regular Apify actor for click-Run users. Two ways to use it:
- MCP clients (Claude Desktop, Cursor, ChatGPT, VS Code) → connect to the Standby
/mcpendpoint → get 3 narrow tools picked automatically by intent. - Apify Console / API → fill the input form (mode + zpid/zip_codes/zillow_url) → click Start → results pushed to the dataset.
Same data, same per-property pricing, two entry points.
Sister actor Zillow Property & Agent Data Scraper — the original run-input/output actor with the same data and pricing.
Tools
| Tool | Inputs | Returns |
|---|---|---|
zillow_search_by_zip | zip_codes (1–20), max_properties?, filters?, enrichWalkScore?, enrichPhotos? | Array of enriched property records, each inside the ZIP it was asked for |
zillow_search_by_url | zillow_url, max_properties?, enrichWalkScore?, enrichPhotos? | Array (or single record for _zpid URL) |
zillow_lookup_property | zpid or address, enrichWalkScore?, enrichPhotos? | Single enriched property record |
Each enriched record includes 94 fields — same shape as the parent scraper. Highlights: address, price, beds/baths/sqft, full agent contact (with 3-tier email-resolution fallback: property page → agent profile → name search), broker, Zestimate / rent Zestimate, HOA, taxes, schools, openHouseSchedule, full price history, flood / wildfire / wind / heat / air-quality risk scores with the FEMA flood zone, the nearby homes (nearbyHomes) with a calculated comparison of the property's price per square foot against their median, walk/transit/bike scores (when enrichWalkScore=true), photo gallery (when enrichPhotos=true). The risk and nearby-home columns come from the same property lookup — no extra charge. compsMedianPricePerSqft and pricePerSqftVsCompsPct are calculated by this actor, not Zillow figures (rents are left out of the median; homes of the same type are used when at least three are).
Look up a property by its street address
zillow_lookup_property takes address instead of zpid: one street address with the house number, the street and the state or ZIP code, e.g. "6503 Linda Ln, Austin, TX 78723". The property found is checked against what you gave — house number, street, state, ZIP and town. An address that matches no single property is not charged: the answer has no property, isValid: false, invalidReason (invalid_format, not_found or ambiguous) and the reason, which names the closest match and its ZPID when there is one. A found property is charged like a zpid lookup, and its record carries input (the address given) and isValid: true.
Optional enrichments
Both toggles are no extra charge; each adds a little time per property.
enrichWalkScore: true— populateswalkScore,transitScore,bikeScore(0–100 each).enrichPhotos: true— populates the full Zillow photo gallery inphotos[](default behavior is[mainPhoto]or[]).
Pricing
Pay-per-event, mirroring the parent scraper:
| Plan | Per-property cost | One-time actor start |
|---|---|---|
| FREE | $0.08 | $0.00005 (per GB memory) |
| BRONZE | $0.07 | $0.00005 |
| SILVER | $0.06 | $0.00005 |
| GOLD / PLATINUM / DIAMOND | $0.05 | $0.00005 |
Free plan caps: up to 15 properties per single tool call. Paid plans: up to 50 properties per single tool call (call again for more).
Run as a regular Apify actor (no MCP client needed)
Click Start with one of these inputs:
{ "mode": "zpid", "zpids": ["119617641"], "enrichWalkScore": true, "enrichPhotos": true }
{ "mode": "zip", "zipCodes": ["10001"], "maxProperties": 5, "status_type": "ForRent", "largeDogsAllowed": true, "inUnitLaundry": true }
{ "mode": "zip", "zipCodes": ["94103"], "maxProperties": 3, "schools": "elementary,public", "schoolsRating": 8 }
{ "mode": "url", "zillowUrl": "https://www.zillow.com/homedetails/..._zpid/" }
Results land in the run's default dataset. Same enriched 77-field records as the MCP tools return. The full filter surface (price / rent / beds / baths / sqft / lot / year built ranges, home type, listing-type tri-state filters, features, views, rental amenities, schools) is exposed as top-level input fields — same UX as the parent scraper.
Starting a run without a target (no ZPIDs / ZIP codes / URL for the selected mode) performs a small demo run capped at 10 properties instead of failing, so you always get sample output to inspect. Provide your own target to scrape real data at the full property cap.
Connect from Claude Desktop
Add to your ~/Library/Application Support/Claude/claude_desktop_config.json:
{"mcpServers": {"zillow": {"url": "https://<your-actor-id>.apify.actor/mcp","headers": {"Authorization": "Bearer <your-apify-token>"}}}}
Restart Claude Desktop. Tools appear in the tool catalog.
Connect from Cursor / ChatGPT / VS Code
Same Streamable HTTP endpoint. Configuration syntax varies by client — point your MCP client to:
https://<your-actor-id>.apify.actor/mcp
with header Authorization: Bearer <APIFY_TOKEN>.
Quick test (no client)
curl -X POST "https://<your-actor-id>.apify.actor/mcp" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
returns the catalog. To call a tool:
curl -X POST "https://<your-actor-id>.apify.actor/mcp" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"zillow_lookup_property","arguments":{"zpid":"119617641"}}}'# or by street address:# ..."arguments":{"address":"6503 Linda Ln, Austin, TX 78723"}...
Output
Every tool call also writes its results to the actor's default dataset, so you can re-export results from the Apify Console (CSV, JSON, Excel) alongside the MCP response.
Free vs paid
| Feature | Free | Paid |
|---|---|---|
| Properties per tool call | 15 max | 50 max |
| Tool calls per run | Unlimited | Unlimited |
Apify's "Maximum cost per run" run option provides per-run cost ceilings independently.
Free-plan email masking
On the FREE plan agent emails come back masked — j***@a***.com — and agentEmailSource reports masked_upgrade_to_unlock. Upgrade to any paid plan (BRONZE+) to receive the unmasked value. This mirrors the parent scraper's gating exactly.
Storage records
The actor writes the same 5 operational records the parent scraper produces. In Standby mode, counters aggregate across all MCP tool calls in the same Standby instance and flush every 10 calls (and on Actor.exit).
- Default dataset — one row per property returned, across regular-run dispatcher and all MCP tool calls.
RUN_SUMMARY— input snapshot, properties.found / enriched / skipped, email-resolution stats, plan, runMode, durationSeconds, tool-call count, pluszipScopewhen any ZIP had to be searched through its city.SKIPPED_ITEMS— per-item breakdown (zpid / ZIP / URL skipped, reason, category). A search or property that could not be reached in time — when many requests run at the same moment, a tool call waits its turn for up to about 45 seconds — is listed undertemporarily_unavailableand is not charged; the tool's answer says so, and asking again a minute later usually goes through.FREE_LIMITS_APPLIED— list of FREE-plan ceilings hit during the run.USER_MESSAGE— onboarding / upgrade / informational banner (when applicable).status.html— live progress / completed banner rendered in the Apify Console Output tab.
Related actors
- Zillow Property & Agent Data Scraper — parent scraper, run-input/output style. Same data, same pricing.
- Zillow ZIP Code Property Scraper — single-mode parent spinoff, ZIP-only.
- Zillow URL Search Property Scraper — single-mode parent spinoff, URL-only.
Support
For issues or feature requests, open an issue on the actor's Apify Store page.
