๐Ÿ’ฌ Zillow Contact API - FSBO & Investor Lead Generator avatar
๐Ÿ’ฌ Zillow Contact API - FSBO & Investor Lead Generator

Pricing

$45.00/month + usage

Go to Apify Store
๐Ÿ’ฌ Zillow Contact API - FSBO & Investor Lead Generator

๐Ÿ’ฌ 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

ClearPath

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

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

ParameterTypeDescriptionDefault
emailstringZillow account email for auto-login (recommended). Cookies will be stored and reused.Optional*
passwordstringZillow account password. Required if email is provided. Never stored, only cookies saved.Optional*
cookiesstringAlternative: Manual cookies (JSON array, object, or string format). Advanced users only.Optional*
zpidintegerZillow Property ID (8-10 digits). Either ZPID or Property URL is required.Optional**
propertyUrlstringFull Zillow property URL. Supports direct (_zpid/) and speaking URLs. Either ZPID or URL required.Optional**
namestringYour full name as it should appear in the inquiry (e.g., "Sarah Johnson")Required
contactEmailstringYour email address where owner/agent can respondRequired
phoneNumberstringUS/Canada phone in format +1XXXXXXXXXX (exactly 12 characters)Required
messagestringYour 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 successfully
  • propertyDetails - 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 failed
  • error - Human-readable error description
  • errorCode - Machine-readable error code for programmatic handling
  • propertyDetails and owner - 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 available
  • INVALID_PHONE_NUMBER - Phone format validation failed
  • ZPID_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 ApifyClient
client = ApifyClient("your_apify_token")
# Step 1: Search for FSBO listings with zillow-bulk-scraper
print("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 results
search_results = client.dataset(search_run["defaultDatasetId"]).iterate_items()
# Step 3: Filter for FSBOs and contact owners
for 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 actor
contact_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 result
contact_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 drops
maxResultsPerLocation: 200
});
// Step 2: Get search results
const { items } = await client.dataset(searchRun.defaultDatasetId).listItems();
// Step 3: Filter and contact motivated sellers
const 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 complete
const results = await Promise.all(contactPromises);
// Report results
console.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:

  1. Search: Use zillow-bulk-scraper or zip-code-search to find properties
  2. Filter: Programmatically filter for FSBOs, price drops, days on market, property type
  3. Contact: Call this actor with filtered ZPIDs for automated outreach
  4. 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 ApifyClient
client = 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 details
agent_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 messages
success_count = 0
for 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 result
results = list(client.dataset(run["defaultDatasetId"]).iterate_items())
if results and results[0]["success"]:
success_count += 1
print(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 daily
const schedule = await client.schedules().create({
name: 'Daily FSBO Lead Generation',
actorId: 'your-workflow-actor-id', // Your orchestration actor
cronExpression: '0 9 * * *', // Daily at 9 AM
timezone: '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 FSBO
return `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 purchase
const 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 listings
return `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 applying
return `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 inquiry
return `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 example
const 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 ApifyClient
import time
client = 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 sense
error_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 errors
if attempt < max_retries - 1:
wait_time = 2 ** attempt # Exponential backoff: 1s, 2s, 4s
print(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 ** attempt
print(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"}
# Usage
result = 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

  1. Contact (this actor) - Send inquiries to FSBOs, investors, rental listings
  2. Wait - Give owners/agents 24-48 hours to respond
  3. Track (inbox actor) - Export conversations to see who responded
  4. Analyze - Measure response rates, track deal pipeline, calculate ROI
  5. 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 ApifyClient
import time
client = ApifyClient("your_apify_token")
# Step 1: Contact 50 FSBOs
print("๐ŸŽฏ Contacting 50 FSBOs...")
fsbo_zpids = [31656059, 458222521, 123456789, ...] # From scraper
contact_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 responses
print("โณ Waiting 48 hours for owner responses...")
time.sleep(48 * 60 * 60) # In production, use scheduled runs
# Step 3: Check inbox for responses
print("๐Ÿ“ฌ 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 properties
print("๐Ÿ“Š 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 metrics
contacted_zpids = {item["zpid"] for item in contact_results}
response_rate = (len(responded_zpids) / len(contacted_zpids)) * 100
print(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 up
for 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

FeatureContact API (this actor)Inbox API
PurposeSend inquiries to owners/agentsTrack responses and conversations
DirectionOutboundInbound
Use CaseLead generation, bulk outreachResponse tracking, ROI measurement
AuthenticationOptional (recommended)Required (auto-login or cookies)
OutputProperty + owner detailsComplete 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 client
client = ApifyClient("your_apify_token")
# Prepare contact input
run_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 contact
print("Contacting property owner...")
run = client.actor("zillow-contact-api-actor-id").call(run_input=run_input)
# Get contact result
print("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 client
const client = new ApifyClient({ token: 'your_apify_token' });
// Prepare contact input
const 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 contact
console.log('Contacting property owner...');
const run = await client.actor('zillow-contact-api-actor-id').call(input);
// Get contact result
console.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:

  1. Auto-login (recommended): Your Zillow email + password - cookies managed automatically
  2. Manual cookies: Extract cookies from browser - advanced users only
  3. 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

  1. Sign up for Apify (free tier available, no credit card required for trial)
  2. Subscribe to Zillow Contact API for $45/month (cancel anytime)
  3. Get your API token from account settings (for programmatic access)

2. Prepare Your Inputs

  1. Authentication (optional but recommended):
    • Option A: Zillow email + password (auto-login, cookies managed automatically)
    • Option B: Manual cookies from browser (advanced users)
  2. Property identification:
    • Find ZPID (8-10 digit property ID in Zillow URL)
    • OR copy full Zillow property URL (both direct and speaking URLs supported)
  3. 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)
  4. Custom message (optional):
    • Write personalized message based on your use case
    • Or use professional default template

3. Submit Your First Contact

  1. Click "Start" on the actor page with your input configuration
  2. Monitor progress in real-time through the run log (typically completes in 3-5 seconds)
  3. Check dataset output for:
    • success: true confirmation
    • Full property details (address, price, beds, baths, etc.)
    • Owner/agent contact information (name, phone, encoded ZUID)
  4. Check your email for Zillow's confirmation message
  1. Chain with search actors:
    • Use zillow-bulk-scraper to 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
  2. Set up scheduled runs:
    • Daily FSBO monitoring at 9 AM
    • Hourly price drop checks
    • Weekly expired listing outreach
  3. Integrate webhooks:
    • Send successful contacts to your CRM
    • Slack notifications for new leads
    • Custom dashboards for tracking ROI
  4. 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.