A fast CLI + Python tool to scrape Redfin real-estate listings — price, beds, baths, sqft, location, lat/long — to CSV or JSON. No API key.
- Structured listing data — address, city, state, zip, price, beds, baths, square feet, lot size, year built, days on market, $/sqft, HOA, status, MLS#, latitude/longitude, and listing URL
- Direct from Redfin's data endpoint — uses Redfin's own
gis-csvAPI, not fragile HTML scraping - No API key, no account — works out of the box
- CSV / JSON / JSONL output — pipe-friendly, ready for Excel, pandas, or a database
- Python API — use it as a library in your own scripts
- Minimal dependencies — just
requests
pip install redfin-data-scraperRequires Python 3.10+.
- Open Redfin, search for a city, county, neighborhood, or zip, and copy the URL from your browser. It looks like:
https://www.redfin.com/city/<region_id>/<STATE>/<City-Name> - Pass that URL to the scraper:
# Export every for-sale listing in a region to CSV
redfin "https://www.redfin.com/city/11203/CA/Los-Angeles" --format csv -o listings.csv
# Print as JSON
redfin "https://www.redfin.com/city/11203/CA/Los-Angeles" --format json
# Just count the listings
redfin "https://www.redfin.com/city/11203/CA/Los-Angeles" --countExample JSON record:
{
"sale_type": "MLS Listing",
"property_type": "Single Family Residential",
"address": "123 Example St",
"city": "Seattle",
"state": "WA",
"zip": "98101",
"price": 850000,
"beds": 3.0,
"baths": 2.0,
"sqft": 1640,
"year_built": 1924,
"days_on_market": 6,
"price_per_sqft": 518,
"status": "Active",
"url": "https://www.redfin.com/WA/Seattle/...",
"mls": "...",
"latitude": 47.61,
"longitude": -122.33
}redfin [OPTIONS] URL
| Flag | Default | Description |
|---|---|---|
--status N |
9 |
Redfin status code (9 = for sale) |
--limit N |
350 |
Max listings per request (Redfin caps ~350) |
--property-types CODES |
1,2,3,4,5,6 |
Redfin uipt property-type codes |
--format, -f |
json |
Output format: csv, json, jsonl |
--output, -o FILE |
stdout | Write to file |
--count |
off | Print only the listing count |
from redfin_scraper import scrape, parse_location
# From a Redfin region URL
listings = scrape(url="https://www.redfin.com/city/11203/CA/Los-Angeles", limit=50)
for home in listings:
print(home["address"], home["price"], home["beds"])
# Or with an explicit region id + type
listings = scrape(region_id=11203, region_type=6) # LA, verified 350 results
# Just resolve a URL to (region_id, region_type)
region_id, region_type = parse_location("https://www.redfin.com/city/11203/CA/Los-Angeles")Redfin powers its map search with a gis-csv endpoint that returns listing data
as CSV. This tool resolves the region id from your URL, calls that endpoint with
a proper browser fingerprint, and parses the result into clean records. (Redfin's
location-autocomplete endpoint is blocked by their CDN, which is why you pass the
region URL directly.)
This is a lightweight tool that reads publicly available listing data. It does not handle:
- regions larger than ~350 listings in a single request (paginate by zip/neighborhood)
- listings hidden by local MLS download rules
- heavy ongoing anti-bot escalation — if Redfin changes their protection, the endpoint may need updating
💡 Don't want to maintain a scraper — or need real-estate data without writing code? Thunderbit is an AI web scraper Chrome extension that scrapes Redfin (and any other site) in 2 clicks, no code — handles pagination, subpages, and anti-bot for you. Built for real-estate, sales & marketing teams who don't code.
git clone https://github.com/thunderbit-operations/redfin-scraper.git
cd redfin-scraper
pip install -e ".[dev]"
pytest- phone-number-extractor — Extract phone numbers from text, files, and web pages
- email-extractor — Extract email addresses from web pages
- image-downloader — Batch download images from web pages
Scrape responsibly and at a polite rate. Only collect publicly available data, and review Redfin's Terms of Service and your local regulations before use.
MIT — Built by Thunderbit, AI-powered web scraper & data extraction tools.