The Problem
Redfin has no public API. The top result for Redfin API is a GitHub thread called Alternative Ways to Access Redfin Data, followed by Redfin's own market-data marketing page and a row of scraper vendors. Teams building real-estate tooling end up either parsing a React app whose internals change without warning, or paying per-portal for a feed.
The Scavio Solution
Scavio returns Redfin listings as structured JSON, and the volume per call is the differentiator: measured 2026-08-12, one search returned 100 listings in 2.4 seconds for 1 credit. Each listing carries price, beds, baths, sqft, a structured address, days_on_market, HOA cost, garage spaces and tour flags. The response also includes a medians block computed across the whole result set -- price, price_per_sqft, sqft, beds, baths and days_on_market -- so a market summary comes back with the listings instead of requiring a second pass. One input quirk: location takes a Redfin city URL rather than a plain place name, so resolve it once and reuse it.
Before
Before Scavio, Redfin data meant maintaining a parser against an internal JSON API with an anti-hijack prefix and no contract, or buying a per-portal feed.
After
After Scavio, one credit returns 100 listings and a median summary of the market they came from.
Who It Is For
Real-estate analytics teams, iBuyer and investor tooling, and market researchers who need listing-level inventory and found that Redfin publishes no API to request.
Key Benefits
- 100 listings per call for 1 credit
- Medians block across the result set, no second query
- days_on_market on every listing
- Structured address rather than a single string
- Price, beds, baths, sqft, HOA and garage in one row
- Pairs with Zillow on the same key
Python Example
import os, requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"}
# location takes a Redfin city URL, not a plain place name. Resolve the URL
# once for the market you track and reuse it -- a bare "Austin, TX" is a 400.
res = requests.post(
"https://api.scavio.dev/api/v1/redfin/search",
headers=HEADERS,
json={
"location": "https://www.redfin.com/city/30818/TX/Austin",
"beds_min": 3,
},
timeout=60,
).json()["data"]
# The medians block is computed over the whole result set, so a market summary
# comes back with the listings rather than needing its own request.
m = res["medians"]
print(f"{res['count']} listings | median ${m['price']:,} | {m['days_on_market']}d on market")
for home in res["listings"][:5]:
a = home["address"]
print(f"{a['street']}, {a['city']} -- ${home['price']:,} ({home['days_on_market']}d)")
JavaScript Example
const res = await fetch("https://api.scavio.dev/api/v1/redfin/search", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`,
"content-type": "application/json",
},
// location is a Redfin city URL, not a place name -- "Austin, TX" returns 400.
body: JSON.stringify({
location: "https://www.redfin.com/city/30818/TX/Austin",
beds_min: 3,
}),
});
const { data } = await res.json();
const m = data.medians;
console.log(`${data.count} listings, median $${m.price}, ${m.days_on_market}d on market`);
Platforms Used
Redfin
Redfin listings and market medians, 100 per credit