How do you scrape Redfin listings via API without getting blocked?
To scrape Redfin listings without rotating proxies or brittle parsers, call ReefAPI's Redfin search endpoint with a location and read the returned listings as structured JSON.
This guide demonstrates the real Redfin API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.
Real-estate investing, market analysis, lead generation and property dashboards.
Call the live endpoint
- 1
Pick a location
Start with a specific city or area so the response stays relevant and easy to review.
- 2
Call redfin/v1/search
Send the location param from the captured example with your ReefAPI key in the x-api-key header.
- 3
Normalize listings from data
Store listing id, price, beds, baths, square footage, address and the canonical listing URL for your workflow.
- 4
Check meta before charging jobs
Use meta.record_count, latency_ms and error to confirm a clean response before downstream analytics.
Copy the request
These snippets use the captured request params for redfin/v1/search.
curl -X POST https://api.reefapi.com/redfin/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"location":"Austin, TX","max_results":30}'import requests
r = requests.post(
"https://api.reefapi.com/redfin/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"location": "Austin, TX",
"max_results": 30
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/redfin/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"location": "Austin, TX",
"max_results": 30
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.redfin.search with {"location":"Austin, TX","max_results":30}.Captured output from ReefAPI
Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.
{
"method": "POST",
"url": "https://api.reefapi.com/redfin/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"location": "Austin, TX",
"max_results": 30
}
}{
"ok": true,
"meta": {
"api": "redfin",
"endpoint": "search",
"mode": "live",
"latency_ms": 1062.9,
"record_count": 30,
"bytes": 1022700,
"cache_hit": false
},
"data": {
"items": [
{
"property_id": "31896771",
"listing_id": "[redacted-phone]",
"url": "https://www.redfin.com/TX/Austin/5138-Mansfield-View-Ct-78732/home/31896771",
"address_line": "5138 Mansfield View Ct",
"city": "Austin",
"state_code": "TX",
"postal_code": "78732",
"neighborhood": {
"value": "Hughes Park Lake 02",
"level": 1
},
"list_price_usd": 1100000,
"beds": 4,
"baths": 3,
"sqft": 3423,
"lot_sqft": 17519,
"year_built": 2000,
"price_per_sqft_usd": 321,
"hoa_fee_monthly_usd": 133,
"property_type": "Single Family Residential",
"property_type_code": 1,
"status": "Active",
"days_on_market": 1,
"mls_id": "7164248",
"latitude": 30.3904309,
"longitude": -97.8820456,
"num_photos": 24,
"last_sold_date": "[redacted-phone]",
"listing_remarks": "Welcome home to the perfect blend of privacy, space, and convenience. Nestled on an oversized lot in the gated Mansfield Estates community, this home backs to a peaceful greenbelt, creating a quiet setting with beautiful Hill Country views. The open layout is designed for easy everyday living and effortless entertaining, with inviting indoor and outdoor spaces you'll enjoy year-round. Whether you're hosting friends, relaxing on the patio, or simply taking in the scenery, this home offers the lifestyle you've been looking for. Just minutes from Lake Travis, shopping, dining, parks, and highly r",
"sashes": [
{
"sashType": "[trimmed-depth]",
"sashTypeId": "[trimmed-depth]",
"sashTypeName": "[trimmed-depth]",
"sashTypeColor": "[trimmed-depth]",
"isRedfin": "[trimmed-depth]",
"isActiveKeyListing": "[trimmed-depth]",
"timeOnRedfin": "[trimmed-depth]",
"openHouseText": "[trimmed-depth]",
"lastSaleDate": "[trimmed-depth]",
"lastSalePrice": "[trimmed-depth]"
}
],
"source": "redfin"
},
{
"property_id": "[redacted-phone]",
"listing_id": "[redacted-phone]",
"url": "https://www.redfin.com/TX/Austin/2502-Leon-St-78705/unit-508/home/[redacted-phone]",
"address_line": "2502 Leon St #508",
"city": "Austin",
"state_code": "TX",
"postal_code": "78705",
"neighborhood": {
"value": "Austin",
"level": 1
},
"list_price_usd": 369000,
"beds": 3,
"baths": 2,
"sqft": 1036,
"lot_sqft": 87,
"year_built": 2007,
"price_per_sqft_usd": 356,
"hoa_fee_monthly_usd": 558,
"property_type": "Condo/Co-op",
"property_type_code": 2,
"status": "Coming Soon",
"days_on_market": 1,
"mls_id": "117385",
"latitude": 30.2901664,
"longitude": -97.7497008,
"num_photos": null,
"last_sold_date": "[redacted-phone]",
"listing_remarks": null,
"sashes": [
{
"sashType": "[trimmed-depth]",
"sashTypeId": "[trimmed-depth]",
"sashTypeName": "[trimmed-depth]",
"sashTypeColor": "[trimmed-depth]",
"isRedfin": "[trimmed-depth]",
"isActiveKeyListing": "[trimmed-depth]",
"openHouseText": "[trimmed-depth]",
"lastSaleDate": "[trimmed-depth]",
"lastSalePrice": "[trimmed-depth]"
},
{
"sashType": "[trimmed-depth]",
"sashTypeId": "[trimmed-depth]",
"sashTypeName": "[trimmed-depth]",
"sashTypeColor": "[trimmed-depth]",
"isRedfin": "[trimmed-depth]",
"isActiveKeyListing": "[trimmed-depth]",
"openHouseText": "[trimmed-depth]",
"lastSaleDate": "[trimmed-depth]",
"lastSalePrice": "[trimmed-depth]"
}
],
"source": "redfin"
},
{
"property_id": "32757422",
"listing_id": "[redacted-phone]",
"url": "https://www.redfin.com/TX/Austin/12410-Burlywood-Trl-78750/home/32757422",
"address_line": "12410 Burlywood Trl",
"city": "Austin",
"state_code": "TX",
"postal_code": "78750",
"neighborhood": {
"value": "Austin",
"level": 1
},
"list_price_usd": 460000,
"beds": 3,
"baths": 2.5,
"sqft": 2090,
"lot_sqft": 10410,
"year_built": 1978,
"price_per_sqft_usd": 220,
"hoa_fee_monthly_usd": null,
"property_type": "Single Family Residential",
"property_type_code": 1,
"status": "Coming Soon",
"days_on_market": 9,
"mls_id": "117021",
"latitude": 30.4628173,
"longitude": -97.806229,
"num_photos": null,
"last_sold_date": "[redacted-phone]",
"listing_remarks": null,
"sashes": [
{
"sashType": "[trimmed-depth]",
"sashTypeId": "[trimmed-depth]",
"sashTypeName": "[trimmed-depth]",
"sashTypeColor": "[trimmed-depth]",
"isRedfin": "[trimmed-depth]",
"isActiveKeyListing": "[trimmed-depth]",
"openHouseText": "[trimmed-depth]",
"lastSaleDate": "[trimmed-depth]",
"lastSalePrice": "[trimmed-depth]"
},
{
"sashType": "[trimmed-depth]",
"sashTypeId": "[trimmed-depth]",
"sashTypeName": "[trimmed-depth]",
"sashTypeColor": "[trimmed-depth]",
"isRedfin": "[trimmed-depth]",
"isActiveKeyListing": "[trimmed-depth]",
"openHouseText": "[trimmed-depth]",
"lastSaleDate": "[trimmed-depth]",
"lastSalePrice": "[trimmed-depth]"
}
],
"source": "redfin"
}
],
"count": 30,
"status": "for_sale",
"pages_fetched": 1,
"filters_applied": {},
"region": {
"region_id": 30818,
"region_type": 6,
"name": "[redacted-name]",
"resolved_via": "seed"
}
}
}Why this is hard manually
Redfin loads listings through dynamic endpoints, changes markup, and rate-limits crawlers by IP. A scraper built for one market breaks on pagination, map bounds, sold vs active listings and region changes.
Normalizing price, beds, baths, square footage, address and the canonical listing URL into a stable shape is where most DIY Redfin scrapers fall apart.
Why ReefAPI solves it
ReefAPI wraps the working Redfin engine behind one POST request and returns the standard envelope: ok, data, meta and error. The live snapshot on the Redfin API page shows a real search call returning listings with price, beds, baths and address.
Use it for investor tools, market dashboards, lead-gen or AI agents — without maintaining a scraper or proxy pool.
Questions developers ask
Do I need a Redfin account?
No. You call ReefAPI with your x-api-key; no Redfin account or login is required for public listing data.
Why does my Redfin scraper keep getting blocked?
Redfin scraping needs rotating proxies and pacing to survive rate limits and IP bans. ReefAPI handles that and returns live JSON; blocked or failed calls are free.
What listing fields come back?
The captured response includes listing ids, prices, beds, baths, square footage, addresses and canonical listing URLs.
Can I monitor a market over time?
Yes. Run the search on a schedule, store listing ids and prices, and compute changes in your own database.