Zillow Message Inbox API š¬
Pricing
$35.00/month + usage
Zillow Message Inbox API š¬
Export both Zillow inboxes (rental & buying) programmatically. Extract your conversations with full message history in seconds. CRM integration, legal documentation, archival. Cookie authentication. Structured JSON output. $35/month unlimited extractions. Property managers & agents.
Pricing
$35.00/month + usage
Rating
0.0
(0)
Developer

ClearPath
Actor stats
0
Bookmarked
3
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Zillow Message Inbox API | Extract Rental & Buying Conversations
Export your Zillow inbox conversations programmatically - Extract complete message threads from both Rental Hub and Buying inboxes with full authentication support and structured JSON output.
- š Auto-Login & Manual Cookies
- š¬ Full Conversation History
- š Dual Inbox Support
š Changelog
2025-11-19 - Rental Conversation Counts
- Conversation statistics - Rental output now includes
countsobject with unread count, not-replied-to count, and total conversation count - Automatic fetching - Always enabled for rental inbox mode, no additional configuration needed
2025-11-19 - Auto-Login Feature
- Email/password authentication - Login automatically, no manual cookie extraction
- Persistent cookie storage - Cookies saved and reused across runs until expiration
- Smart fallback - Tries credentials ā stored cookies ā manual cookies automatically
- Backward compatible - Manual cookies still fully supported
š° Pricing
$35/month - Flat rate, unlimited extractions
- ā No per-conversation fees - Extract as many conversations as you need
- ā Unlimited runs - Run the actor as often as you want
- ā No hidden costs - What you see is what you pay
Compare to alternatives:
- Manual export: Impossible for bulk conversations
- API access: Not available for inbox data
- Manual copying: Hours of work for 60+ conversations
What you get for $35/month:
- Access to both Rental Hub and Buying inboxes
- Optional full conversation history extraction
- Clean, structured JSON output
šÆ What It Does
The Zillow Message Inbox Exporter programmatically extracts your Zillow conversations from both Rental Hub inbox (for apartment hunters / landlords / property managers) and Buying inbox (for buyers / agents).
Perfect for:
- š Archiving conversations for legal documentation and record-keeping
- š¢ CRM integration - Import Zillow conversations into your property management system
- š Analytics - Analyze response times, inquiry patterns, and conversion rates
- āļø Legal protection - Maintain complete communication records for tenant disputes
- š Multi-account management - Export conversations from multiple Zillow accounts
What makes it unique:
- First and only Actor to support Rental Hub and Buying inboxes
- Optional full conversation history - Not just previews, complete message threads
- Secure cookie-based authentication - No credentials stored, no third-party access
⨠Key Features
š Multiple Authentication Methods
Auto-login (Recommended): Email/password authentication with automatic cookie management
- Login once, cookies automatically saved and reused
- No manual cookie extraction needed
- Cookies persist across runs until expiration
- Passwords never stored, only session cookies
Manual cookies (Alternative): Traditional browser export method
- Full backward compatibility
- Uses standard browser cookies (zgsession, loginmemento, etc.)
- Same authentication your browser uses
š¬ Dual Inbox Support
Access both Rental Hub and Buying inbox conversations in a single run.
- Rental Hub Inbox - Property managers, landlords, rental applications
- Buying Inbox - Real estate agents, buyers, home purchase inquiries
- Both Mode - Extract from both inboxes simultaneously
- Unified JSON output - Clean, consistent data structure
š Full Conversation History
Go beyond conversation previews - extract complete message threads with all historical messages.
- Preview mode (default) - Fast extraction, conversation summaries
- Full history mode - Complete message threads, all participants, timestamps
- Configurable via
fetchFullConversationsparameter - Handles pagination automatically for long conversations
šÆ Flexible Extraction Modes
Choose exactly what you need - rental conversations, buying conversations, or both.
- Mode: "rental" - Rental Hub inbox only
- Mode: "buying" - Buying inbox only
- Mode: "both" - Both inboxes in one run
- Separate error handling - partial success supported
š Clean, Structured Output
Well-formatted JSON with consistent structure across both inbox types.
- Conversation metadata (ID, property, participants)
- Message content with timestamps
- Sender/recipient information
- Attachment references
- System message filtering
š Use Cases
šØāš¼ Property Managers
Archive tenant inquiries and application conversations
Property managers handle hundreds of rental inquiries monthly. Export conversations for:
- CRM integration (import into property management software)
- Response time tracking and team performance metrics
- Legal documentation for tenant disputes
- Backup before Zillow deletes old conversations
- Multi-property conversation management
Example workflow:
- Run actor daily to extract new conversations
- Import JSON into Airtable/Google Sheets for tracking
- Monitor response times and conversion rates
- Archive conversations for legal compliance
š Landlords
Maintain complete communication records
Individual landlords need conversation records for:
- Legal protection in tenant disputes
- Tracking application progress and tenant screening
- Reference checking communication history
- Tax documentation and expense tracking
- Historical records for future reference
šļø Real Estate Professionals
Track buyer conversations and lead management
Real estate agents use buying inbox for:
- Lead tracking and CRM integration
- Client communication history
- Follow-up scheduling and reminders
- Performance analytics and conversion tracking
- Team collaboration and handoff documentation
š„ Renters
Export communication for legal documentation
Renters need conversation exports for:
- Landlord-tenant dispute evidence
- Application timeline documentation
- Proof of communication for legal proceedings
- Moving records and apartment search history
- Reference for future rental applications
š» Developers & Integrators
Automate inbox workflows and build integrations
Developers can use the API to:
- Build custom CRM integrations
- Create automated response time tracking
- Develop tenant screening automation
- Build analytics dashboards
- Integrate with Slack/Discord/email notifications
š Quick Start
Basic Example - Auto-Login (Recommended)
Extract your Rental Hub conversations using email/password:
{"email": "your.email@example.com","password": "your-password","mode": "rental"}
Returns: All rental conversations with preview messages (~60 conversations in 5-10 seconds)
Note: Cookies automatically saved and reused on next run.
Alternative - Manual Cookies
Extract using manual browser cookies:
{"cookies": "zgsession=1|abc123; loginmemento=1|xyz789; _px3=...; ZILLOW_SID=1|...; zjs_user_id=...","mode": "rental"}
Returns: Same as auto-login, but requires cookie extraction
Advanced Example - Both Inboxes with Full History
Extract both rental and buying conversations with complete message threads:
{"email": "your.email@example.com","password": "your-password","mode": "both","fetchFullConversations": true}
Returns: Complete conversation history from both inboxes (~60-120 conversations in 30-60 seconds)
Automation Example - Scheduled Daily Export
Set up daily automated extraction for archival:
- Create an Apify Task with this Actor
- Set schedule: Daily at 9 AM
- Configure webhook to send data to your CRM/database
- Enable email notifications for failures
{"email": "your.email@example.com","password": "your-password","mode": "both","fetchFullConversations": false}
Note: With auto-login, cookies persist across scheduled runs - no manual updates needed.
š Input Parameters
Authentication (Choose One Method)
Method 1: Auto-Login (Recommended)
| Parameter | Type | Description | Example |
|---|---|---|---|
| string | Your Zillow account email | "your.email@example.com" | |
| password | string | Your Zillow account password | "your-password" |
Method 2: Manual Cookies (Alternative)
| Parameter | Type | Description | Example |
|---|---|---|---|
| cookies | string | Zillow authentication cookies. Supports JSON format and browser cookie string format. | See authentication methods below |
Note: Provide either (email + password) OR cookies. Not both.
Required Parameters
| Parameter | Type | Description | Example |
|---|---|---|---|
| mode | string | Which inbox(es) to extract: "rental", "buying", or "both" | "both" |
Optional Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| fetchFullConversations | boolean | false | Fetch complete message history for each conversation. Increases runtime but provides full thread data. |
š Authentication Methods
Method 1: Auto-Login (Recommended)
Simplest method - just provide email and password:
{"email": "your.email@example.com","password": "your-password"}
How it works:
- Actor logs into Zillow automatically
- Cookies extracted and saved
- Cookies reused on subsequent runs
- Re-login only when cookies expire
Storage locations:
- Local:
shared/cookies.json - Apify: Named KV store
"zillow-session-store"
Security:
- Passwords never stored, only session cookies
- Cookies valid for 30-90 days
- Automatic re-authentication when needed
Method 2: Manual Cookies (Alternative)
For users who prefer manual cookie extraction:
Step-by-step:
- Install "Get cookies.txt LOCALLY" extension (Firefox / Chrome)
- Open Zillow.com and log in
- Click extension icon ā Select JSON format
- Copy and paste into Actor's
cookiesinput
Required cookies:
zgsession, loginmemento, _px3, ZILLOW_SID, zjs_user_id
Supported formats:
JSON format:
{"zgsession": "1|abc123","loginmemento": "1|xyz789","_px3": "...","ZILLOW_SID": "1|...","zjs_user_id": "..."}
Browser string format:
zgsession=1|abc123; loginmemento=1|xyz789; _px3=...; ZILLOW_SID=1|...; zjs_user_id=...
š¤ Output Structure
The Actor outputs structured JSON with separate sections for rental and buying inbox data.
ā ļø IMPORTANT: The examples below show simplified structures for readability. The actual output contains 30+ additional fields per conversation including timestamps, contact info, property details, application workflow status, and more. Run the Actor to see the complete structure with all fields.
Output Format
{"rental": {"conversations": [...],"counts": {"unreadCount": 0,"notRepliedToCount": 0,"totalConversationsCount": 2},"pageConversationCount": 2,"hasNextPage": false},"buying": {"conversations": [...]},"mode": "both","scrapedAt": "2025-11-18T13:49:23.353410"}
Note:
- Rental inbox includes
countsobject with conversation statistics (unread, not replied to, total count) - Buying inbox does NOT include pagination fields or counts - only rental inbox has these fields
Rental Conversation Example
Note: Rental conversations do NOT have a participants array - instead, participant info is in referenceName, referenceEmail, landlordName, etc.
{"conversationId": "82983937147872*****","listingAlias": "3a6w2gnhfumr3","address": "600 W 246th St, Bronx, NY 10471","addressDetails": {"stateAbbrev": "NY"},"listingName": "Briar Hill Luxury Apartments","beds": "Studio to 1 bed","pricing": "$2,022+","pricingDisplay": "LEGACY","pricingDetails": {"isHasBaseRentAndFees": true,"baseRentMin": 4369.0,"baseRentMax": 12653.0},"numBathroomsLow": "1.0","numBathroomsHigh": "1.0","photoUrl": "https://photos.zillowstatic.com/fp/601615a076577c5ca06f83ed2e9d9ffe-rentals_thumb_180_180.webp","landlordName": "Glenwood","landlordPhoneNumber": "212-535-0500","referenceName": "Apify User","referenceEmail": "4z66eede1vdxgi4rwp0d******@convo.zillow.com","referenceRelayEmail": "4z66eede1vdxgi4rwp0d******@convo.zillow.com","inquiryId": "1203375813389*****","referenceId": "120337581338992*****","referenceIdType": "hotpadsInquiryId","isActive": true,"hasUnreadMessage": false,"mostRecentMessageTimestampMs": 1763453374186,"lastReadTimestampMs": 1763457504675,"notRepliedTo": false,"propertyTypeCode": 1,"isMultifamily": true,"isApplicationsAllowed": false,"isApplicationEnabledByLandlord": false,"applicationAlreadySent": false,"application": {"isApplicationsAllowed": false,"isApplicationEnabledByLandlord": false,"applicationAlreadySentToRenter": false},"acceptsReplies": true,"isConversationBlockedByZillow": false,"status": {"isArchived": false,"isSpam": false,"isScheduled": false,"applicationMarkedSent": false,"isFavorite": false,"isConversationBlockedByZillow": false},"note": {},"conversation": [{"messageId": "6372957625014*****","senderName": "Apify User","senderEmail": "4z66eede1vdxgi4rwp0d******@convo.zillow.com","senderRelayEmail": "4z66eede1vdxgi4rwp0d******@convo.zillow.com","isMessageOwner": true,"message": "I'm interested in your property and would like to move forward. Can you send me an application?","messageDate": "Nov 18, 2025 3:08:06 AM","messageDateMs": 1763453286778,"messageType": "listingMessage","conversationId": "82983937147872*****","uiTreatmentType": "lowPriority","attachments": [],"hasDeletedAttachments": false}]}
Key field notes:
listingAlias: Listing ID (NOTlistingId)address: Property address (NOTlistingAddress)pricing: Price string (NOTlistingPrice)hasUnreadMessage: Boolean (NOTunreadCountnumber)mostRecentMessageTimestampMs: Unix timestamp in milliseconds (NOTlastMessageTimeISO string)status: Object with multiple booleans (NOT string "active")messageDateMs: Unix timestamp (NOTtimestamp)- No
participantsarray - usereferenceName,referenceEmail,landlordNameinstead
Buying Conversation Example
ā ļø CRITICAL: Property data (zpid, address, price, photo) is NOT at conversation level - it's embedded in messages.messageList[].richObjects[]. See example below.
{"__typename": "ZIMConversation","conversationId": "13abb962-c3f1-11f0-8930-fe89c3731c35","createDate": "2025-11-17T20:07:43.306201559Z","updateDate": "2025-11-17T20:29:26.873527244Z","isArchived": false,"header": {"id": "X1--*********"},"participants": [{"__typename": "ZIMParticipant","id": "X1--*********","unreadMessageCount": 0,"persona": "CONSUMER","participantDetails": {"__typename": "User","name": "Apify User","firstName": "Apify","lastName": "User","displayName": "zuser20251104004910262","screenName": "zuser20251104004910262","coreProfileData": {"profilePhotoUrl": "https://www.zillowstatic.com/static/images/nophoto_h_i.png"}}},{"__typename": "ZIMParticipant","id": "X1--*********","unreadMessageCount": 0,"persona": "AGENT","participantDetails": {"__typename": "PAAgent","name": "Claudia ******","photoUrl": "https://photos.zillowstatic.com/fp/2d701a865a8edbdfda32444a907****-h_l.jpg","email": "claudiacort****@gmail.com","screenName": "claudiacortez****","phone": "(419) 517-4543","businessName": "KELLER WILLIAMS CITYWIDE","profile": {"__typename": "AgentProfile","ratingAverage": 0,"ratingCount": 0,"profileUrl": "https://www.zillow.com/profile/claudiacortez****","officeCity": "Maumee","officeState": "OH"}}}],"messages": {"cursor": null,"maxMessages": 250,"messageList": [{"__typename": "ZIMStandardUserMessage","conversationId": "13abb962-c3f1-11f0-8930-******","createDate": "2025-11-17T20:07:43.432828642Z","messageId": "1990512193122012165ae******","senderId": "X1-*********","text": "I am interested in 1024 6th St, Sandusky, OH 44870.","persona": "CONSUMER","attachments": [],"richObjects": [{"__typename": "PropertyRichObject","type": "PROPERTY","version": 1.0,"state": {"zpid": 34765492},"fallback": {"__typename": "CardRichObject","type": "CARD","version": 1.0,"state": {"body": "1024 8th St","imageUrl": "https://photos.zillowstatic.com/fp/4dec1e912c931c99a8c4c17ea429d00c-p_f.jpg","subheading": "","tags": [],"title": "202000","url": "https://www.zillow.com/homedetails/1024-5th-St-Sandusky-OH-44870/33778498_zpid"}}}]}]},"preview": {"__typename": "ZIMStandardUserMessage","conversationId": "13abb962-c3f1-11f0-8930-******","createDate": "2025-11-17T20:29:26.873527244Z","messageId": "1990517660153660074b3b39*****","richObjects": [],"senderId": "X1--*********","text": "Hi ***, this is *******...","persona": null,"attachments": []}}
Key field notes:
participants[].id: Participant ID (NOTuserId)participants[].persona: Role enum: "CONSUMER", "AGENT", or "ZILLOW" (NOTtype)participantDetails: Deeply nested - structure varies by__typename(User vs PAAgent vs ZillowMessagingUser)messages.messageList[].text: Message content (NOTcontent)messages.messageList[].createDate: ISO timestamp (NOTtimestamp)updateDate: Last activity (NOTlastActivity)- Property data is in
richObjects:richObjects[0].state.zpid: Property ID (33778498)richObjects[0].fallback.state.body: Address ("1024 5th St")richObjects[0].fallback.state.title: Price ("202000")richObjects[0].fallback.state.imageUrl: Property photorichObjects[0].fallback.state.url: Listing URL
How to Extract Property Data from Buying Conversations
Property information is embedded in message richObjects, not at the conversation level:
# Get property zpidfirst_message = conversation["messages"]["messageList"][0]if first_message.get("richObjects"):zpid = first_message["richObjects"][0]["state"]["zpid"]# Get property details from fallback cardfallback = first_message["richObjects"][0]["fallback"]["state"]address = fallback["body"] # "1024 5th St"price = fallback["title"] # "202000"photo_url = fallback["imageUrl"]listing_url = fallback["url"]
Full Conversation History Mode
When fetchFullConversations: true, each conversation includes complete message threads:
{"conversationId": "conv_abc123","conversation": [{"messageId": "msg_001","message": "First message...","timestamp": "2025-01-01T10:00:00Z"},{"messageId": "msg_002","message": "Second message...","timestamp": "2025-01-01T10:15:00Z"},// ... all 50+ messages in the thread{"messageId": "msg_050","message": "Most recent message...","timestamp": "2025-01-15T16:30:00Z"}],"totalMessages": 50}
š§ Advanced Usage
Daily Archival Automation
Scenario: Property manager wants daily backups of all tenant conversations
Setup:
- Create Apify Task with schedule: Daily at 9 AM
- Use mode:
"rental"withfetchFullConversations: falsefor speed - Configure webhook to send JSON to your database/CRM
- Set up email notifications for failures
Input:
{"cookies": "your-cookies-here","mode": "rental","fetchFullConversations": false}
Automation:
- Schedule:
0 9 * * *(cron format) - Webhook: POST to
https://your-crm.com/api/conversations - Notification: Email on failure
- Storage: Apify dataset (auto-retention)
CRM Integration Workflow
Scenario: Real estate agency wants to sync buying conversations to Salesforce
Workflow:
- Run actor every 4 hours
- Extract buying inbox only
- Parse JSON output
- Map conversation fields to Salesforce Lead objects
- Upload via Salesforce API
- Track sync status in database
Code example (Python):
from apify_client import ApifyClientimport salesforce_apiclient = ApifyClient("your-api-token")# Run the actorrun = client.actor("clearpath/zillow-message-inbox-api").call(run_input={"cookies": "your-cookies-here","mode": "buying","fetchFullConversations": True})# Get resultsdataset_items = client.dataset(run["defaultDatasetId"]).list_items().items# Sync to Salesforcefor item in dataset_items:if item["buying"]:for conv in item["buying"]["conversations"]:salesforce_api.create_lead({"name": conv["participants"][0]["name"],"property": conv["propertyAddress"],"source": "Zillow Buying Inbox","notes": conv["messages"]["messageList"]})
Legal Documentation Export
Scenario: Tenant dispute requires complete conversation history as evidence
Process:
- Run actor once with
mode: "rental"andfetchFullConversations: true - Extract specific conversation by conversationId
- Generate PDF report with timestamps
- Submit to legal counsel
Input:
{"cookies": "your-cookies-here","mode": "rental","fetchFullConversations": true}
Post-processing:
import jsonfrom datetime import datetime# Load actor outputwith open("conversations.json") as f:data = json.load(f)# Find specific conversationtarget_conv = next(c for c in data["rental"]["conversations"]if c["conversationId"] == "disputed-conversation-id")# Format for legal documentlegal_doc = {"case_number": "2025-TX-12345","property": target_conv["listingAddress"],"parties": target_conv["participants"],"messages": [{"timestamp": msg["timestamp"],"sender": msg["senderName"],"content": msg["message"]}for msg in target_conv["conversation"]],"exported_date": datetime.now().isoformat()}# Generate PDF or submit to legal platform
Response Time Analytics
Scenario: Property management company tracks team response times
Metrics to track:
- Average time to first response
- Average time between messages
- Response rates by team member
- Conversion rate (inquiry ā showing)
Analysis:
from datetime import datetimedef analyze_response_times(conversations):metrics = []for conv in conversations:messages = conv["conversation"]# Find first tenant message and first landlord responsetenant_msg = next(m for m in messages if m["type"] == "renter")landlord_msg = next(m for m in messages if m["type"] == "landlord")# Calculate response timetenant_time = datetime.fromisoformat(tenant_msg["timestamp"])landlord_time = datetime.fromisoformat(landlord_msg["timestamp"])response_time = (landlord_time - tenant_time).total_seconds() / 3600 # hoursmetrics.append({"conversation_id": conv["conversationId"],"property": conv["listingAddress"],"response_time_hours": response_time,"responder": landlord_msg["senderName"]})# Calculate averagesavg_response_time = sum(m["response_time_hours"] for m in metrics) / len(metrics)return {"average_response_hours": avg_response_time,"fastest_response": min(metrics, key=lambda x: x["response_time_hours"]),"slowest_response": max(metrics, key=lambda x: x["response_time_hours"]),"all_responses": metrics}
Multi-Account Management
Scenario: Real estate team manages conversations across 5 Zillow accounts
Setup:
- Export cookies for each account
- Create separate Apify Tasks per account
- Run all tasks simultaneously
- Aggregate data in central database
- Build unified dashboard
Task configuration per account:
{"cookies": "account-1-cookies","mode": "both","fetchFullConversations": false}
Aggregation script:
from apify_client import ApifyClientclient = ApifyClient("your-api-token")accounts = [{"name": "Downtown Office", "task_id": "task_123"},{"name": "Suburb Office", "task_id": "task_456"},{"name": "Luxury Properties", "task_id": "task_789"}]all_conversations = []for account in accounts:run = client.task(account["task_id"]).call()data = client.dataset(run["defaultDatasetId"]).list_items().items[0]# Tag with account namefor conv in data.get("rental", {}).get("conversations", []):conv["account"] = account["name"]all_conversations.append(conv)# Now you have unified data from all accountsprint(f"Total conversations across all accounts: {len(all_conversations)}")
š API Integration
Python Example
from apify_client import ApifyClient# Initialize the ApifyClient with your API tokenclient = ApifyClient("your-api-token")# Prepare Actor inputrun_input = {"cookies": "zgsession=1|abc; loginmemento=1|xyz; _px3=...; ZILLOW_SID=1|...; zjs_user_id=...","mode": "both","fetchFullConversations": True}# Run the Actor and wait for it to finishrun = client.actor("clearpath/zillow-message-inbox-api").call(run_input=run_input)# Fetch results from the Actor's datasetdataset_items = client.dataset(run["defaultDatasetId"]).list_items().items# Process the resultsfor item in dataset_items:rental_convos = item.get("rental", {}).get("conversations", [])buying_convos = item.get("buying", {}).get("conversations", [])print(f"Rental conversations: {len(rental_convos)}")print(f"Buying conversations: {len(buying_convos)}")# Access individual conversationsfor conv in rental_convos:print(f"Property: {conv['listingAddress']}")print(f"Messages: {len(conv['conversation'])}")
JavaScript/Node.js Example
import { ApifyClient } from 'apify-client';// Initialize the ApifyClient with your API tokenconst client = new ApifyClient({token: 'your-api-token',});// Prepare Actor inputconst input = {cookies: "zgsession=1|abc; loginmemento=1|xyz; _px3=...; ZILLOW_SID=1|...; zjs_user_id=...",mode: "both",fetchFullConversations: true};// Run the Actor and wait for it to finishconst run = await client.actor("clearpath/zillow-message-inbox-api").call(input);// Fetch results from the Actor's datasetconst { items } = await client.dataset(run.defaultDatasetId).listItems();// Process the resultsitems.forEach((item) => {const rentalConvos = item.rental?.conversations || [];const buyingConvos = item.buying?.conversations || [];console.log(`Rental conversations: ${rentalConvos.length}`);console.log(`Buying conversations: ${buyingConvos.length}`);// Access individual conversationsrentalConvos.forEach((conv) => {console.log(`Property: ${conv.listingAddress}`);console.log(`Messages: ${conv.conversation.length}`);});});
cURL Example
# Run the Actorcurl -X POST "https://api.apify.com/v2/acts/clearpath~zillow-message-inbox-api/runs?token=your-api-token" \-H "Content-Type: application/json" \-d '{"cookies": "zgsession=1|abc; loginmemento=1|xyz; _px3=...; ZILLOW_SID=1|...; zjs_user_id=...","mode": "both","fetchFullConversations": true}'# Get the run statuscurl "https://api.apify.com/v2/acts/clearpath~zillow-message-inbox-api/runs/last?token=your-api-token"# Download the datasetcurl "https://api.apify.com/v2/acts/clearpath~zillow-message-inbox-api/runs/last/dataset/items?token=your-api-token" \> conversations.json
š¾ Data Export
JSON (Default)
The Actor outputs clean JSON that can be directly consumed by most systems:
# Download via Apify APIcurl "https://api.apify.com/v2/datasets/{dataset-id}/items" > conversations.json
CSV Conversion
Convert to CSV for spreadsheet analysis:
import jsonimport csv# Load JSON datawith open("conversations.json") as f:data = json.load(f)# Flatten to CSVwith open("conversations.csv", "w", newline="") as f:writer = csv.writer(f)writer.writerow(["ConversationID", "Property", "LastMessage", "ParticipantCount", "MessageCount"])for conv in data[0]["rental"]["conversations"]:writer.writerow([conv["conversationId"],conv["listingAddress"],conv["lastMessageTime"],len(conv["participants"]),len(conv["conversation"])])
Google Sheets Integration
Import conversations directly to Google Sheets:
import gspreadfrom oauth2client.service_account import ServiceAccountCredentials# Authenticate with Google Sheetsscope = ['https://spreadsheets.google.com/feeds']creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)client = gspread.authorize(creds)# Open spreadsheetsheet = client.open("Zillow Conversations").sheet1# Write datafor conv in conversations:sheet.append_row([conv["conversationId"],conv["listingAddress"],conv["lastMessageTime"],len(conv["conversation"])])
Database Storage
Store in PostgreSQL for querying and analytics:
import psycopg2import jsonconn = psycopg2.connect(host="localhost",database="zillow_data",user="user",password="password")cur = conn.cursor()# Create tablecur.execute("""CREATE TABLE IF NOT EXISTS conversations (id SERIAL PRIMARY KEY,conversation_id VARCHAR(255),property_address TEXT,conversation_type VARCHAR(50),message_count INTEGER,last_message_time TIMESTAMP,data JSONB)""")# Insert conversationsfor conv in conversations:cur.execute("""INSERT INTO conversations(conversation_id, property_address, conversation_type, message_count, last_message_time, data)VALUES (%s, %s, %s, %s, %s, %s)""", (conv["conversationId"],conv["listingAddress"],conv["conversationType"],len(conv["conversation"]),conv["lastMessageTime"],json.dumps(conv)))conn.commit()
āļø Automation
Scheduled Runs
Set up automatic extraction on a schedule:
- Navigate to Apify Console ā Tasks
- Create new Task with this Actor
- Configure schedule:
- Daily:
0 9 * * *(9 AM every day) - Every 4 hours:
0 */4 * * * - Weekly:
0 9 * * 1(Monday 9 AM)
- Daily:
- Set retention policy for datasets (e.g., 30 days)
Webhook Integration
Send results to external systems automatically:
{"webhookUrl": "https://your-system.com/api/conversations","webhookPayloadTemplate": {"rentalCount": "{{rental.conversations.length}}","buyingCount": "{{buying.conversations.length}}","data": "{{data}}"}}
Supported webhook targets:
- Zapier
- Make (Integromat)
- n8n
- Custom API endpoints
- Slack/Discord notifications
API Chaining
Trigger downstream Actors based on results:
// Run inbox extractorconst inboxRun = await client.actor("clearpath/zillow-message-inbox-api").call(input);const conversations = await client.dataset(inboxRun.defaultDatasetId).listItems();// Trigger analysis Actorawait client.actor("conversation-analyzer").call({conversations: conversations.items[0]});// Trigger notification Actorawait client.actor("notification-sender").call({newConversations: conversations.items[0].rental.conversations.length});
Error Notifications
Get alerted when Actor fails:
- Configure email notifications in Task settings
- Set up Slack webhook for instant alerts
- Use monitoring service (e.g., UptimeRobot) to check run status
- Implement retry logic for transient failures
š” Best Practices
Cookie expiration: Zillow cookies typically expire after 30-90 days of inactivity. If you see authentication errors:
- Log out and log back into Zillow
- Export fresh cookies using the browser extension
- Update Actor input with new cookies
- Re-run the Actor
ā Frequently Asked Questions
General Questions
Q: Should I use auto-login or manual cookies?
A: Auto-login (email/password) is recommended. It's simpler - no browser extensions needed, cookies automatically saved and reused. Manual cookies are an alternative for users who prefer not to share credentials.
Q: Are my credentials and cookies secure?
A: Yes. Passwords are never stored and the Apify Secret Input is used - only session cookies are saved. Cookies are used only for Zillow API requests during runtime. On Apify platform, cookies stored in secure KV store.
Q: How long do auto-login cookies last?
A: Cookies typically valid for 30-90 days. Actor automatically re-authenticates when cookies expire.
Q: How do I get manual cookies (alternative method)?
A: Use "Get cookies.txt LOCALLY" browser extension (Firefox / Chrome). Visit Zillow.com while logged in, click extension icon, select JSON format, copy output. See "Authentication Methods" section for details.
Q: What's the difference between Rental Hub Inbox and Buying Inbox?
A:
- Rental Hub Inbox: For landlords and property managers. Contains conversations about rental properties, lease applications, and tenant inquiries.
- Buying Inbox: For home buyers and real estate agents. Contains conversations about properties for sale, showing requests, and purchase offers.
You can extract from either or both in a single run.
Q: How much does it cost per conversation?
A: There are no per-conversation fees. You pay a flat $35/month and can extract unlimited conversations. Run the Actor as many times as you want with no additional charges.
Q: Can I extract conversations from multiple Zillow accounts?
A: Yes! Run the Actor multiple times with different cookies (one set per account). You can also create separate Apify Tasks for each account and run them simultaneously.
Technical Questions
Q: Why use fetchFullConversations?
A: By default, the Actor returns conversation previews (last 1-3 messages). Enable fetchFullConversations to get complete message history. This is useful for:
- Legal documentation (need full thread)
- Response time analytics (need all timestamps)
- CRM import (need complete context)
- Archival (need historical record)
Trade-off: Increases runtime from ~10 seconds to ~60 seconds for 60 conversations.
Q: How long do Zillow cookies last?
A: Zillow cookies typically expire after 30-90 days of inactivity. If you see authentication errors, log out and log back into Zillow, then export fresh cookies.
Q: What happens if my cookies expire during a run?
A: The Actor will fail with an authentication error. You'll receive an error message indicating invalid cookies. Simply export fresh cookies and re-run the Actor.
Q: Can I filter conversations by date or property?
A: Currently, the Actor extracts all available conversations (typically last 60 per inbox). Post-processing filtering is recommended:
# Filter by daterecent = [c for c in conversations if c["lastMessageTime"] > "2025-01-01"]# Filter by propertyproperty_convs = [c for c in conversations if "Main St" in c["listingAddress"]]
Q: How many conversations can I extract?
A: The Actor fetches all available conversations from your inbox, typically:
- Rental Hub: ~60 conversations
- Buying Inbox: ~60 conversations
- Total: ~120 conversations in "both" mode
Zillow automatically archives older conversations, so you'll get the most recent active threads.
Q: Does the Actor delete or modify my conversations?
A: No. The Actor only reads data - it never modifies, deletes, or sends messages. Your Zillow inbox remains unchanged.
Q: Can I use this Actor without an Apify account?
A: No, you need an Apify account to run this Actor. However, Apify offers a free tier with $5/month in free usage credits, which is enough to test the Actor before subscribing.
Troubleshooting
Q: I'm getting "Invalid cookies" error. What should I do?
A: This means your cookies are expired or incorrect. Solutions:
- Log out and log back into Zillow.com
- Export fresh cookies using the browser extension
- Verify you have ALL 5 required cookies:
- ā
zgsession- Session identifier - ā
loginmemento- Authentication token - ā
_px3- Security validation - ā
ZILLOW_SID- Session ID - ā
zjs_user_id- User identifier
- ā
- Check cookie format - Should be valid JSON or semicolon-separated string
- Try a different browser - Firefox vs Chrome sometimes export differently
- Verify you're logged into the correct Zillow account
Q: The Actor is running but returning 0 conversations. Why?
A: Possible reasons:
- Your inbox is actually empty (no active conversations)
- Cookies are for a different Zillow account (verify you're logged into correct account)
- Cookie format is incorrect (verify JSON syntax)
Q: How do I know if fetchFullConversations is working?
A: Check the conversation array length in the output:
- Preview mode:
conversation.length= 1-3 (last few messages) - Full history mode:
conversation.length= 10-100+ (all messages)
If you still see 1-3 messages with fetchFullConversations: true, the conversation might only have 1-3 total messages.
Legal & Compliance
Billing & Subscription
Q: What's included in the $35/month subscription?
A: Everything:
- Unlimited Actor runs
- Unlimited conversations extracted
- Both rental and buying inbox access
- Full conversation history feature
- Residential proxies included
- Email support
- All future updates and bug fixes
Q: Are there any hidden fees?
A: No hidden fees. $35/month is the total cost. However, Apify charges separately for:
- Platform usage (compute/storage) - typically $0.50-2/month for this Actor
- Dataset storage beyond retention policy
- API calls if using Apify API
Total monthly cost: ~$36-38/month.
Q: Can I cancel anytime?
A: Yes, you can cancel your subscription at any time. You'll retain access until the end of your billing period.
Q: Is there a free trial?
A: Apify offers $5 in free monthly credits, which is enough to test the Actor before subscribing.
š Getting Started
Ready to export your Zillow conversations? Get started in 3 simple steps:
Step 1: Choose Authentication Method
Option A: Auto-Login (Recommended)
- Just need your Zillow email and password
- No browser extensions required
- Cookies automatically managed
Option B: Manual Cookies (Alternative)
- Install "Get cookies.txt LOCALLY" extension (Firefox / Chrome)
- Visit Zillow.com while logged in
- Export cookies in JSON format
Step 2: Configure and Run
- Open Actor input configuration
- Auto-login: Enter email + password OR Manual: Paste cookies
- Select mode:
"rental","buying", or"both" - (Optional) Enable
fetchFullConversations - Click "Start"
Step 3: Download Data
- Navigate to "Storage" ā "Dataset" tab
- Click "Export" ā Choose format (JSON, CSV, etc.)
- Download conversation data
- Import into your CRM/database/spreadsheet
Need help? Contact support at max@mapa.slmail.me
š§ Support
- Email: max@mapa.slmail.me
- Feature Requests: Email or submit via issues
- Response Time: Typically within 24 hours
āļø Legal Compliance
This actor extracts publicly available property listing data. Users are responsible for complying with applicable data protection regulations (GDPR in the EU, CCPA in the US).
Responsible Use: This tool is intended for legitimate real estate research, market analysis, and investment purposes. Do not use scraped data for spam, harassment, or any activities that violate privacy laws.
