Building a Real Estate Investor Deal-Sourcing Pipeline with Claude and Redfin
How to wire the Redfin Scraper into Claude as an MCP tool so an investor can ask for undervalued properties by price, beds, and metro in plain language.
The actor referenced in this article. Pay only for results delivered.
Sourcing deals the traditional way means logging into Redfin, setting filters, scrolling pages, and copying addresses into a spreadsheet, repeated every time a new metro or a new set of criteria comes up. It works, but it doesn’t scale past a handful of searches a week, and it produces a spreadsheet, not a workflow.
Try it live: Redfin Scraper, For-Sale & Sold, 27 Fields, No Login. Pay per result delivered. Failed and empty results are never charged.
The alternative is to give an AI agent direct access to the same data Redfin’s own filters query, and let the investor describe what they’re looking for in plain language instead of clicking through a filter panel. The Redfin Scraper is available as a hosted MCP server, which means Claude (or any MCP-compatible client) can call it directly as a tool: no script to write, no dashboard to check, just a conversation that ends with a list of matching properties.
Why Redfin for this pipeline
Redfin doesn’t offer a public listings API; its Data Center exports are aggregated market metrics, not individual listings, so scraping its own listing endpoints is the only way to get property-level data at scale. What makes it a good fit for a deal-sourcing pipeline specifically is the field set: alongside price, beds, baths, and square footage, every record includes pricePerSqft, daysOnMarket, listingAgentName, and listingBrokerName. An investor evaluating a property doesn’t just want the price; they want to know how it compares to similar listings on a per-square-foot basis, how long it’s been sitting, and who to call.
Setting up the MCP connection
The actor is exposed as an MCP endpoint:
https://mcp.apify.com/?tools=themineworks/redfin-scraper
Add that URL to Claude Desktop’s MCP server configuration, or any MCP client:
{
"mcpServers": {
"redfin-scraper": {
"command": "npx",
"args": ["-y", "@apify/mcp-client"],
"env": {
"APIFY_TOKEN": "your-token-here",
"MCP_ACTOR_URL": "https://mcp.apify.com/?tools=themineworks/redfin-scraper"
}
}
}
}
Once connected, Claude can call the actor mid-conversation, pass it a location and filter set, and read the results back into the conversation. The investor never sees a JSON payload or a spreadsheet unless they ask for one.
A realistic example
Investor prompt:
I’m looking for single-family flip candidates in Austin, TX. Budget $300k-$550k, at least 3 beds. I care about days on market: anything sitting for a while might mean the seller is more open to negotiating. Pull the current listings and flag anything that looks underpriced relative to the rest of the set.
What Claude does:
Claude calls the Redfin Scraper with a filtered input derived from the request:
{
"location": "Austin, TX",
"maxItems": 150,
"minPrice": 300000,
"maxPrice": 550000,
"minBeds": 3,
"proxyConfig": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}
The actor returns up to 150 active listings, each with price, beds, baths, sqft, pricePerSqft, daysOnMarket, yearBuilt, listingAgentName, listingBrokerName, and the listing URL. Claude computes the median pricePerSqft across the returned set, then filters for listings priced meaningfully below that median combined with an above-average daysOnMarket, the combination that suggests a seller might be motivated.
Claude’s response (summarized):
I pulled 142 active listings matching your criteria. Median price per square foot across the set is $312. Six listings stand out as priced at least 15% below that median while sitting on market longer than the 34-day average for this set:
- 2214 Fairfield Dr: $389,000, 3 bed/2 bath, 1,540 sqft ($253/sqft), 61 days on market, listed by Jane Miller, Compass RE Texas
- 5108 Oak Springs Cir: $412,000, 4 bed/2 bath, 1,780 sqft ($232/sqft), 74 days on market, listed by Marcus Webb, Keller Williams
- [additional listings…]
All six are single-family, no new construction. Want me to pull the last 90 days of sold comps in the same ZIPs to check whether $232-$253/sqft is genuinely below what’s actually closing, or whether the whole submarket is priced there right now?
That follow-up matters: a listing’s pricePerSqft relative to other active listings tells you it’s cheap relative to what else is for sale, but only sold comps confirm whether that price is genuinely below market or the market has simply moved. Pairing the Redfin Scraper’s soldWithinDays mode with the same location and filter set answers that in a second call.
Screening a whole metro across three sources
Redfin on its own gives you one view of the market. A few more lookups turn a list of cheap-looking listings into a shortlist you can defend: the full candidate set, what similar homes actually closed at, a status cross-check, and a close look at the handful that survive. The Real Estate MCP puts the Zillow, Redfin and Realtor.com tools behind one endpoint, so Claude can run all of these in the same conversation (setup is on the MCP page). Everything here reads public listing pages. There is no MLS login and no broker feed.
Step 1: pull every candidate in the metro
A saved search shows you what fits on the screen, at the same moment everyone else with the same alert sees it. The Zillow Search Scraper pulls the whole set with the same price and bed filters.
Prompt: Search Zillow for Austin, TX with minPrice 300000, maxPrice 550000, minBeds 3, maxItems 300. Give me every record, not a summary.
Each record has a zpid, address, price, beds, baths, sqft, daysOnZillow, the Zestimate and a detailUrl. Keep the zpids, step 4 needs them. The daysOnZillow filter limits results to listings posted in the last 1, 7, 14, 30, 90, 180 or 365 days. Set it low when you want fresh inventory. Leave it blank when you want the listings that have been sitting, which is often where the motivated sellers are.
Step 2: pull what similar homes actually sold for
Asking prices only tell you what other sellers hope to get. The number that matters is what a similar house closed at.
Prompt: Now search Redfin for Austin, TX with soldWithinDays 90, minPrice 300000, maxPrice 550000, minBeds 3, maxItems 150. These are my comps: recently closed, not asking.
Ninety days is usually the right window. It gives you a real sample, and it is recent enough that the market has not moved underneath you.
Step 3: cross-check status on Realtor.com
Listings go pending before every site catches up, so a property Zillow still shows as active may already be under contract. The Realtor.com Scraper returns a status field plus agentName and officeName on every record.
Prompt: Search Realtor.com for Austin, TX with the same filters, maxItems 100. Match these against the Zillow set by address. Flag any status that disagrees, and anything on Realtor.com that Zillow missed.
The agent fields add up over time. After a month of runs you can see which brokerages carry the inventory you want, and which agents keep showing up on listings that get cut more than once.
Step 4: look closely at the shortlist only
You don’t need full histories on three hundred houses. You need them on the twenty that got through steps 1 to 3. Zillow Property Details accepts bare zpids or Zillow URLs and returns price history, tax history, school ratings, HOA fees and the Zestimate in one call.
Prompt: Get Zillow property details for these 20 zpids. I want the full price history including every cut and relist, the tax history, school ratings, HOA dues, and the Zestimate against the current asking price.
Price history is the field to read closely. A single asking price tells you little. The same listing cut twice in six weeks, with nothing about the house changed, tells you the seller’s situation has changed. Tax history is the other one: when assessed value and asking price have drifted far apart, find out why before you make an offer.
Step 5: have Claude score it, including the bear case
Claude now has the full candidate set, the closed comps, the cross-checked statuses and twenty full histories in one conversation.
Prompt: Score my 20 shortlisted properties. For each one: (1) price per sqft versus the median of the Redfin sold comps in a similar size and bed band, as a percentage above or below; (2) the price-cut pattern from the Zillow price history, flagging anything cut two or more times inside 60 days; (3) any unusual gap between assessed value and asking price; (4) the gap between the Zestimate and the asking price. Rank them, tell me which three you would look at first, and say what would make each one a mistake.
Keep that last clause. If you only ask for reasons a property is good, that is all you get back. Asking for the case against each one gives you something worth reading. The output is a screened list with the numbers attached, not investment advice, and every property still needs someone who knows the neighbourhood to go and look at it.
Turning the conversation into a repeatable pipeline
The MCP flow above is exploratory: one conversation, one metro, ad hoc criteria. For an investor running this weekly across several metros, the same Redfin Scraper input becomes a scheduled Apify run instead of a live Claude conversation:
import os
from apify_client import ApifyClient
apify = ApifyClient(os.environ["APIFY_TOKEN"])
metros = ["Austin, TX", "San Antonio, TX", "Charlotte, NC"]
candidates = []
for metro in metros:
run = apify.actor("themineworks/redfin-scraper").call(run_input={
"location": metro,
"maxItems": 150,
"minPrice": 300000,
"maxPrice": 550000,
"minBeds": 3,
})
listings = list(apify.dataset(run["defaultDatasetId"]).iterate_items())
priced = [l for l in listings if l.get("pricePerSqft") and l.get("daysOnMarket")]
median_ppsf = sorted(l["pricePerSqft"] for l in priced)[len(priced) // 2]
avg_dom = sum(l["daysOnMarket"] for l in priced) / len(priced)
for l in priced:
if l["pricePerSqft"] < median_ppsf * 0.85 and l["daysOnMarket"] > avg_dom:
candidates.append(l)
print(f"{len(candidates)} candidates across {len(metros)} metros")
Scheduled weekly, this feeds a running candidate list an investor reviews on their own schedule, with Claude available for the deeper follow-up questions, comps, agent contact, or a summary of what changed since the last run, that a static script can’t answer.
If you run the Zillow screen from step 1 as a daily job, set monitorMode to true on the Zillow Search Scraper and keep the location and filters the same between runs. Each run then returns only listings it has not delivered before, so you are not paying to re-read the whole metro every morning. Comps can stay on a weekly refresh, since ninety days of closings barely move overnight. The conversational version of the same routine is one prompt:
Prompt: Run the Austin screen again. Only show me listings that are new since the last run. Score them against last week’s comp set and don’t re-pull comps unless the newest sold data is more than 7 days old. Give me anything in the top tier and nothing else.
Price cuts on listings you have already seen won’t show up in a new-listings run. Re-pull property details for your current shortlist to catch those.
Getting agent contact for follow-up
Every candidate returned already carries listingAgentName and listingBrokerName, enough to make first contact directly. For a workflow built specifically around extracting agent and broker contact at scale, rather than as a byproduct of deal sourcing, see Building Real Estate Agent Lead Lists from Redfin and Realtor.com.
Pricing
Results cost $2 per 1,000 ($0.002 each), and failed or empty results are never charged. A 150-listing pull across three metros costs $0.90; run weekly, that’s under $4/month for a standing deal-sourcing pipeline across multiple markets, far below what a paid investor-lead platform charges per seat.
Frequently Asked Questions
Does Claude need to see the raw JSON, or does it summarize?
Claude reads the structured results returned by the MCP tool call and summarizes, filters, and ranks them in natural language. The investor sees a readable answer, not a raw dataset, unless they specifically ask for the full export.
Can I ask for sold comps in the same conversation?
Yes. The same actor accepts soldWithinDays (7, 30, 90, 180, or 365) to switch into recently-sold mode, so a follow-up question like “now show me what actually closed in those ZIPs” is a second tool call within the same conversation.
Is this only useful for flips?
No, the same pipeline works for buy-and-hold rental sourcing (filter on price and beds, then cross-reference with rent data) or land-banking (filter on lot size and property type). The deal logic, flag listings priced below the local median with above-average days on market, is a starting heuristic, not the only one.
Do I need MLS access or an agent licence for this?
No. Every tool here reads public listing pages on Redfin, Zillow and Realtor.com, the same pages any visitor can open. There is no MLS login, no credentials and no broker feed.
Why pull sold comps instead of relying on the Zestimate?
A Zestimate is a model’s estimate. A sold comp is a real transaction. The Zestimate is most useful as a second opinion against the asking price, where the gap between the two is a signal. What a similar house nearby actually closed for last month is the stronger evidence. Use both, and keep them separate in your head.
Do I need to write Python to use this with Claude?
No. The MCP connection lets Claude call the actor directly from a conversation with no code. Python is only needed for the scheduled, unattended version of the pipeline shown above.
How is this different from just reading the Python guide to the Redfin Scraper?
The Redfin Scraper Python guide covers calling the actor directly from a script. This post covers the same actor wired into Claude as an MCP tool, so the interface is a conversation rather than a script you maintain.
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Redfin Scraper: For-Sale and Sold Property Data in Python (No API Key)
Scrape Redfin listings by city, ZIP, or URL in Python: price, beds, baths, sqft, agent, MLS status, and coordinates. No login, no browser, no unblocker.
Zillow vs Redfin vs Realtor.com: Which Real Estate Data Source Should You Scrape in 2026?
A field-by-field comparison of Zillow, Redfin, and Realtor.com scraping: architecture, pricing, unique data each source has, and which to use for which job.
The Real Estate Data Stack: Combining Zillow, Redfin, and Realtor.com for Full Market Coverage
No real estate portal has complete listing coverage or every field you need. Here's how to architect a pipeline combining Zillow, Redfin, and Realtor.com data.
Real Estate Agent Lead Lists: Extracting Contact Data from Redfin and Realtor.com
Build agent and brokerage lead lists by scraping Redfin and Realtor.com listings together, deduping agents across both sources for wider coverage.