Redfin Real-Time Data Scraper — Listings & Agent Leads
Pricing
from $1.00 / 1,000 results
Redfin Real-Time Data Scraper — Listings & Agent Leads
Collect US property listings with listing-agent contact details — name, phone, email, brokerage, socials — across 60 metros. Filter by price, beds, baths, size, status, days on market. Structured JSON streams to your dataset in real time. Paid plans only; free accounts get a small sample.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Emmanuel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Redfin Real-Time Data Scraper
Collect US residential listings and listing-agent lead details from 60 supported metros — price, beds, baths, size, lot, year built, days on market, HOA, location, status, and the agent behind each listing — as clean, structured JSON streamed to your dataset in real time.
Built for real estate investors, wholesalers, agents, and growth teams that need fresh property data and the contact behind it, without slow, fragile, browser-based tooling.
⚠️ Paid plans only — please read
This Actor is paid-only. On the Apify free plan, every run exports a small sample (2 results per run by default) and then finishes gracefully with an upgrade note. To get the full, unlimited output you set in the input, run it on a paid Apify plan (any paid tier — Bronze and up). See Paid plans & the free-tier sample and the FAQ.
Why this Actor
| Redfin Real-Time Data Scraper | Typical browser-based tool | |
|---|---|---|
| Speed | Fast per-listing collection, results stream as they are ready | Often 5–15 s per listing |
| Memory | 512 MB default | 2–4 GB+ |
| Setup | Organized input UI, run immediately | Fragile selectors, constant maintenance |
| Output | Structured JSON, one row per listing, LLM-ready | Messy exports |
| Scale | Large runs — up to 100,000 rows per run | Usually capped far lower |
| Multi-market | Up to 60 metros in a single run | One market at a time |
| Lead details | Listing-agent contact block on every row | Rarely included |
What you get — one row per listing
Every row includes featureType (property_listing), source (redfin), and scrapedAt, so records are easy to filter, join, and pipe into any workflow.
Property data
| Field | Description |
|---|---|
propertyId, listingId | Stable identifiers for de-duplication and joins |
url | Public listing link |
address, street, city, state, zip | Full location breakdown |
neighborhood | Subdivision / area name when published |
latitude, longitude | Coordinates |
price, pricePerSqft | Current list price and computed $/sq ft |
beds, baths, sqft | Core size facts |
lotSize, yearBuilt | Lot size (sq ft) and build year |
daysOnMarket | How long the listing has been listed |
hoa | Monthly HOA fee when published |
propertyType | House, Condo, Townhouse, Multi-family, Land, Mobile, Co-op, Other |
status | Active, Coming soon, Pending, … |
searchLocation | Which metro in your input produced this row |
Lead details (enable in the input)
| Field | Description |
|---|---|
agentName | Listing agent's name |
brokerName | Agency / brokerage name |
agentPhone | Listing agent's direct line |
officePhone | Brokerage office line |
agentEmail | Email address (when published) |
agentUrl | Public agent profile link |
agentWebsite | Agent's or brokerage's own website |
facebook, linkedin, instagram, twitter | Social profiles |
hasLeadDetails | true when at least one usable contact channel (phone, email, website, profile, or social) was found |
leadDetailsEnabled | Whether you enabled lead details for this run |
Rows are never filtered by lead completeness. Every listing is exported whether or not lead details were found — rows without contacts simply have empty lead columns and hasLeadDetails: false. That keeps your cost and runtime per 1,000 listings predictable. Enabling lead details adds a little extra time per property.
Who it's for
- Real estate investors & wholesalers — build motivated-seller and fresh-inventory lists with the agent's direct line attached.
- Real estate agents & teams — prospect FSBO-adjacent inventory, track competitors' listings, and reach listing agents for co-op deals.
- Lead-gen agencies — sell fresh, contactable property leads with phones, emails, and socials.
- Property managers & iBuyers — monitor new supply and pricing across metros daily.
- Mortgage brokers & lenders — reach agents active in specific price bands and neighborhoods.
- Data teams & analysts — a stable, well-typed JSON feed for warehouses, dashboards, and BI.
- AI & automation builders — LLM-ready structured output with clean field names, MCP support, and webhooks.
- Marketers — target owners and agents by metro, price band, property type, and days on market.
Use cases
- Fresh-listing alerts — run on a schedule and get brand-new listings (days on market ≤ 7) pushed to Slack or your CRM in real time.
- Agent outreach lists — every listing carries the listing agent's name, phone, email, brokerage, and socials where available.
- Investor deal flow — filter by price band, property type, and days on market to spot fresh inventory first.
- Market monitoring — track inventory, pricing, and status changes across up to 60 metros in one scheduled run.
- Wholesaling comps — pull active and coming-soon inventory per metro with coordinates for mapping.
- CRM enrichment — stream rows straight into HubSpot, Pipedrive, Zoho, or a Google Sheet via webhook.
- Data warehousing — one row per listing with stable IDs makes incremental loads and de-duplication trivial.
- AI pipelines — feed structured listing + agent JSON into scoring, valuation summaries, or outreach draft generation.
- Neighborhood research — use
neighborhood, coordinates, and price data for micro-market analysis. - Competitive tracking — watch a brokerage's activity by following the agents that keep appearing on new listings.
- Direct mail campaigns — export addresses with ZIP codes for targeted mailings.
- Content & research — journalists and analysts use the clean schema for housing-market reporting.
Supported metros
The Actor works across 60 US metros (city + surrounding area). Write them as "City, ST":
Austin TX · Atlanta GA · Albuquerque NM · Baltimore MD · Boise ID · Boston MA · Buffalo NY · Charleston SC · Charlotte NC · Chicago IL · Cincinnati OH · Cleveland OH · Colorado Springs CO · Columbus OH · Dallas TX · Denver CO · Des Moines IA · Detroit MI · Fresno CA · Fort Worth TX · Greenville SC · Hartford CT · Honolulu HI · Houston TX · Indianapolis IN · Jacksonville FL · Kansas City MO · Las Vegas NV · Louisville KY · Los Angeles CA · Memphis TN · Miami FL · Milwaukee WI · Minneapolis MN · Nashville TN · New Orleans LA · New York NY · Oklahoma City OK · Omaha NE · Orlando FL · Philadelphia PA · Phoenix AZ · Pittsburgh PA · Portland OR · Providence RI · Raleigh NC · Richmond VA · Riverside CA · Sacramento CA · Salt Lake City UT · San Antonio TX · San Diego CA · San Francisco CA · San Jose CA · Seattle WA · St. Louis MO · Tampa FL · Tucson AZ · Virginia Beach VA · Washington DC
Unsupported locations fail fast with a clear message listing the supported metros, instead of quietly returning the wrong area.
Input reference
Every field, its type, and its default. The same reference is shown in the Input tab on the Apify Console.
| Input | Type | Default | Description |
|---|---|---|---|
| Metros to collect | |||
searchLocations | string[] | ["Austin, TX"] | One row per metro. Supported values are the 60 metros listed above, written as "City, ST". |
maxResultsPerSearch | integer | 10 | How many listings to collect for each metro, 1–500. The Actor keeps collecting for a metro until it reaches this number or runs out of matches. |
statusFilter | enum[] | [] (all) | Keep only listings with these statuses: active, coming_soon, pending. Empty = every status. |
propertyTypes | enum[] | [] (all) | Keep only these types: house, condo, townhouse, multi_family, land, other. |
| Lead details | |||
enableLeadDetails | boolean | true | Attach the listing agent's contact block to every listing. Every listing is exported whether or not lead details are found. Adds a little extra time per property. |
| Refine your search | |||
minPrice / maxPrice | integer | — | Price bounds in USD. Listings without a published price are dropped when a bound is set. |
minBeds / maxBeds | integer | — | Bedroom bounds. |
minBaths | number | — | Minimum bathrooms (decimals allowed, e.g. 2.5). |
minSqft / maxSqft | integer | — | Living-area bounds (sq ft). |
maxDaysOnMarket | integer | — | Only listings listed within this many days. Great for fresh-inventory alerts. |
| Output & limits | |||
maxItems | integer | 100 | Hard ceiling on total rows for the whole run, across every metro (1–100,000). Main cost and runtime lever. |
webhookUrl | string | "" | Optional. Rows are always saved to the dataset — this URL additionally receives each row in real time (CRM, Slack, Zapier, Make, Sheets). See Webhook delivery. |
webhookFormat | enum | json | json = the full row object; slack = a Slack-friendly message payload. |
Free plan note: on the Apify free plan the per-metro and total results are capped to a small free sample regardless of the values you set here. Paid plans get the full value you set. See the FAQ.
Filters only remove listings that clearly fail the condition — they never reorder or hold back results.
Output reference
Dataset rows
Each dataset item is one JSON object — a property listing with its lead block. Example:
{"featureType": "property_listing","source": "redfin","propertyId": "31216361","listingId": "223711446","url": "https://www.redfin.com/TX/Austin/2308-Cypress-Pt-E-78746/home/31216361","address": "2308 Cypress Pt E, Austin, TX, 78746","street": "2308 Cypress Pt E","city": "Austin","state": "TX","zip": "78746","neighborhood": "Lost Creek","latitude": 30.2773084,"longitude": -97.8426634,"price": 1825000,"pricePerSqft": 579,"beds": 4,"baths": 3,"sqft": 3152,"lotSize": null,"yearBuilt": 1975,"daysOnMarket": 2,"hoa": null,"propertyType": "House","status": "Coming Soon","agentName": "Jane Doe","brokerName": "Example Realty","agentPhone": "(512) 555-0142","officePhone": "1-844-759-7732","agentEmail": null,"agentUrl": null,"agentWebsite": null,"facebook": null,"linkedin": null,"instagram": null,"twitter": null,"hasLeadDetails": true,"leadDetailsEnabled": true,"searchLocation": "Austin, TX","scrapedAt": "2026-09-23T15:05:45.123Z"}
The dataset ships with three ready-made views: Overview (every listing at a glance), Listings (property data), and Lead details (agent contact columns surfaced for outreach).
Run summary (key-value store → OUTPUT)
Every run writes a summary describing what happened:
{"locations": ["Austin, TX"],"listingsExported": 40,"leadDetailsFound": 31,"leadDetailsMissing": 9,"errors": [],"spendingLimitReached": false,"startedAt": "2026-09-23T15:05:30.985Z","finishedAt": "2026-09-23T15:06:59.157Z","paywall": {"detected": true,"isPaying": true,"pricingTier": "BRONZE","limited": false,"blocked": false,"freeTierMaxItems": null,"freeTierMaxItemsPerSearch": null}}
| Field | Description |
|---|---|
locations | Metros included in the run |
listingsExported | Rows written to the dataset |
leadDetailsFound / leadDetailsMissing | How many rows carried at least one contact channel |
errors | Short, fixed descriptions of any non-fatal problem (never contains connection details) |
spendingLimitReached | true when the run stopped because your maximum cost for the run was reached |
startedAt / finishedAt | Run window |
paywall.detected | Whether the platform's pay-status was available to the run |
paywall.isPaying | Whether you are on a paid Apify plan |
paywall.pricingTier | Your Apify plan tier, when known |
paywall.limited | true when the free-plan sample cap was applied |
paywall.blocked | true when the run was stopped because free-plan output is disabled by the publisher |
paywall.freeTierMaxItems / freeTierMaxItemsPerSearch | The caps in force for a free run, when capped |
Webhook delivery (optional)
Every row is always saved to the Apify dataset first. If you set webhookUrl in the Output & limits section, each new row is also POSTed in real time to your URL — useful for CRMs, Slack, Zapier, Make, Google Sheets, or custom pipelines.
| Setting | Description |
|---|---|
webhookUrl | Your receiving URL (https://…). Leave empty to use the dataset only. |
webhookFormat | json — the full row object (identical to the dataset row above). slack — a compact Slack incoming-webhook message with the address, price, size, status, and agent contacts. |
Example — fresh listings to Slack
{"searchLocations": ["Austin, TX"],"maxResultsPerSearch": 40,"maxDaysOnMarket": 7,"webhookUrl": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL","webhookFormat": "slack"}
Example — rows into your CRM as JSON
{"searchLocations": ["Miami, FL", "Tampa, FL"],"enableLeadDetails": true,"maxItems": 500,"webhookUrl": "https://your-crm.example.com/api/leads","webhookFormat": "json"}
Webhook payloads contain exactly the same fields as the dataset row — nothing else is attached. Delivery is best-effort: a failed webhook never stops the run and the row is still saved to the dataset.
MCP usage
Output is structured JSON — ideal for ChatGPT, Claude, Gemini, LangChain, LlamaIndex, and custom agents.
Apify MCP (Model Context Protocol)
Use the Apify MCP server so AI assistants can:
- Run this Actor with natural-language instructions
- Read dataset results directly in the chat
- Chain with other Actors (e.g. enrich → score → CRM)
Typical MCP flow:
User: "Collect 40 fresh listings under $600k in Austin with agent contacts andsummarize the best outreach targets"→ MCP runs the Actor with searchLocations=["Austin, TX"], maxResultsPerSearch=40,maxPrice=600000, maxDaysOnMarket=14, enableLeadDetails=true→ MCP reads the dataset items→ The assistant ranks rows by hasLeadDetails and drafts outreach
Recommended workflow outside MCP
- Run the Actor with your metros, filters, and
enableLeadDetails: true. - Fetch dataset items via the Apify API or export JSON/CSV/Excel.
- Pass rows to your LLM or index them into a vector store — every field is a clean, typed column.
API quick start
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchLocations": ["Austin, TX", "Dallas, TX"],"maxResultsPerSearch": 40,"enableLeadDetails": true,"maxItems": 80}'
Dataset items: GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json
Quick start examples
Fresh listings with agent contacts (lead gen)
{"searchLocations": ["Phoenix, AZ"],"maxResultsPerSearch": 100,"maxDaysOnMarket": 14,"enableLeadDetails": true,"maxItems": 100}
Investor deal flow, filtered
{"searchLocations": ["Jacksonville, FL", "Cleveland, OH"],"maxResultsPerSearch": 200,"minPrice": 100000,"maxPrice": 400000,"propertyTypes": ["house", "townhouse", "multi_family"],"statusFilter": ["active", "coming_soon"],"enableLeadDetails": true,"maxItems": 400}
Multi-metro market monitor with webhook
{"searchLocations": ["Dallas, TX", "Houston, TX", "San Antonio, TX", "Austin, TX"],"maxResultsPerSearch": 50,"enableLeadDetails": false,"maxItems": 200,"webhookUrl": "https://your-pipeline.example.com/hooks/new-listings","webhookFormat": "json"}
Luxury watchlist
{"searchLocations": ["Los Angeles, CA"],"maxResultsPerSearch": 100,"minPrice": 3000000,"enableLeadDetails": true,"maxItems": 100}
Performance & limits
- Streaming output — rows are written to the dataset one by one as they are ready, so even very long runs stay light on memory and your first results are available immediately.
- Memory — 512 MB default is plenty; you rarely need to change it.
- Run length — the default maximum run length is 10,000 seconds (~2.8 hours), sized for large multi-metro runs.
- Your budget is respected — if you set a maximum cost for the run in Apify, the Actor stops gracefully the moment that limit is reached instead of running past it. The run summary's
spendingLimitReachedflag tells you when that happened. - De-duplication — the same listing is never exported twice within one run.
Paid plans & the free-tier sample
This Actor is monetized on the Apify Store, and its policy is stated here openly:
- Paid Apify plans (Bronze and up): full, unlimited output — every metro, every row, no caps.
- Apify free plan: each run exports a small sample — 2 results per run (and at most 2 per metro) by default — then finishes gracefully with a clear upgrade note. Nothing crashes; the run summary's
paywallobject always shows exactly what was applied. - The publisher can tune the free sample (cap, per-metro cap, or a stricter block mode) via owner-only settings —
FREE_TIER_MODE,FREE_TIER_MAX_ITEMS, andFREE_TIER_MAX_ITEMS_PER_SEARCH— without a code change. These are publisher-side environment settings, not user inputs. - If the publisher enables block mode, free-plan runs stop right after input validation — before any collection work and before any charge.
Upgrading to any paid Apify plan unlocks the full output immediately — no code or input changes needed.
FAQ
Is this Actor usable on the free plan? Only as a taste: free-plan runs export a small sample (2 results per run by default) and then finish with an upgrade note. For real workloads you need a paid Apify plan — Bronze or above.
Why did my run stop at 2 results?
You are on the Apify free plan. The paywall object in the run summary (key-value store → OUTPUT) confirms it (limited: true). Upgrade to any paid Apify plan and re-run — the same input then returns everything you asked for.
How fresh is the data?
Every run works against live inventory at the moment it runs — there is no cache of old listings. scrapedAt on each row tells you exactly when it was collected.
Which locations are supported? 60 US metros — see the Supported metros section. Unsupported inputs fail fast with the list of supported metros.
Can I get only listings that have agent phone numbers?
No — and that is deliberate. Filtering by lead completeness would make runtime and cost per 1,000 listings unpredictable. Every listing is exported; use the hasLeadDetails column (and the Lead details dataset view) to slice in your own tooling.
What if a listing has no lead details at all?
It is still exported, with empty lead columns and hasLeadDetails: false. You never lose the property row because the contact block is empty.
Are the emails always there? No. Emails are included when the agent or brokerage publishes one on their own site — it is best-effort enrichment on top of the listing's contact block. Phone numbers and profile links are the most consistently available channels.
Does it work outside the United States? No — the metro coverage is US-only.
A webhook row failed to deliver. Did I lose data? No. The dataset is always written first; the webhook is an additional real-time push. Failed deliveries are reported in the log and the row stays safe in the dataset.
How do I keep costs predictable?
Set maxItems — it is a hard ceiling across the whole run. Also set a maximum cost for the run in Apify; the Actor honors it and stops gracefully. De-duplication means you never pay twice for the same listing in one run.
Why do lead details make runs a bit slower?
Attaching the agent's contact block means gathering a little extra information per property. It adds a small, steady amount of time per listing — not per field — and you can switch it off entirely with enableLeadDetails: false.
Is this affiliated with Redfin? No. This is an independent data tool. Use it responsibly and comply with applicable laws and the source's terms.
Limitations & compliance
- Coverage is limited to the supported US metros; other locations are rejected with a clear message rather than approximated.
- Lead-detail availability varies by listing — some agents publish only a name; those rows are exported with empty contact columns.
- Not affiliated with Redfin or any brokerage. Use responsibly and comply with applicable laws, regulations, and the source's terms of service.
Contact & custom work
Need something beyond this Actor? I build custom scrapers, data pipelines, and full-stack web applications for startups and enterprises.
- Email: dubem115@gmail.com
- GitHub: github.com/DrunkCodes
Reach out for:
- Custom Apify Actors (any website or data source)
- Real estate data projects at scale
- LLM & MCP integrations with your data stack
- Web apps, dashboards, and automation tools
Redfin Real-Time Data Scraper · by DrunkCodes