Skip to content

Redfin Scraper API ​

Turn redfin.com into structured data. Search an area - a city, ZIP code, neighborhood or county - with Redfin's own filters and get up to 350 homes in one request: price, address and coordinates, beds, baths, size, lot, year built, status, days on market, photo and open house. Then send any property URL or id and get the property: status and price, Redfin Estimate with its range and Opendoor's estimate, public records, listing and agents, tax history, sale and listing history, amenities, photos with their room tags, schools, Walk/Transit/Bike Scores, climate risks, flood zones, zoning, comparable, similar and nearby homes, nearby places, transit stops, the Compete Score and the ZIP code's market trends. No proxy pool, bot-check handling or parser maintenance on your side.

It ships as two synchronous Scraper APIs and a no-code scraper:

ProductTypeProduct codeWhat it does
Redfin Search APIScraper API (synchronous)redfin_searchGive an area and filters, get up to 350 homes of the search.
Redfin Property APIScraper API (synchronous)redfin_propertyGive one property URL or id, get the property detail.
Redfin ScraperNo-code scraperredfin_propertySearch an area (optionally with each home's page) or paste property URLs; export JSON, CSV, XML.

Every field is snake_case, the same convention as the Web Scraping API. redfin.com covers the United States, so prices are US dollars. Requests run from US residential exits first; when redfin.com refuses them, the page is retried from Canada at no extra charge.

Redfin Search API ​

GET https://api.scrapeit.io/api/v1/scrape/redfin/search
x-api-key: YOUR_SCRAPEIT_API_KEY

Send exactly one of location or url, then any of the filters.

ParameterTypeExampleDescription
locationstringAustin, TXA ZIP code (94114), or a city with its state, a neighborhood or a county as you would type it into the redfin.com search box. Redfin's own suggestion is searched.
urlstringhttps://www.redfin.com/city/30818/TX/AustinA redfin.com search page: /city/…, /zipcode/…, /neighborhood/…, /county/… or /school-district/…, with or without its /filter/….
listing_statusstringsoldfor_sale (default: active and Coming Soon), active, under_contract (contingent and pending) or sold.
sold_withinstring6_monthsFor a sold search: 1_week, 1_month, 3_months (default), 6_months, 1_year, 2_years, 3_years or 5_years.
home_typesarrayhouses,townhomesAny of houses, condos, townhomes, multi_family, lots_land, manufactured, other; comma-separated in a query string. Every type by default.
min_price, max_pricenumber400000Price in USD: the list price, or the sale price of a sold search.
min_bedrooms, max_bedroomsnumber3Bedrooms; 0 is a studio.
min_bathroomsnumber1.5At least this many bathrooms, in halves.
min_square_feet, max_square_feetnumber1200Living area in square feet.
min_lot_size, max_lot_sizenumber5000Lot size in square feet; 43560 is one acre.
min_year_built, max_year_builtnumber1990Year built.
max_hoa_feenumber300Highest monthly HOA fee in USD; 0 for homes without one.
sortstringnewestrelevance (default, Redfin "Recommended"), newest, price_low_high, price_high_low, square_feet, price_per_square_foot, bedrooms, bathrooms, recently_sold.
limitnumber100Homes to return, 1-350. Every home of the search by default.
include_htmlbooleantrueAlso return the fetched page HTML in html. Paid add-on: +4 credits per request.

With a url, the filters you send override the URL's own; the ones you leave out keep the URL's value. redfin.com rounds amounts to its own steps (812500 is sent as 812.5k, 1234567 as 1.23M).

Example request ​

bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/redfin/search' \
  -H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
  --data-urlencode 'location=Austin, TX' \
  --data-urlencode 'home_types=houses,townhomes' \
  --data-urlencode 'max_price=900000'
js
const response = await fetch(
  'https://api.scrapeit.io/api/v1/scrape/redfin/search?' +
    new URLSearchParams({ location: '94114', listing_status: 'sold', sold_within: '1_year' }),
  { headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
console.log(data.total_results, data.results.length, data.results[0]?.price);
python
import requests

response = requests.get(
    "https://api.scrapeit.io/api/v1/scrape/redfin/search",
    headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
    params={"location": "San Francisco, CA", "min_bedrooms": 2, "sort": "newest"},
    timeout=120,
)
data = response.json()["data"]
print(data["total_results"], [home["street_address"] for home in data["results"][:5]])

Search response ​

json
{
  "data": {
    "location": "San Francisco, CA",
    "search_url": "https://www.redfin.com/city/17151/CA/San-Francisco",
    "region": {
      "type": "city",
      "name": "San Francisco",
      "state": "CA",
      "url": "https://www.redfin.com/city/17151/CA/San-Francisco"
    },
    "total_results": 1021,
    "median": {
      "price": 1549000,
      "sqft": 1650,
      "price_per_sqft": 953,
      "beds": 3,
      "baths": 2,
      "days_on_market": 12
    },
    "results": [
      {
        "position": 1,
        "property_id": "1688513",
        "listing_id": "226332212",
        "mls_id": "426174495",
        "url": "https://www.redfin.com/CA/San-Francisco/1040-Diamond-St-94114/home/1688513",
        "status": "Active",
        "price": 1995000,
        "price_per_sqft": 1367,
        "hoa_fee": null,
        "street_address": "1040 Diamond St",
        "unit": null,
        "city": "San Francisco",
        "state": "CA",
        "zip_code": "94114",
        "country_code": "US",
        "neighborhood": "SF District 5",
        "latitude": 37.7489385,
        "longitude": -122.4363561,
        "beds": 2,
        "baths": 1,
        "full_baths": 1,
        "partial_baths": null,
        "sqft": 1459,
        "lot_sqft": 1838,
        "year_built": 1918,
        "stories": null,
        "home_type": "houses",
        "days_on_market": 1,
        "sold_date": null,
        "open_house": {
          "start": "2026-11-06T00:00:00.000Z",
          "end": "2026-11-06T01:00:00.000Z",
          "label": "Open House - 4:00 - 5:00 PM"
        },
        "photo_url": "https://ssl.cdn-redfin.com/photo/9/islphoto/495/genIslnoResize.426174495_1.webp",
        "photos_count": 30,
        "badges": ["Open House"],
        "key_facts": ["Built in shelving", "Spacious deck", "Updated kitchen"],
        "listing_tags": ["WOOD BURNING FIREPLACE", "UPDATED KITCHEN", "SPACIOUS DECK"],
        "remarks": "Charming Noe Valley Edwardian home, beautifully blending timeless architectural details…",
        "listing_broker": null,
        "listing_agent": null,
        "is_redfin_listing": false,
        "is_new_construction": false,
        "has_virtual_tour": false,
        "has_3d_tour": false,
        "garage_spaces": 0,
        "parking_spaces": 2
      }
    ]
  }
}
FieldDescription
search_urlThe redfin.com search page that was read, filters included - open it to see the same search.
regionThe area: type (city, zip_code, neighborhood, county, state), name, state and its search page without filters.
total_resultsHomes matching the search in the whole area. Redfin shows at most 350 of them; narrow the search (filters, a smaller area) to reach the rest.
medianRedfin's medians for the search: price, size, price per sq ft, beds, baths and days on market.
results[].statusThe MLS status: Active, Coming Soon, Pending, Contingent, Closed, …
results[].priceThe list price, or the sale price of a sold home.
results[].sold_dateThe date the home last sold, also on a listing that sold before.
results[].home_typehouses, condos, townhomes, multi_family, lots_land, manufactured or other - the same values as the home_types filter.
results[].photo_url, photos_countThe card photo in full size and how many photos the listing has; the Property API returns every photo.
results[].badges, key_facts, listing_tagsThe card's badges (Open House, Price Drop, 3D Walkthrough…), its key facts and its highlights.

Send a home's property_id to the Redfin Property API for its estimates, records and history.

Redfin Property API ​

GET https://api.scrapeit.io/api/v1/scrape/redfin/property
x-api-key: YOUR_SCRAPEIT_API_KEY
ParameterTypeExampleDescription
property_idstring1520766Redfin property id, the digits ending the property URL. Send either property_id or url.
urlstringhttps://www.redfin.com/CA/Richmond/2337-Garvin-Ave-94804/home/1520766A https://www.redfin.com/…/home/<property_id> URL. Send either property_id or url.
include_htmlbooleantrueAlso return the fetched page HTML in html. Paid add-on: +4 credits per request.

A url is never fetched as given: ScrapeIt reads the property id out of it and asks redfin.com for that property.

Example request ​

bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/redfin/property' \
  -H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
  --data-urlencode 'url=https://www.redfin.com/CA/Richmond/2337-Garvin-Ave-94804/home/1520766'
js
const response = await fetch(
  'https://api.scrapeit.io/api/v1/scrape/redfin/property?' +
    new URLSearchParams({ property_id: '1520766' }),
  { headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
console.log(data.status, data.price, data.estimate, data.price_history.length);
python
import requests

response = requests.get(
    "https://api.scrapeit.io/api/v1/scrape/redfin/property",
    headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
    params={"property_id": "1520766"},
    timeout=120,
)
data = response.json()["data"]
print(data["status"], data["price"], data["estimate"], len(data["price_history"]))

Property response ​

json
{
  "data": {
    "property_id": "1520766",
    "url": "https://www.redfin.com/CA/Richmond/2337-Garvin-Ave-94804/home/1520766",
    "status": "Closed",
    "home_status": "Off Market",
    "price": 260000,
    "price_label": "Last Sold Price",
    "estimate": 559521.38,
    "estimate_low": 532000,
    "estimate_high": 644000,
    "opendoor_estimate": { "value": 501386, "low": 471302, "high": 531469 },
    "street_address": "2337 Garvin Ave",
    "city": "Richmond",
    "state": "CA",
    "zip_code": "94804",
    "country_code": "US",
    "latitude": 37.9438009,
    "longitude": -122.346582,
    "beds": 1,
    "baths": 1,
    "sqft": 1556,
    "public_record_sqft": 458,
    "lot_sqft": 5005,
    "price_per_sqft": 360,
    "year_built": 1912,
    "year_renovated": 1950,
    "stories": 1,
    "property_type": "Single Family Residential",
    "listing_property_type": "Multi-Family (2-4 Unit)",
    "sold_date": "2015-11-25",
    "apn": "5282400141",
    "county": "Contra Costa County",
    "description": "Great Price! Great opportunity! Two homes on 1 lot. …",
    "mls_id": "40720381",
    "listing_agent": "Stephen Poirier",
    "listing_agent_license": "01071027",
    "listing_broker": "Executive Brokers, sm",
    "buyer_agent": "Benjamin Diaz-habben",
    "buyer_agent_license": "01868149",
    "buyer_broker": "Pinnacle Realtors",
    "photos": [
      {
        "url": "https://ssl.cdn-redfin.com/photo/10/bigphoto/381/40720381_2.jpg",
        "caption": null,
        "tags": ["Exterior"]
      }
    ],
    "tax_year": 2025,
    "taxes_due": 7487.52,
    "assessed_land_value": 247527,
    "assessed_improvement_value": 112829,
    "tax_history": [
      {
        "year": 2025,
        "taxes_due": 7487.52,
        "assessed_land_value": 247527,
        "assessed_improvement_value": 112829
      }
    ],
    "price_history": [
      {
        "date": "2016-01-06",
        "event": "Sold (MLS)",
        "price": 260000,
        "source": "bridgeMLS, Bay East AOR, or Contra Costa AOR"
      }
    ],
    "amenities": [
      {
        "category": "Exterior",
        "group": "Building Information",
        "name": "Building Area Total",
        "value": "1,556"
      }
    ],
    "schools": [
      {
        "name": "Grant Elementary School",
        "rating": 1,
        "parent_rating": 4,
        "grades": "K-6",
        "type": "Public",
        "distance_miles": 0.1,
        "serves_home": true,
        "student_count": 551,
        "students_per_teacher": 20,
        "review_count": 5,
        "address": "2400 Downer Ave, Richmond, CA 94804",
        "url": "https://www.redfin.com/school/26279/CA/Richmond/Grant-Elementary-School"
      }
    ],
    "school_district": "West Contra Costa Unified School District",
    "walk_score": 84,
    "transit_score": 51,
    "bike_score": 55,
    "location_scores": [{ "category": "pedestrian_friendly", "score": 5.841692 }],
    "climate_risks": [
      {
        "risk": "heat",
        "score": 3,
        "summary": "7 days above 87° expected this year, 15 days in 30 years",
        "trend": "This property's heat risk is increasing as weather patterns change."
      }
    ],
    "flood_zones": ["X (unshaded)"],
    "zoning": [
      {
        "code": "RM2",
        "type": "BASE",
        "category": "RESIDENTIAL",
        "subcategory": "MULTI FAMILY RESIDENTIAL",
        "description": "Medium-High Density Multi-Family Residential District",
        "jurisdiction": "RICHMOND CITY"
      }
    ],
    "comparable_homes": [
      {
        "property_id": "1431583",
        "url": "https://www.redfin.com/CA/Richmond/2850-Garvin-Ave-94804/home/1431583",
        "street_address": "2850 Garvin Ave",
        "city": "Richmond",
        "state": "CA",
        "zip_code": "94804",
        "price": 500000,
        "estimate": null,
        "beds": 2,
        "baths": 1,
        "sqft": 1113,
        "sold_date": "2026-10-14",
        "days_on_market": null,
        "latitude": 37.9434787,
        "longitude": -122.3398094
      }
    ],
    "similar_homes": [
      {
        "property_id": "1915593",
        "street_address": "1709 Sacramento St",
        "price": 1250000,
        "days_on_market": 9
      }
    ],
    "nearby_homes": [
      {
        "property_id": "1093873",
        "street_address": "2354 Garvin Avenue",
        "price": null,
        "estimate": 478156
      }
    ],
    "new_listings_nearby": [
      {
        "property_id": "707184",
        "street_address": "34 Seabreeze Dr",
        "price": 1325000,
        "days_on_market": 1
      }
    ],
    "nearby_places": [
      {
        "name": "Happy Brown Bears Pre-School & Day Care",
        "categories": ["Child Care Service", "Preschool"],
        "address": "2225 Gaynor Ave",
        "distance_miles": 0.09,
        "latitude": 37.94472885,
        "longitude": -122.34777069
      }
    ],
    "transit_stops": [
      {
        "name": "23rd St:Garvin Av",
        "latitude": 37.9439528,
        "longitude": -122.3476092,
        "agencies": ["AC Transit"],
        "routes": [{ "short_name": "74", "name": "San Pablo Dam - 23rd St.", "type": "Bus" }]
      }
    ],
    "compete_score": {
      "region_name": "North & East",
      "score": 92,
      "sale_to_list_ratio": 1.062,
      "days_on_market": 18
    },
    "market_trends": [
      {
        "region": "94804, CA",
        "metric": "Median Sale Price",
        "date": "2026-09-30",
        "value": 549838
      }
    ]
  }
}
FieldDescription
statusListing status as shown: Active, Coming Soon, Pending, Closed…; home_status is the market label, e.g. Off Market.
price, price_labelThe headline price and what it is: Listed at Price for a listing, Last Sold Price for a sale.
estimate, estimate_low, estimate_highThe Redfin Estimate of the home value and the sale price range Redfin estimates, when the page shows one.
opendoor_estimateOpendoor's value estimate the page shows, with its range.
sqft, public_record_sqftLiving area of the listing, and the finished square feet on the county record - the two can differ.
property_type, listing_property_typeProperty type from public records, and the type of the latest listing.
mls_id, listing_*, buyer_*MLS number of the listing the page shows, its agent (with licence number) and broker, and the buyer's agent and broker of the last sale.
photosEvery photo of the gallery in gallery order, as { url, caption, tags }: the full-size URL, the listing's caption and Redfin's room tags.
tax_year, taxes_due, assessed_*The latest tax roll year, the taxes due for it and its assessed values; tax_history has every year the county publishes, newest first.
price_historySale, listing and price-change events, newest first, with their source (an MLS or public records).
amenitiesFacts and features as category / group / name / value rows.
schoolsSchools near the property with their GreatSchools rating (1–10), parent rating, grades, type, distance and size; serves_home marks the assigned ones.
walk_score, transit_score, bike_scoreWalk Score, Transit Score and Bike Score, 0–100; location_scores are neighbourhood scores 0–10 (pedestrian_friendly, groceries, quiet…).
climate_risksFirst Street risk factors 1 (minimal) to 10 (extreme) for flood, fire, heat, wind and air, with a summary and the trend.
flood_zones, zoningFEMA flood zones of the parcel, and the base and overlay zoning districts it lies in.
comparable_homesThe sold homes Redfin bases its Estimate on.
similar_homes, new_listings_nearbyHomes for sale like this one, and the newest listings near it.
nearby_homesNeighbouring homes with their Redfin Estimates.
nearby_places, transit_stopsShops, schools, parks and restaurants nearby, and the transit stops with their agencies and routes.
compete_scoreRedfin Compete Score of the neighbourhood, 0 (buyer's market) to 100, with the typical sale-to-list ratio and days to pending.
market_trendsMonthly housing market metrics of the ZIP code (median sale price, homes sold, days on market, sale-to-list, homes sold above list, price drops); ratios are fractions.

Home lists (comparable_homes, similar_homes, nearby_homes, new_listings_nearby) share one shape: property_id, url, address, price, estimate, beds, baths, sqft, sold_date, days_on_market and coordinates - the example abbreviates three of them.

A missing field is null or an empty list, never an error. One property is one redfin.com page; when a section of it does not come back, the property still answers with the header fields and empty records, history and lists.

No-code Redfin Scraper ​

Prefer a dashboard run and a file? Scrapers without code → Redfin Scraper searches an area with the Search API parameters and produces JSON, CSV and XML files with one record per home (the search fields). Turn on Include detail pages to nest each home's Property API answer under detail, or paste property URLs or ids instead of a search. The same job is available over HTTP with an API key (x-api-key; scope scrapers:run to start, scrapers:read to poll):

POST https://api.scrapeit.io/api/v1/scrapers/redfin/jobs
GET  https://api.scrapeit.io/api/v1/scrapers/redfin/jobs/{jobId}
ParameterTypeExampleDescription
location or urlstringAustin, TXThe area to search, as in the Search API; every Search API filter applies, limit caps the homes of the run.
include_detailbooleantrueAlso fetch each home's property page and nest it under detail; billed per home like one Property API request.
propertiesarray["https://www.redfin.com/CA/Richmond/2337-Garvin-Ave-94804/home/1520766"]Instead of a search: up to 20 redfin.com property URLs or property ids; each record is the property detail.
output_formatarray["json", "csv"]One or more of json, csv, xml. Defaults to ["json"]; an empty list is rejected.

Send a search (location or url) or properties, not both. A search without detail pages, or a list of five properties or fewer, finishes inline and the POST already answers with the result-file ids; a larger job answers queued, so poll the GET endpoint until status is finished (or failed). A property listed twice is fetched once. A home whose page redfin.com does not know, or blocks on every attempt, keeps its search fields with detail_error (or becomes a row with its property_id and an error code) and that page costs nothing - the other homes still run.

Errors ​

CodeHTTPMeaning
VALIDATION_ERROR400Search: both or neither of location/url, a URL that is not a redfin.com area search page, sold_within without a sold search. Property: both or neither of property_id/url, a URL that is not a /home/ page.
NOT_FOUND404redfin.com suggests no place for the location, or has no property with this id.
TARGET_BLOCKED502Every proxy attempt drew redfin.com's bot check. Retry later; the request costs nothing.

See Error codes for the shared error format.

Credits and billing ​

Each API bills one flat price per request under its own product code - the residential proxy and any browser work are part of it (billing & credits). Every request is scraped live - never served from the shared cache - so prices and status are current.

Price per request: 30 credits, flat, for a search (up to 350 homes) and for a property; the dashboard Pricing page always shows the current price. Finding the place of a location costs nothing extra; a location redfin.com suggests no place for answers 404 NOT_FOUND and is billed like a search - redfin.com answered it. A no-code job pays the Search API price per search and the Property API price per home page or listed property it fetched.

Limits and behavior ​

  • One search shows at most 350 homes, the way redfin.com's own map and list do; total_results says how many match. Narrow a wide search with filters or a smaller area (a ZIP code, a neighborhood) to reach the rest.
  • A location other than a ZIP code is first looked up in redfin.com's search box, which adds a few seconds; send a ZIP code or a search url for the fastest answer.
  • redfin.com shows a signed-out visitor's view: agent-only and login-only fields are not part of the answer.
  • redfin.com sits behind a bot check that a browser passes once per period; ScrapeIt keeps that clearance per organization and replays it, so most requests are plain, fast fetches.

ScrapeIt Web Scraping API documentation. Managed web scraping services: www.scrapeit.io.