Redfin APIredfin.com ↗
Search Redfin active listings by city, ZIP, neighborhood, or county. Returns price, beds/baths, sqft, HOA, MLS status, photos, and site medians.
What is the Redfin API?
The Redfin API exposes one endpoint — search_homes_for_sale — that returns up to 350 active and coming-soon property listings for any city, ZIP code, neighborhood, or county keyword. Each result includes over a dozen fields: price, beds, baths, square footage, price-per-sqft, HOA fees, MLS ID and status, listing URL, and photo URLs. The response also surfaces site-reported median statistics across the matched region.
curl -X GET 'https://api.parse.bot/scraper/42a57ed6-2f0f-4e11-91da-ec38adc0e023/search_homes_for_sale?sort=price_asc&limit=5&location=Austin%2C+TX' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace redfin-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Redfin homes-for-sale search — bounded, re-runnable."""
from parse_apis.redfin_com_api import Redfin, SortOrder, LocationInvalid
client = Redfin()
# Market overview: median stats and resolved location for Austin, TX.
market = client.markets.search(location="Austin, TX", sort=SortOrder.PRICE_ASC)
if market.location is not None:
print(f"Market: {market.location.full_name} ({market.location.region_kind})")
if market.median is not None:
print(f"Median price: ${market.median.price:,} | $/sqft: {market.median.price_per_sqft}")
print(f"Returned {market.count} listings (limit {market.limit})")
# Browse cheapest listings with filters; limit= caps total items fetched.
for home in client.homes.search(
location="Austin, TX",
sort=SortOrder.PRICE_ASC,
min_beds=2,
max_price=500000,
limit=5,
):
beds = f"{home.beds} bd" if home.beds is not None else "N/A bd"
baths = f"{home.baths} ba" if home.baths is not None else "N/A ba"
print(f" ${home.price:,} {beds} / {baths} — {home.address.street}, {home.address.city}")
# Drill into the first result for full detail.
first = client.homes.search(location="78759", limit=1).first()
if first is not None:
print(f"\nFirst in 78759: {first.url}")
print(f" {first.house_info} | {first.days_on_market} days on market")
print(f" Description: {first.description[:120]}...")
if first.key_facts:
print(f" Key facts: {', '.join(first.key_facts)}")
# Graceful error handling for bad location input.
try:
client.homes.search(location="zzqxv nowhere", limit=1).first()
except LocationInvalid as e:
print(f"\nCaught LocationInvalid: {e.message}")
print("\nexercised: markets.search / homes.search / LocationInvalid")
Searches homes for sale in a location given as a free-text keyword (a city like 'Austin, TX', a 5-digit ZIP code, a neighborhood, or a county). The keyword is resolved to the first matching Redfin region (city, zipcode, neighborhood, county or state); when no region matches, the call succeeds with location null and an empty homes list. One call returns up to `limit` listings (default 50, hard-capped at 350) in a single round trip after the region lookup; there is no further pagination beyond the 350 cap, so narrow the search with price/bed/bath filters or a smaller region to see more of a large market. Each home is one listing with price (null for undisclosed coming-soon listings), address and coordinates, beds, baths, sqft plus a pre-formatted `house_info` string such as '4 beds 3 baths 3,337 sq ft', MLS status, description, tags, and a `photos` list of image URLs (built from the listing's photo count, so `num_photos` equals the length of `photos`). Results are for-sale listings only (no rentals or sold homes). `median` summarises price/sqft/beds/baths across the returned set as reported by the site.
| Param | Type | Description |
|---|---|---|
| sort | string | Ordering of the returned listings. |
| limit | integer | Maximum number of listings to return; values above 350 are clamped to 350. |
| locationrequired | string | Location keyword: city with state (one shape: 'Austin, TX'), 5-digit ZIP code, neighborhood name, or county name. |
| min_beds | number | Minimum number of bedrooms. Omitted = any. |
| max_price | number | Maximum listing price in USD. Omitted = no upper bound. |
| min_baths | number | Minimum number of bathrooms (e.g. 1.5). Omitted = any. |
| min_price | number | Minimum listing price in USD. Omitted = no lower bound. |
{
"type": "object",
"fields": {
"count": "number of homes returned",
"homes": "array of listing objects: property_id, listing_id, mls_id, mls_status, url, price (USD or null), price_per_sqft, hoa_monthly, beds, baths, sqft, lot_size_sqft, year_built, stories, house_info ('<beds> beds <baths> baths <sqft> sq ft'), property_type (site numeric code), is_new_construction, address {street, unit, city, state, zip, country, neighborhood, latitude, longitude}, days_on_market, description, key_facts, tags, badges, has_virtual_tour, num_photos, photos (array of image URLs)",
"limit": "effective limit applied after clamping",
"median": "site-reported medians over the returned listings: price, sqft, price_per_sqft, beds, baths (null when no region matched)",
"location": "resolved region object (name, full_name, region_kind one of city|zipcode|neighborhood|county|state, url) or null when the keyword matched no region"
},
"sample": {
"data": {
"count": 1,
"homes": [
{
"url": "https://www.redfin.com/TX/Austin/5658-Rain-Creek-Pkwy-78759/home/31313447",
"beds": 3,
"sqft": 2408,
"tags": [],
"baths": 2,
"price": 939000,
"badges": [
"EARLY ACCESS",
"COMPASS COMING SOON"
],
"mls_id": "2188079208865838593",
"photos": [
"https://ssl.cdn-redfin.com/photo/641/islphoto/593/genIslnoResize.2188079208865838593_0.webp",
"https://ssl.cdn-redfin.com/photo/641/islphoto/593/genIslnoResize.2188079208865838593_1.webp",
"https://ssl.cdn-redfin.com/photo/641/islphoto/593/genIslnoResize.2188079208865838593_2.webp"
],
"address": {
"zip": "78759",
"city": "Austin",
"unit": null,
"state": "TX",
"street": "5658 Rain Creek Pkwy",
"country": "US",
"latitude": 30.4030079,
"longitude": -97.7596508,
"neighborhood": "Great Hills"
},
"stories": null,
"key_facts": [
"Built 2003"
],
"house_info": "3 beds 2 baths 2,408 sq ft",
"listing_id": "223217295",
"mls_status": "Coming Soon",
"num_photos": 3,
"year_built": 2003,
"description": "Rare single story backing to the 13th at Great Hills Country Club.",
"hoa_monthly": null,
"property_id": "31313447",
"lot_size_sqft": null,
"property_type": 6,
"days_on_market": 1,
"price_per_sqft": 390,
"has_virtual_tour": false,
"is_new_construction": false
}
],
"limit": 1,
"median": {
"beds": 3,
"sqft": 2408,
"baths": 2,
"price": 939000,
"price_per_sqft": 390
},
"location": {
"url": "https://www.redfin.com/city/30818/TX/Austin",
"name": "Austin",
"full_name": "Austin, TX, USA",
"region_kind": "city"
}
},
"status": "success"
}
}About the Redfin API
What the API Returns
The search_homes_for_sale endpoint accepts a free-text location parameter — examples include 'Austin, TX', '90210', 'Brooklyn Heights', or a county name — and resolves it to the first matching Redfin region. The location object in the response tells you which region was matched, its region_kind (one of city, zipcode, neighborhood, county, or state), its display name, and a direct Redfin URL. When no region matches the keyword, location is null and the median block is also null.
Listing-Level Fields
Each entry in the homes array carries property_id, listing_id, mls_id, and mls_status for cross-referencing with MLS systems. Financial fields include price (USD, nullable for listings without a posted price), price_per_sqft, and hoa_monthly. Physical attributes cover beds, baths, and square footage. Each listing also provides a Redfin url and an array of photo URLs, plus a text description where Redfin provides one.
Filtering and Sorting
You can narrow results before they are returned using min_price, max_price, min_beds, and min_baths. The sort parameter controls ordering (for example, by price or listing date). The limit parameter caps how many listings come back, with a hard ceiling of 350 — values above that are silently clamped. The response always echoes the count of homes returned and the limit actually applied, so you can detect clamping in your code.
Aggregate Statistics
Alongside the individual listings, the response includes a median object with site-reported medians for price, sqft, price_per_sqft, beds, and baths across the matched region. This lets you characterize a market without doing your own aggregation over the returned array.
The Redfin API is a managed, monitored endpoint for redfin.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when redfin.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official redfin.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a neighborhood price-trend tracker using median price and price_per_sqft across multiple ZIP codes
- Screen investment markets by filtering min_price/max_price and checking hoa_monthly against expected rental income
- Populate a home-search app with listing photos, descriptions, and direct Redfin URLs for each result
- Compare median sqft and beds across city vs. county regions to identify underpriced submarkets
- Alert buyers when new coming-soon listings appear for a saved ZIP code query
- Aggregate MLS status distributions across neighborhoods to monitor active vs. coming-soon inventory ratios
- Cross-reference mls_id fields against county assessor records to enrich listings with tax data
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Redfin offer an official developer API?+
What does the location field in the response tell me, and what happens when my keyword doesn't match?+
location object returns the region's name, full_name, region_kind (city, zipcode, neighborhood, county, or state), and a Redfin URL for that region. When the keyword resolves to nothing, location is null, median is null, and the homes array will be empty. You should check location before trusting the results.Can I retrieve rental listings or recently sold homes through this API?+
Is there a way to paginate beyond the 350-listing cap?+
limit parameter is clamped to 350, and there is no offset or cursor parameter for pagination. To cover a large market, you can break the query into smaller geographic units — for example, querying individual ZIP codes rather than an entire city — and merge the results client-side.