๐ฌ Zillow Contact API - FSBO & Investor Lead Generator
Pricing
$45.00/month + usage
๐ฌ Zillow Contact API - FSBO & Investor Lead Generator
Generate FSBO leads before competition. Contact Zillow property owners and agents programmatically. Get property details + owner info instantly. Perfect for real estate agents, investors, wholesalers. $49/month unlimited. 3-second contact vs 10+ min manually.
Pricing
$45.00/month + usage
Rating
0.0
(0)
Developer

ClearPath
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share
๐ฏ Zillow Contact API - Generate Real Estate Leads at Scale
Programmatically contact property owners and agents on Zillow - Automate FSBO outreach, investor lead generation, and bulk property inquiries.
Never contact property owners manually again. Message dozens of Zillow property owners in minutes instead of hours. Perfect for real estate agents reaching FSBOs, investors scaling acquisition pipelines, and renters applying to multiple properties instantly.
Features
- ๐ฏ Generate Real Estate Leads - Contact FSBOs before competition, reach motivated sellers at scale
- ๐ข Works for All Property Types - Sales, rentals, FSBOs, agent listings, foreclosures, new construction
- ๐ Returns Property + Owner Data - Get full property details and owner/agent contact information
- ๐ฐ $45/Month unlimited - No per-contact fees, unlimited properties, all features included
๐ Quick Start
FSBO Lead Generation - Contact Private Sellers
{"zpid": 31656059,"name": "Robert Martinez","contactEmail": "robert.martinez@realestate.com","phoneNumber": "+12125551234","message": "Hi! I'm a local real estate agent specializing in your neighborhood. I have qualified buyers actively looking for properties like yours. I'd love to discuss how I can help you sell quickly and for top dollar. Would you be open to a quick conversation?"}
Investor Outreach - Contact Property Owners
{"propertyUrl": "https://www.zillow.com/homedetails/458222521_zpid/","name": "Sarah Chen","contactEmail": "sarah@investmentgroup.com","phoneNumber": "+14165551234","email": "your.zillow.account@gmail.com","password": "your_password","message": "Hello,\n\nI'm a real estate investor interested in purchasing properties in your area. I can close quickly with cash and work around your timeline. Would you be interested in discussing an offer?\n\nBest regards,\nSarah"}
Rental Inquiry - Message Apartment Listing
{"zpid": 2069918407,"name": "Michael Rodriguez","contactEmail": "michael.rodriguez@gmail.com","phoneNumber": "+13105551234","message": "Hello,\n\nI'm very interested in this rental property. I'm a software engineer with stable employment, excellent credit (780+), and strong references. I can provide proof of income and move in by the 1st of next month.\n\nPlease let me know the next steps!\n\nThank you!"}
๐ก Track responses: After sending inquiries, use Zillow Message Inbox API to export conversations and measure response rates. See "Track Responses" section for complete workflow.
โก Key Features
Automated Contact Submission
- 3-second inquiries - Contact property owners instantly vs 10+ minutes manually
- Automatic validation - Phone, email, ZPID/URL validation before submission
- Success tracking - Know exactly which contacts succeeded or failed
- Error handling - Handles duplicates, removed listings, authentication issues
๐ข Universal Property Support
- All property types - FSBO, agent listings, rentals, sales, foreclosures, new construction
- All listing subtypes - Active, pending, coming soon, auction, bank-owned
- Flexible input - ZPID or full URL (supports both direct and speaking URLs)
- ZPID extraction - Automatically extracts property ID from any URL format
๐ Authentication Methods
- Auto-login (recommended) - Provide email + password, cookies managed automatically
- Manual cookies - Alternative method for advanced users
- Cookie persistence - Saved and reused across runs until expiration
- Optional but recommended - Submissions without auth may have lower success rates
๐ Complete Data Returns
- Property details - Address, price, beds, baths, sqft, property type, zestimate
- Owner/agent info - Name, phone number, encoded ZUID for follow-up
- Submission confirmation - Full message sent, timestamp, success status
- Error details - Clear error messages for debugging and retries
๐ฏ Use Cases
For Real Estate Agents
- FSBO lead generation - Contact private sellers before competing agents reach them
- First-mover advantage - Be the first agent to contact new FSBO listings (automate with scrapers)
- Expired listings - Reach out to expired listings offering to relist with proven marketing
- Coming soon properties - Get early access to sellers before properties hit MLS
- Market farming - Systematically contact property owners in your target neighborhoods
- Sphere of influence - Stay top-of-mind with regular outreach to your farm area
- Volume business - Contact 100+ FSBOs per week vs 5-10 manually
For Real Estate Investors
- Motivated seller outreach - Contact properties with price drops, long days on market
- Off-market deal sourcing - Reach property owners before listings go active
- Distressed property pipeline - Scale contact with foreclosures, auction properties, fixer-uppers
- Wholesale lead generation - Build assignment contract pipeline with volume outreach
- Market research - Gauge seller interest and motivation across target areas
- Time efficiency - Spend time analyzing deals, not manually filling contact forms
- Deal velocity - Contact 200+ properties per day vs 20 manually
For Wholesalers
- High-volume outreach - Contact dozens of potential sellers daily for assignment deals
- Aging inventory - Target properties on market 180+ days (motivated sellers)
- Price drop alerts - Automatically contact when properties reduce price (urgency signal)
- Market inefficiency - Find properties priced below market for quick flips
- Arbitrage opportunities - Scale outreach to find off-market assignment deals
- Lead qualification - Quick contact to gauge seller flexibility and motivation
For Individual Renters & Buyers
- Bulk rental inquiries - Apply to 50+ apartments in your target area in minutes
- Competitive markets - Be first to inquire in hot markets like NYC, SF, LA
- Remote relocations - Contact properties from anywhere without visiting
- Time savings - 3 seconds per inquiry vs 10+ minutes manually
- Application blitzes - Contact every matching property instantly when new listings appear
For Developers & PropTech Companies
- CRM integration - Add Zillow contact to your real estate CRM workflow
- Automated pipelines - Build "scrape โ qualify โ contact โ log" workflows
- Lead nurturing - Trigger-based follow-up for new listings, price drops, status changes
- Multi-platform - Combine with other rental/sales platforms for comprehensive coverage
- API orchestration - Integrate into existing property management systems
- Data collection - Track contact success rates, response times, owner preferences
๐ก Pro tip for all use cases: Track your response rates with Zillow Message Inbox API to measure ROI and optimize your outreach strategy. See "Track Responses" section below.
๐ Input Parameters
| Parameter | Type | Description | Default |
|---|---|---|---|
| string | Zillow account email for auto-login (recommended). Cookies will be stored and reused. | Optional* | |
| password | string | Zillow account password. Required if email is provided. Never stored, only cookies saved. | Optional* |
| cookies | string | Alternative: Manual cookies (JSON array, object, or string format). Advanced users only. | Optional* |
| zpid | integer | Zillow Property ID (8-10 digits). Either ZPID or Property URL is required. | Optional** |
| propertyUrl | string | Full Zillow property URL. Supports direct (_zpid/) and speaking URLs. Either ZPID or URL required. | Optional** |
| name | string | Your full name as it should appear in the inquiry (e.g., "Sarah Johnson") | Required |
| contactEmail | string | Your email address where owner/agent can respond | Required |
| phoneNumber | string | US/Canada phone in format +1XXXXXXXXXX (exactly 12 characters) | Required |
| message | string | Your message to the property owner/agent. Professional default template provided. | Professional template |
*Note: Authentication (email/password OR cookies) is optional but strongly recommended for higher success rates.
**Note: Either zpid OR propertyUrl must be provided (at least one required). If both provided, zpid takes precedence.
Phone Number Format
- Format: +1XXXXXXXXXX (exactly 12 characters)
- Example: +12125551234 (New York), +14165551234 (Toronto), +13105551234 (Los Angeles)
- Supported: US and Canada only
- Validation: Automatic validation before submission
Authentication Methods
Auto-Login (Recommended):
{"email": "your.zillow.account@gmail.com","password": "your_password"}
Cookies are automatically extracted, stored, and reused. Simplest and most reliable method.
Manual Cookies (Alternative):
{"cookies": "zgsession=1|abc123; loginmemento=1|xyz789; _px3=...; ZILLOW_SID=1|...; zjs_user_id=..."}
For advanced users who prefer manual cookie management. Three formats supported: JSON array (from Cookie-Editor extension), browser string, or JSON object.
Default Message Template
If you don't provide a custom message, this professional template is used:
Hello,I'm interested in learning more about this property. I would appreciate the opportunity to discuss it further and schedule a viewing if possible.Please contact me at your earliest convenience.Thank you!
Customize your message based on your use case (agent introduction, investor cash offer, renter credentials, etc.).
๐ Output
Each contact submission returns comprehensive property and owner details:
Success Response
{"zpid": 31656059,"propertyUrl": "https://www.zillow.com/homedetails/31656059_zpid/","propertyType": "FOR_SALE","name": "Robert Martinez","email": "robert.martinez@realestate.com","phone": "+12125551234","message": "Hi! I'm a local real estate agent...","success": true,"propertyDetails": {"zpid": 31656059,"address": "123 Main St","city": "Brooklyn","state": "NY","zipCode": "11201","beds": 3,"baths": 1,"sqft": 1218,"price": 95000,"zestimate": null,"propertyType": "Single Family","listingType": "ForSaleByOwner","url": "https://www.zillow.com/homedetails/31656059_zpid/","imageUrl": "https://photos.zillowstatic.com/..."},"owner": {"name": "John Smith","phone": {"areacode": "917","prefix": "602","number": "0133"},"encodedZuid": "X1-ZU1081ibxx5z095_2nint"},"scrapedAt": "2025-11-20T14:51:07.816369"}
Success Response Fields:
success: true- Contact submitted successfullypropertyDetails- Full property information (address, price, beds, baths, type, listing type, URL, image)owner- Owner/agent contact information (name, phone breakdown, encoded ZUID for follow-up)- All input fields echoed back for tracking
scrapedAt- Timestamp of submission
Error Response
{"zpid": 31656059,"propertyUrl": "https://www.zillow.com/homedetails/31656059_zpid/","propertyType": "FOR_SALE","name": "Robert Martinez","email": "robert.martinez@realestate.com","phone": "+12125551234","message": "Hi! I'm a local real estate agent...","success": false,"propertyDetails": {"zpid": 31656059,"address": "123 Main St","city": "Brooklyn","state": "NY","zipCode": "11201","beds": 3,"baths": 1,"sqft": 1218,"price": 95000,"propertyType": "Single Family","listingType": "ForSaleByOwner","url": "https://www.zillow.com/homedetails/31656059_zpid/"},"owner": {"name": "John Smith","phone": {"areacode": "917","prefix": "602","number": "0133"}},"error": "You've already submitted a contact regarding this home","errorCode": "DUPLICATE_SUBMISSION","scrapedAt": "2025-11-20T14:51:07.816369"}
Error Response Fields:
success: false- Contact submission failederror- Human-readable error descriptionerrorCode- Machine-readable error code for programmatic handlingpropertyDetailsandowner- Still included when available (GraphQL succeeded but submission failed)
Common Error Codes:
DUPLICATE_SUBMISSION- You already contacted this property (not a failure, expected behavior)AUTHENTICATION_REQUIRED- Property requires authenticated session (try providing email/password or cookies)PROPERTY_REMOVED- Listing removed or no longer availableINVALID_PHONE_NUMBER- Phone format validation failedZPID_NOT_FOUND- Property ID doesn't exist or URL couldn't be parsed
๐ Apify Integration - Call from Other Actors
Perfect for automation workflows: Chain this actor with Zillow search actors to build complete lead generation pipelines.
Python - FSBO Lead Generation Pipeline
from apify_client import ApifyClientclient = ApifyClient("your_apify_token")# Step 1: Search for FSBO listings with zillow-bulk-scraperprint("Searching for FSBO properties...")search_run = client.actor("your-search-actor-id").call(run_input={"locations": ["Miami FL", "Fort Lauderdale FL"],"propertyType": "forSale","minPrice": 300000,"maxPrice": 500000,"homeTypes": ["singleFamily", "townhome"],"maxResultsPerLocation": 100})# Step 2: Get search resultssearch_results = client.dataset(search_run["defaultDatasetId"]).iterate_items()# Step 3: Filter for FSBOs and contact ownersfor item in search_results:prop = item["rawData"]["property"]zpid = prop["zpid"]listing_type = prop.get("listingTypeDimension", "")# Only contact FSBO listings (private sellers, no agent)if listing_type == "ForSaleByOwner":print(f"๐ฏ FSBO Found! Contacting ZPID {zpid}...")# Call contact API actorcontact_run = client.actor("zillow-contact-api-actor-id").call(run_input={"zpid": zpid,"name": "Robert Martinez","contactEmail": "robert.martinez@realestate.com","phoneNumber": "+13055551234","email": "your.zillow.account@gmail.com","password": "your_password","message": f"Hi! I'm a local agent with qualified buyers looking for properties exactly like yours in {prop.get('city', 'your area')}. I'd love to discuss how I can help you sell quickly and for top dollar. Are you open to a quick conversation?"})# Check contact resultcontact_results = list(client.dataset(contact_run["defaultDatasetId"]).iterate_items())if contact_results and contact_results[0]["success"]:print(f"โ Successfully contacted FSBO - ZPID {zpid}")print(f" Owner: {contact_results[0]['owner']['name']}")print(f" Price: ${prop.get('price', 'N/A')}")else:error = contact_results[0].get("error", "Unknown error") if contact_results else "No response"print(f"โ Failed to contact ZPID {zpid}: {error}")print("\n๐ FSBO outreach campaign complete!")
JavaScript - Investor Lead Generation with Price Drops
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'your_apify_token' });// Step 1: Search for properties with price drops (motivated sellers)console.log('Searching for investment opportunities...');const searchRun = await client.actor('zillow-bulk-scraper-id').call({locations: ['Phoenix AZ', 'Tucson AZ'],propertyType: 'forSale',minPrice: 150000,maxPrice: 300000,homeTypes: ['singleFamily', 'multiFamily'],sortBy: 'price_reduced', // Properties with recent price dropsmaxResultsPerLocation: 200});// Step 2: Get search resultsconst { items } = await client.dataset(searchRun.defaultDatasetId).listItems();// Step 3: Filter and contact motivated sellersconst contactPromises = items.filter(item => {const prop = item.rawData.property;const daysOnMarket = prop.daysOnZillow || 0;const priceReduced = prop.priceChange !== undefined && prop.priceChange < 0;// Target: On market 90+ days OR price reduced (motivated sellers)return daysOnMarket >= 90 || priceReduced;}).map(item => {const prop = item.rawData.property;const zpid = prop.zpid;const priceChange = prop.priceChange || 0;console.log(`๐ฐ Motivated seller found - ZPID ${zpid} (${daysOnMarket} days, ${priceChange < 0 ? 'price drop' : 'long listing'})`);return client.actor('zillow-contact-api-actor-id').call({zpid,name: 'Sarah Chen',contactEmail: 'sarah@investmentgroup.com',phoneNumber: '+14805551234',email: 'your.zillow.account@gmail.com',password: 'your_password',message: `Hello,\n\nI'm a real estate investor interested in purchasing your property at ${prop.address}. I can close quickly with cash and work around your timeline.\n\nWould you be interested in discussing an offer? I'm flexible on terms and can make this easy for you.\n\nBest regards,\nSarah Chen\nInvestment Group LLC`});});// Wait for all contacts to completeconst results = await Promise.all(contactPromises);// Report resultsconsole.log(`\n๐ Investment Outreach Summary:`);console.log(`Total contacts: ${results.length}`);for (const run of results) {const { items: contactResults } = await client.dataset(run.defaultDatasetId).listItems();const result = contactResults[0];if (result.success) {console.log(`โ ZPID ${result.zpid}: Owner contacted - ${result.owner.name}`);} else {console.log(`โ ZPID ${result.zpid}: ${result.error}`);}}
Integration Pattern: Search โ Filter โ Contact โ Track
Recommended Workflow:
- Search: Use
zillow-bulk-scraperorzip-code-searchto find properties - Filter: Programmatically filter for FSBOs, price drops, days on market, property type
- Contact: Call this actor with filtered ZPIDs for automated outreach
- Track: Store results with owner info, track response rates, measure ROI
Automation Triggers:
- Daily FSBO scraper โ contact new FSBOs within 1 hour of listing
- Price drop alerts โ contact immediately when target properties reduce price
- Expired listings โ contact when listings expire (remove from MLS)
- Market changes โ contact when properties enter your target criteria
Pricing
$45 per month - Unlimited contacts, unlimited runs, no hidden fees.
- โ Unlimited property contacts - Message as many owners/agents as needed
- โ Unlimited runs - Schedule as often as required (daily, hourly, trigger-based)
- โ All features included - Authentication, property data, owner info, API access
- โ Property + owner data returned - Get full property details and owner contact information
- โ No per-contact fees - One flat monthly rate regardless of volume
- โ Cancel anytime - No long-term contracts or commitments
ROI for Real Estate Professionals:
- One FSBO listing = $5,000-$15,000 commission โ 100x+ ROI on first deal
- One wholesale deal = $10,000-$50,000 profit โ 200x-1000x+ ROI
- One investment property = $20,000-$100,000+ profit โ 400x-2000x+ ROI
Perfect for real estate agents, investors, wholesalers, renters, and developers who need fast, reliable property contact automation at scale.
๐ก Advanced Usage
Batch Contact to Multiple Properties
Contact 100+ properties in one workflow by calling the actor multiple times:
from apify_client import ApifyClientclient = ApifyClient("your_apify_token")# List of FSBO properties to contact (from scraper results)fsbo_properties = [{"zpid": 31656059, "address": "123 Main St", "price": 450000},{"zpid": 458222521, "address": "456 Oak Ave", "price": 389000},{"zpid": 123456789, "address": "789 Elm Rd", "price": 525000},# ... 100 more FSBOs]# Your contact detailsagent_info = {"name": "Robert Martinez","contactEmail": "robert.martinez@realestate.com","phoneNumber": "+13055551234","email": "your.zillow.account@gmail.com","password": "your_password"}# Contact all FSBOs with personalized messagessuccess_count = 0for prop in fsbo_properties:run_input = {**agent_info,"zpid": prop["zpid"],"message": f"Hi! I'm a local agent with buyers actively searching for properties like yours at {prop['address']}. I can help you sell for top dollar. Let's talk!"}print(f"Contacting FSBO at {prop['address']} (${prop['price']:,})...")run = client.actor("zillow-contact-api-actor-id").call(run_input=run_input)# Check resultresults = list(client.dataset(run["defaultDatasetId"]).iterate_items())if results and results[0]["success"]:success_count += 1print(f"โ Success - Owner: {results[0]['owner']['name']}")else:error = results[0].get("error", "Unknown") if results else "No response"print(f"โ Failed: {error}")print(f"\n๐ Campaign complete! Successfully contacted {success_count}/{len(fsbo_properties)} FSBOs")
Scheduled Automation - Daily FSBO Lead Generation
Set up automated daily outreach to new FSBO listings:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'your_apify_token' });// Create scheduled workflow (runs daily at 9 AM)async function setupDailyFSBOOutreach() {// This would be your scheduled actor that runs dailyconst schedule = await client.schedules().create({name: 'Daily FSBO Lead Generation',actorId: 'your-workflow-actor-id', // Your orchestration actorcronExpression: '0 9 * * *', // Daily at 9 AMtimezone: 'America/New_York',input: {searchLocations: ['Miami FL', 'Fort Lauderdale FL', 'West Palm Beach FL'],filterForFSBO: true,autoContact: true,agentName: 'Robert Martinez',agentEmail: 'robert.martinez@realestate.com',agentPhone: '+13055551234',zillowEmail: 'your.zillow.account@gmail.com',zillowPassword: 'your_password'}});console.log(`โ Scheduled automation created: ${schedule.id}`);console.log('New FSBOs will be contacted automatically every day at 9 AM');}setupDailyFSBOOutreach();
Custom Message Templates by Use Case
Dynamically generate messages based on your strategy:
function getMessageForProperty(property, userType) {const { address, price, beds, baths, daysOnZillow, listingType } = property;if (userType === 'agent' && listingType === 'ForSaleByOwner') {// Agent reaching out to FSBOreturn `Hi! I'm a local agent who just came across your listing at ${address}. I have ${beds >= 3 ? 'a family' : 'buyers'} actively searching for properties exactly like yours. I'd love to discuss how I can help you sell quickly and for top dollar - I have proven marketing strategies that consistently get sellers 5-10% above asking. Are you open to a quick conversation?`;} else if (userType === 'investor') {// Investor offering cash purchaseconst urgencyNote = daysOnZillow > 90 ? 'I noticed your property has been on the market for a while - ' : '';return `Hello,\n\n${urgencyNote}I'm a real estate investor interested in purchasing your property at ${address}. I can offer:\n\nโข All-cash purchase (no financing contingencies)\nโข Close in 7-14 days (flexible to your timeline)\nโข No repairs needed (as-is purchase)\nโข No agent commissions to pay\n\nWould you be interested in discussing a fair cash offer?\n\nBest regards`;} else if (userType === 'wholesaler' && daysOnZillow > 120) {// Wholesaler targeting long listingsreturn `Hello,\n\nI noticed your property at ${address} has been on the market for ${daysOnZillow} days. I work with a network of cash buyers who are actively purchasing properties in your area. We can often close quickly and save you the hassle of traditional sales.\n\nWould you be open to discussing a creative solution that gets your property sold fast?\n\nThank you`;} else if (userType === 'renter') {// Renter applyingreturn `Hello,\n\nI'm very interested in your rental property at ${address}. I'm a ${beds >= 2 ? 'family of professionals' : 'young professional'} with:\n\nโ Excellent credit (750+)\nโ Stable employment and verifiable income\nโ Strong rental history and references\nโ Ready to move in immediately\n\nI can provide all documentation promptly. When can we schedule a viewing?\n\nThank you!`;} else {// Default professional inquiryreturn `Hello,\n\nI'm interested in learning more about your property at ${address}. I'd appreciate the opportunity to discuss it further.\n\nPlease contact me at your earliest convenience.\n\nThank you!`;}}// Usage exampleconst property = {address: "123 Main St",price: 450000,beds: 3,baths: 2,daysOnZillow: 95,listingType: "ForSaleByOwner"};const agentMessage = getMessageForProperty(property, 'agent');const investorMessage = getMessageForProperty(property, 'investor');
Error Handling and Retry Logic
Robust error handling for production workflows:
from apify_client import ApifyClientimport timeclient = ApifyClient("your_apify_token")def contact_property_with_retry(zpid, contact_info, max_retries=3):"""Contact property with exponential backoff retry for transient errors"""for attempt in range(max_retries):try:run = client.actor("zillow-contact-api-actor-id").call(run_input={"zpid": zpid,**contact_info})results = list(client.dataset(run["defaultDatasetId"]).iterate_items())if not results:raise Exception("No results returned")result = results[0]if result["success"]:return {"success": True, "data": result}# Check error code to decide if retry makes senseerror_code = result.get("errorCode", "")# Don't retry these errors (expected/permanent failures)no_retry_codes = ["DUPLICATE_SUBMISSION", "PROPERTY_REMOVED", "ZPID_NOT_FOUND"]if error_code in no_retry_codes:return {"success": False, "error": result.get("error"), "no_retry": True}# Retry for transient errorsif attempt < max_retries - 1:wait_time = 2 ** attempt # Exponential backoff: 1s, 2s, 4sprint(f"โ ๏ธ Attempt {attempt + 1} failed: {result.get('error')}. Retrying in {wait_time}s...")time.sleep(wait_time)else:return {"success": False, "error": result.get("error")}except Exception as e:if attempt < max_retries - 1:wait_time = 2 ** attemptprint(f"โ ๏ธ Attempt {attempt + 1} error: {str(e)}. Retrying in {wait_time}s...")time.sleep(wait_time)else:return {"success": False, "error": str(e)}return {"success": False, "error": "Max retries exceeded"}# Usageresult = contact_property_with_retry(zpid=31656059,contact_info={"name": "Robert Martinez","contactEmail": "robert@example.com","phoneNumber": "+13055551234","email": "zillow.account@gmail.com","password": "password"})if result["success"]:print(f"โ Success! Contacted owner: {result['data']['owner']['name']}")else:print(f"โ Failed: {result['error']}")
๐ฌ Track Responses - Complete Outreach Workflow
Want to track responses to your contact campaigns? Use Zillow Message Inbox API to export conversations and measure ROI.
The Complete Outreach Workflow
- Contact (this actor) - Send inquiries to FSBOs, investors, rental listings
- Wait - Give owners/agents 24-48 hours to respond
- Track (inbox actor) - Export conversations to see who responded
- Analyze - Measure response rates, track deal pipeline, calculate ROI
- Follow-up - Re-engage interested leads based on conversation data
Why Track Responses?
- Measure ROI - Know which properties responded vs total contacted
- Response time analytics - Track how quickly owners/agents reply
- Conversation archival - Legal documentation for disputes or records
- Pipeline management - Export to CRM for follow-up automation
- Campaign optimization - A/B test message templates based on response rates
Integration Example - FSBO Campaign with Response Tracking
from apify_client import ApifyClientimport timeclient = ApifyClient("your_apify_token")# Step 1: Contact 50 FSBOsprint("๐ฏ Contacting 50 FSBOs...")fsbo_zpids = [31656059, 458222521, 123456789, ...] # From scrapercontact_results = []for zpid in fsbo_zpids:run = client.actor("zillow-contact-api").call(run_input={"zpid": zpid,"name": "Robert Martinez","contactEmail": "robert@example.com","phoneNumber": "+13055551234","email": "zillow.account@gmail.com","password": "your_password","message": "Hi! I'm a local agent with qualified buyers..."})result = list(client.dataset(run["defaultDatasetId"]).iterate_items())[0]if result["success"]:contact_results.append({"zpid": zpid,"owner": result["owner"]["name"],"property": result["propertyDetails"]["address"],"contacted_at": result["scrapedAt"]})print(f"โ Successfully contacted {len(contact_results)} FSBOs")# Step 2: Wait 48 hours for responsesprint("โณ Waiting 48 hours for owner responses...")time.sleep(48 * 60 * 60) # In production, use scheduled runs# Step 3: Check inbox for responsesprint("๐ฌ Checking inbox for responses...")inbox_run = client.actor("clearpath/zillow-message-inbox-api").call(run_input={"email": "zillow.account@gmail.com","password": "your_password","mode": "buying", # Use "rental" for rental inquiries"fetchFullConversations": True})inbox_data = list(client.dataset(inbox_run["defaultDatasetId"]).iterate_items())[0]conversations = inbox_data["buying"]["conversations"]# Step 4: Match responses to contacted propertiesprint("๐ Analyzing response rates...")responded_zpids = set()for conv in conversations:# Extract zpid from conversation (in richObjects)first_message = conv["messages"]["messageList"][0]if first_message.get("richObjects"):zpid = first_message["richObjects"][0]["state"]["zpid"]responded_zpids.add(zpid)# Calculate metricscontacted_zpids = {item["zpid"] for item in contact_results}response_rate = (len(responded_zpids) / len(contacted_zpids)) * 100print(f"\n๐ Campaign Results:")print(f" Total contacted: {len(contacted_zpids)}")print(f" Total responses: {len(responded_zpids)}")print(f" Response rate: {response_rate:.1f}%")print(f" ROI: {len(responded_zpids)} leads generated")# Step 5: Export to CRM or follow upfor zpid in responded_zpids:contact_info = next(item for item in contact_results if item["zpid"] == zpid)print(f"๐ฅ HOT LEAD: {contact_info['owner']} at {contact_info['property']}")# TODO: Add to CRM, schedule follow-up call, etc.
Quick Comparison
| Feature | Contact API (this actor) | Inbox API |
|---|---|---|
| Purpose | Send inquiries to owners/agents | Track responses and conversations |
| Direction | Outbound | Inbound |
| Use Case | Lead generation, bulk outreach | Response tracking, ROI measurement |
| Authentication | Optional (recommended) | Required (auto-login or cookies) |
| Output | Property + owner details | Complete conversation threads |
| Pricing | $45/month unlimited | $35/month unlimited |
Use Both for Maximum ROI
- Contact API alone: Send inquiries, but manually check email for responses
- Contact + Inbox APIs: Automated pipeline with response tracking, metrics, and CRM integration
Learn more about Zillow Message Inbox API โ
๐ API Integration
Python
from apify_client import ApifyClient# Initialize the Apify clientclient = ApifyClient("your_apify_token")# Prepare contact inputrun_input = {"zpid": 31656059,"name": "Robert Martinez","contactEmail": "robert.martinez@realestate.com","phoneNumber": "+13055551234","email": "your.zillow.account@gmail.com","password": "your_password","message": "Hi! I'm a local agent with qualified buyers looking for properties like yours..."}# Submit contactprint("Contacting property owner...")run = client.actor("zillow-contact-api-actor-id").call(run_input=run_input)# Get contact resultprint("Checking contact status...")for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item["success"]:print(f"โ Contact submitted successfully!")print(f" Property: {item['propertyDetails']['address']}")print(f" Price: ${item['propertyDetails']['price']:,}")print(f" Owner: {item['owner']['name']}")print(f" Owner Phone: {item['owner']['phone']['areacode']}-{item['owner']['phone']['prefix']}-{item['owner']['phone']['number']}")else:print(f"โ Contact failed")print(f" Error: {item.get('error', 'Unknown error')}")print(f" Error Code: {item.get('errorCode', 'N/A')}")
JavaScript/TypeScript
import { ApifyClient } from 'apify-client';// Initialize the Apify clientconst client = new ApifyClient({ token: 'your_apify_token' });// Prepare contact inputconst input = {propertyUrl: 'https://www.zillow.com/homedetails/458222521_zpid/',name: 'Sarah Chen',contactEmail: 'sarah@investmentgroup.com',phoneNumber: '+14805551234',email: 'your.zillow.account@gmail.com',password: 'your_password',message: 'Hello, I\'m a real estate investor interested in purchasing your property...'};// Submit contactconsole.log('Contacting property owner...');const run = await client.actor('zillow-contact-api-actor-id').call(input);// Get contact resultconsole.log('Checking contact status...');const { items } = await client.dataset(run.defaultDatasetId).listItems();items.forEach((item) => {if (item.success) {console.log('โ Contact submitted successfully!');console.log(` Property: ${item.propertyDetails.address}`);console.log(` Price: $${item.propertyDetails.price.toLocaleString()}`);console.log(` Owner: ${item.owner.name}`);console.log(` Owner Phone: ${item.owner.phone.areacode}-${item.owner.phone.prefix}-${item.owner.phone.number}`);} else {console.log('โ Contact failed');console.log(` Error: ${item.error || 'Unknown error'}`);console.log(` Error Code: ${item.errorCode || 'N/A'}`);}});
๐ Data Export
Export your contact records in multiple formats:
- JSON - Perfect for programmatic analysis, CRM integration, and data pipelines
- CSV - Import into spreadsheets (Excel, Google Sheets) for tracking and reporting
- Excel - Create professional contact logs with formatting and formulas
Recommended Fields for Tracking:
- Contact date/time (
scrapedAt) - Property details (address, price, ZPID)
- Owner information (name, phone)
- Success/failure status
- Error codes for failed attempts
- Custom notes field for follow-up tracking
๐ค Automation
Scheduled Runs
Set up automated lead generation campaigns:
- Daily FSBO monitoring - Contact new FSBOs every morning before competition
- Price drop alerts - Instantly contact when target properties reduce prices
- Expired listing outreach - Automatically reach out when listings expire
- Market farming - Systematic weekly contact to your target neighborhoods
Webhooks
Receive real-time notifications for workflow integration:
- Success alerts - Get notified immediately when contacts succeed
- Error notifications - Debug failures in real-time
- CRM integration - Send owner/agent data directly to your CRM
- Slack/Discord alerts - Team notifications for new leads
API Access
Build custom lead generation systems:
- Search-to-contact pipelines - Fully automated FSBO/investor workflows
- CRM integration - Sync contacts with Salesforce, HubSpot, Follow Up Boss
- Custom dashboards - Track contact rates, response times, ROI metrics
- Multi-platform orchestration - Combine Zillow with Redfin, Realtor.com, etc.
โ FAQ
Q: How does this work? A: The actor uses Zillow's contact form submission API to programmatically send your inquiry to property owners or agents. You provide the property (ZPID or URL) and your contact details, and the actor handles the rest - including authentication, validation, and submission.
Q: What property types are supported? A: All property types on Zillow: FSBO (for sale by owner), agent listings, rentals, sales, foreclosures, new construction, auctions, pending, coming soon, and recently sold. The same API works universally.
Q: Do I need a Zillow account? A: Authentication is optional but strongly recommended for higher success rates. You can provide:
- Auto-login (recommended): Your Zillow email + password - cookies managed automatically
- Manual cookies: Extract cookies from browser - advanced users only
- No auth: Some properties accept unauthenticated contacts but success rate is lower
Q: How fast is contact submission? A: Typically 3-5 seconds per property. The actor fetches contact form metadata (1-2s), validates inputs, then submits your inquiry (1-2s). Batch submissions can process multiple properties in parallel for maximum efficiency.
Q: What data do I get back? A: Complete property details (address, price, beds, baths, sqft, property type, listing type, URL, image) PLUS owner/agent information (name, phone number, encoded ZUID). This data is valuable for follow-up tracking and CRM integration.
Q: What if I already contacted a property?
A: You'll receive success: false with errorCode: "DUPLICATE_SUBMISSION". This is normal - Zillow prevents duplicate contacts. The actor still returns all property and owner data for your records.
Q: Can I contact FSBOs specifically?
A: Yes! This is one of the primary use cases. Chain with a Zillow scraper (like zillow-bulk-scraper), filter results for listingType: "ForSaleByOwner", then call this actor with those ZPIDs. Example code provided in the Integration section above.
Q: How do I customize the message?
A: Provide a message field in your input. Use variables like property address, price, or days on market to personalize dynamically. See "Custom Message Templates" in Advanced Usage for examples by use case (agent, investor, wholesaler, renter).
Q: Can I batch contact multiple properties? A: Yes! Call the actor multiple times with different ZPIDs. For large batches (100+ properties), use the Apify API to run multiple actors in parallel. See "Batch Contact" example in Advanced Usage.
Q: What about rate limiting? A: Zillow has anti-spam measures. We recommend:
- Maximum 50-100 contacts per hour for single account
- Use authentication (email/password) for better success rates
- Don't contact the same property repeatedly (handled by DUPLICATE_SUBMISSION error)
- For high volume, consider multiple Zillow accounts or stagger submissions
Q: What phone number formats work? A: US and Canada only, in format +1XXXXXXXXXX (exactly 12 characters). Examples: +12125551234 (NYC), +14165551234 (Toronto), +13105551234 (LA). The actor validates before submission.
Q: Will I get a confirmation email?
A: Yes! Zillow sends a confirmation email to your contactEmail address confirming the inquiry was submitted. The property owner/agent also receives your inquiry with your contact information.
Q: Is my data secure? A: Yes. Your password is never stored - only session cookies are saved for reuse. All communication is HTTPS. Data is only sent to Zillow's official APIs. Your contact history is stored in your private Apify dataset (only you can access).
Q: What's the pricing? A: Simple flat rate: $45 per month for unlimited contacts, unlimited runs, all features included. No per-contact fees, no hidden charges. Cancel anytime. One FSBO listing or wholesale deal pays for years of usage.
Q: Can I integrate with my CRM? A: Absolutely! The actor returns structured JSON output including property details and owner contact information. Use Apify webhooks to send data to your CRM (Salesforce, HubSpot, Follow Up Boss, etc.) or build custom integrations via API.
Q: Can I schedule automated runs? A: Yes! Set up scheduled runs through Apify to automatically run daily/weekly/hourly. Perfect for "daily FSBO scraper โ contact new listings" workflows. See "Scheduled Automation" in Advanced Usage.
Q: What happens if a property is removed?
A: You'll receive success: false with errorCode: "PROPERTY_REMOVED" and a user-friendly error message. Your run still succeeds - only that specific contact fails. Continue processing other properties normally.
Q: Can I track response rates? A: The actor tracks successful contact submissions, but doesn't monitor owner/agent responses (Zillow sends responses to your email). To track responses, export contacts to your CRM and manually log follow-ups, or build a webhook that monitors your email inbox.
Q: Is this against Zillow's Terms of Service? A: The actor uses Zillow's official contact form submission API (the same API used by Zillow's own mobile apps and website). Use responsibly - only send legitimate inquiries with truthful information, don't spam, and follow housing laws. See Legal Compliance section.
Q: What if authentication fails? A: Check that your Zillow email/password are correct, or that your manual cookies are valid and recent. Zillow cookies expire after ~30 days. The actor will return a clear error message. Try logging into Zillow manually first to verify your credentials.
Q: Can I use this for rental applications? A: Yes! The same API works for rentals. However, if you're specifically applying for rentals (not just inquiring), consider our dedicated rental application actor which handles rental-specific workflows. This actor is better for general inquiries and sales properties.
Q: How is this different from the rental application actor? A: This actor (Contact API) works for ALL property types (sales, rentals, FSBO, etc.) and returns owner/agent data - perfect for lead generation. Rental application actor is specialized for rental applications only with rental-specific features. Use this actor for: FSBO outreach, investor lead gen, buyer inquiries, rental inquiries. Use rental actor for: formal rental applications.
Q: How do I track which owners/agents responded to my inquiries? A: Use the complementary Zillow Message Inbox API to export your conversations. After contacting properties with this actor, wait 24-48 hours, then run the Inbox API to see who responded. This lets you measure response rates, track deal pipeline, and automate follow-up. See "Track Responses" section for complete workflow example.
๐ Getting Started
1. Account Setup
- Sign up for Apify (free tier available, no credit card required for trial)
- Subscribe to Zillow Contact API for $45/month (cancel anytime)
- Get your API token from account settings (for programmatic access)
2. Prepare Your Inputs
- Authentication (optional but recommended):
- Option A: Zillow email + password (auto-login, cookies managed automatically)
- Option B: Manual cookies from browser (advanced users)
- Property identification:
- Find ZPID (8-10 digit property ID in Zillow URL)
- OR copy full Zillow property URL (both direct and speaking URLs supported)
- Your contact information:
- Full name (as you want it to appear)
- Email address (where owner/agent will respond)
- Phone number in format +1XXXXXXXXXX (US/Canada only)
- Custom message (optional):
- Write personalized message based on your use case
- Or use professional default template
3. Submit Your First Contact
- Click "Start" on the actor page with your input configuration
- Monitor progress in real-time through the run log (typically completes in 3-5 seconds)
- Check dataset output for:
success: trueconfirmation- Full property details (address, price, beds, baths, etc.)
- Owner/agent contact information (name, phone, encoded ZUID)
- Check your email for Zillow's confirmation message
4. Scale & Automate (Recommended)
- Chain with search actors:
- Use
zillow-bulk-scraperto find FSBOs, price drops, or target properties - Filter results programmatically (listing type, days on market, price range)
- Call this actor to contact filtered properties automatically
- Use
- Set up scheduled runs:
- Daily FSBO monitoring at 9 AM
- Hourly price drop checks
- Weekly expired listing outreach
- Integrate webhooks:
- Send successful contacts to your CRM
- Slack notifications for new leads
- Custom dashboards for tracking ROI
- Build custom workflows:
- Search โ Filter โ Contact โ Log pipeline
- Multi-platform orchestration (Zillow + Redfin + Realtor.com)
- Response tracking and follow-up automation
5. Monitor Performance
- Track success rates by property type (FSBO vs agent listing)
- Measure response times from owners/agents
- Calculate ROI (contacts โ responses โ deals closed)
- Optimize message templates based on results
- A/B test different outreach strategies
6. Track Responses & Close Deals
- Export conversations with Zillow Message Inbox API to see who responded
- Match responses to contacted properties by ZPID
- Calculate metrics - response rate, lead quality, time to reply
- Follow-up automation - Re-engage hot leads, qualify interest level
- Pipeline management - Export to CRM with conversation history
- Deal closure - Track which contacts converted to appointments/offers/deals
Complete workflow: Contact API (send) โ Inbox API (track) โ CRM (follow-up) โ Deals (close)
๐ง Support
- Email: max@mapa.slmail.me
- Feature Requests: Email or submit via issues
- Response Time: Typically within 24 hours
๐ฏ Start Generating Real Estate Leads Now
Automate your real estate lead generation - contact 100+ property owners in minutes instead of hours, with complete property and owner data for seamless CRM integration. One deal pays for years of usage.