DEV Community

Hay Equipos
Hay Equipos

Posted on

How to export Redfin for sale and sold home listings to a spreadsheet

You are running comps for a property, tracking a market as an investor, or building a proptech prototype, and you need the homes in a ZIP code as rows in a spreadsheet: list price, beds, baths, square feet, year built, and for sold homes the sold price and date. Redfin shows all of that on its map, but copying it by hand is slow, and one search on the site stops at 350 homes.

The Redfin Home Listings Scraper: For Sale and Sold Homes, published by Hay Equipos on the Apify Store, takes ZIP codes, cities or Redfin search URLs and returns one clean row per home. It reads the same public search data the Redfin website loads in your browser. No login, no account. This is an independent tool and is not affiliated with Redfin.

What you get back

One row per home, with the same fields whichever input produced it. Illustrative example:

{
  "source": "redfin",
  "listingUrl": "https://www.redfin.com/TX/Austin/123-Example-St-78704/home/00000000",
  "address": "123 Example St, Austin, TX 78704",
  "city": "Austin",
  "state": "TX",
  "zip": "78704",
  "latitude": 30.2449,
  "longitude": -97.7689,
  "status": "Sold",
  "mlsStatus": "Closed",
  "price": 615000,
  "soldPrice": 615000,
  "soldDate": "2026-09-10",
  "beds": 3,
  "baths": 2,
  "sqft": 1650,
  "lotSizeSqft": 6200,
  "yearBuilt": 1984,
  "daysOnMarket": null,
  "pricePerSqft": 373,
  "hoaPerMonth": null,
  "propertyType": "House",
  "primaryPhotoUrl": "https://ssl.cdn-redfin.com/photo/...",
  "photoCount": 28,
  "isNewConstruction": false,
  "searchLocation": "78704"
}
Enter fullscreen mode Exit fullscreen mode
address status price beds baths sqft soldDate
123 Example St, Austin, TX 78704 Sold 615000 3 2 1650 2026-09-10
45 Sample Ave #2, Austin, TX 78704 For sale 489000 2 2 1120

status is normalized to For sale, Coming soon, Pending or Sold, while mlsStatus keeps the wording from the listing source. For homes that are for sale, lastSoldDate shows the previous sale when Redfin has one. Rows also include street, stories, MLS id, property id and listing id.

Step by step in the Apify Console

  1. Open the actor on the Apify Store (link at the end) and click Try for free.
  2. In Locations, add one per line: a 5 digit ZIP code (78704), a city with its state code (Austin, TX), or any redfin.com search URL for a city, ZIP, neighborhood or county.
  3. Pick Listing status: For sale (active and coming soon) or Sold.
  4. For sold homes, pick Sold within, from the last week up to the last 5 years (default last 3 months).
  5. Set Max listings per location (default 200). Large areas are split by price automatically to go past the 350 homes per search cap.
  6. Optional filters: property types, min and max price, bedrooms, minimum bathrooms, square feet and year built.
  7. Turn on Include all photo URLs if you want every photo link (up to 100) instead of just the main one.
  8. Click Start, then export from the Output tab as CSV, Excel or JSON.

Tip: if you already set up a search on redfin.com with filters, paste that URL. A Redfin URL that carries its own /filter/ path keeps those filters and ignores the filter fields in the form.

Example input for sold comps:

{
  "locations": ["98103", "Bend, OR"],
  "status": "sold",
  "soldWithinDays": "30",
  "propertyTypes": ["house", "townhouse"],
  "minBeds": 3,
  "maxItemsPerLocation": 100
}
Enter fullscreen mode Exit fullscreen mode

Calling it from code

The actor id is pistachio_implementation/redfin-home-listings-for-sale-sold. Keep your token in APIFY_TOKEN.

curl:

curl -X POST \
  "https://api.apify.com/v2/acts/pistachio_implementation~redfin-home-listings-for-sale-sold/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["78704"], "status": "forSale", "minPrice": 500000, "maxPrice": 1500000}'
Enter fullscreen mode Exit fullscreen mode

Python with apify-client:

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])

run = client.actor("pistachio_implementation/redfin-home-listings-for-sale-sold").call(
    run_input={
        "locations": ["78704", "https://www.redfin.com/city/30818/TX/Austin"],
        "status": "sold",
        "soldWithinDays": "90",
        "propertyTypes": ["house"],
        "maxItemsPerLocation": 300,
    }
)

for home in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(home["address"], home["soldPrice"], home["soldDate"], home["sqft"])
Enter fullscreen mode Exit fullscreen mode

Schedule the run daily or weekly on Apify to track a market over time. The data is read live at the moment the actor runs.

Pricing

Pay per result: $2 per 1,000 listings ($0.002 per home). No start fee, no monthly fee and no platform usage charge on top. You can set a spending limit on a run and the actor stops when it is reached.

Limits and what it does not do

  • Redfin only. Other large US listing sites were tested and block automated access from cloud servers with bot challenges. Getting past them would take anti bot evasion, which this actor does not do.
  • Network matters. From some networks, especially outside the US, Redfin answers with a bot check (a captcha page) instead of data. The actor does not try to solve it. It retries with backoff, then reports the location as failed with a clear message. On the Apify platform Redfin answered directly in testing, but a run from a network Redfin challenges will fail rather than return partial guesses.
  • Days on market is usually empty for sold homes, because Redfin shows it only while a home is listed.
  • No agent names, brokerage names, phone numbers or emails are collected, and listing descriptions are not copied.
  • "City, ST" works for cities that Redfin lists on its state pages. For smaller towns, open the town on redfin.com and paste its URL.
  • Very large searches are split by price at most six times. If a price band is still full after that, the log says so and a few homes may be missing. Add ZIP codes or filters to cover them.
  • Coverage is Redfin's coverage. Some rural areas have thinner data.
  • Requests are spaced 2.5 seconds apart, so very large runs take a few minutes.

Please use the listing data in line with Redfin's terms.

Try it on the Apify Store: https://apify.com/pistachio_implementation/redfin-home-listings-for-sale-sold

Top comments (0)