# Redfin Scraper: Homes for Sale, Sold Comps, Agents (`automation_craft/redfin-scraper`) Actor

Pull Redfin listings into a sheet: active, coming soon, pending, sold comps and rentals for a city, ZIP code, school district, link or map area, no login. Rows carry MLS number, list price, sq ft, HOA and photos; add the Redfin Estimate, Walk Score, flood risk or agents. Pay per home, CSV or API.

- **URL**: https://apify.com/automation_craft/redfin-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.38 / 1,000 homes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Redfin Scraper: Homes for Sale, Sold Comps, Agents

**Redfin scraper and API** for US homes for sale, recently sold and for rent: type a city, ZIP code, county, neighborhood, state or school district, paste a Redfin search link, draw a map area, or look homes up by link, property id or street address. Each home row carries its price, status, beds, baths, square feet, lot, year built, HOA, address and coordinates, photo links, the MLS number, days on market, the listing description and Redfin's tags. Turn on Home details for the home's Redfin record: price and tax history, public records, the Redfin Estimate with five years of history, a rent estimate, schools, Walk Score, flood, fire, heat, wind and air risk, permits, zoning, the parcel, page views and comparable sales. Add Redfin's own agent list for any city, ZIP code, county or state.

No login, no cookies and no browser: the Actor reads the same data service Redfin's own pages use, up to 1,000 homes a request, and reads each search page by page until it has met Redfin's own count of homes, far past the 350 homes of Redfin's Download All button.

#### What you can do with it

- Pull every home for sale in a city, ZIP code or school district into a sheet, with prices, MLS numbers, HOA and days on market, for deal sourcing.
- Build sold comps: homes sold in the last 30, 90 or 365 days in a ZIP code or a drawn map area, with sold dates and sold prices (where the state discloses them), and comparable sales per home with Home details.
- Track rents: rentals by city with rent ranges, units available, and with Home details the floor plans, fees and pet policies.
- Enrich a list of addresses, Redfin links or property ids with the Redfin Estimate, tax history, schools and climate risk.
- Size up a market: a free market summary per search (median price, price per square foot, days on market, homes by type and ZIP code).
- List the agents of a city with brokerage, rating, reviews and deals, and filter them by rating, deals, brokerage or contact.

### How to use the Redfin Scraper

1. Open the Actor and type a place in **Places**, for example `Austin, TX`, `78704`, `Travis County, TX` or `Hyde Park, Austin, TX`, or paste a Redfin search link into **Redfin links**.
2. Pick the **Listing status** (for sale, recently sold, for rent) and any filters (price, beds, baths, home types, size, lot, year built, HOA, features, days on market).
3. Set **Maximum rows** and, if you need each home's full record, turn on **Home details**. For agents, type places in **Agents: places**.
4. Click **Start**. Download the rows as JSON, CSV or Excel, or read them through the Apify API.

### What data you get

One row per home (`type: "home"`) and one per agent (`type: "agent"`), plus one free coverage row per search (`type: "search"`: Redfin's count, homes met and delivered, repeats, rows skipped by reason, pages read, whether the search is complete and why not, and a market summary of the delivered homes), free status rows for anything not found or not read (`type: "status"`, `type: "place"` for place lookups) and a free run summary (`type: "summary"`). An HTML report of the run (`REPORT.html`) is saved in the run's key value store.

Fill rates of home rows were measured on 18,621 homes for sale and 11,331 sold homes of Austin TX, Columbus OH, Seattle WA and Phoenix AZ (2026-10-30), shown as for sale / sold.

| Field | What it holds | Fill |
|---|---|---|
| `id`, `propertyId`, `listingId`, `url` | Redfin's ids and the home's page | 100% |
| `status`, `mlsStatus`, `listingKind` | `forSale`, `sold`, `forRent` or `offMarket`; the MLS status (Active, Coming Soon, Pending ...); MLS, for sale by owner or public record | 100% |
| `mlsNumber`, `dataSourceId` | MLS number and Redfin's id of the MLS | 100% / 91.3% (MLS number) |
| `price`, `salePriceHidden` | list price, or the sale price of a sold home | 99.9% / 79.4% (Texas hides sale prices) |
| `pricePerSqft` | price per square foot | 92.8% / 98.0% |
| `soldDate`, `lastSoldDate`, `lastSoldPrice` | sale date of a sold home; the previous sale of a home for sale | 91.3% of sold rows, public record sales dated from Redfin's Sold tag |
| `beds`, `baths`, `fullBaths`, `partialBaths` | rooms | 96.4% / 95.8% (beds), 93.8% / 96.7% (baths) |
| `sqft`, `sqm` | living area | 92.9% / 98.0% |
| `lotSqft`, `lotAcres`, `lotSqm` | lot size | 84.4% / 93.0% |
| `yearBuilt`, `stories`, `homeType` | the home | 89.1% / 98.1% (year), 81.8% / 92.8% (stories), 100% (type) |
| `hoaMonthly` | HOA dues a month | 47.4% / 40.0% |
| `garageSpaces`, `parkingSpaces`, `pool` | parking and pool | 73.2% / 77.2% (garage), 91.0% / 94.3% (parking) |
| `address`, `fullAddress`, `latitude`, `longitude`, `timeZone` | street, unit, city, state, ZIP code, neighborhood; position | 99.8% (street), 100% (position) |
| `daysOnMarket`, `daysOnRedfin`, `listedOnRedfinAt` | time on the market | 82.9% for sale |
| `remarks`, `keyFacts`, `listingTags`, `tags` | the listing description (first 699 characters, as Redfin serves it), key facts, highlight tags, Redfin's tags (New, Price drop, Open house, Hot home ...) | 97.1% / 88.7% (description) |
| `photos`, `photoCount` | photo links; Redfin's photo count | 99.8% / 90.8% |
| `openHouse` | next open house start and end | 10.1% for sale |
| `virtualTourUrl`, `hasVirtualTour`, `hasVideoTour`, `has3dTour` | tours | 1.0% (tour link) |
| `isHot`, `isNewConstruction`, `isRedfinListing`, `isComingSoon` | flags | 100% |
| `listingAgent` | the listing agent's name and Redfin agent id (with `includePersonalData`) | depends on the MLS: Columbus 93%, Seattle 98%, Austin 1%, Phoenix 0.5% |
| `search` or `lookup`, `scrapedAt` | the search or lookup that found the home | 100% |

**Rentals** (`status: "forRent"`): `rentalId`, `propertyName`, `rentMin`, `rentMax`, `bedsMin`, `bedsMax`, `bathsMin`, `bathsMax`, `sqftMin`, `sqftMax`, `unitsAvailable`, `description`, `listingSource`, `updatedAt`, photos, address and position, and the leasing office's `contactPhone` (a house or condo let by a person: with `includePersonalData`).

**Home details** (the add-on, `details`, with `detailsStatus`), measured on 40 homes of six states (2026-10-30): `priceHistory` (97.5%), `publicRecords` with `taxHistory` (92.5%) and the APN (97.5%), `amenities` (100%), `listingBroker` name and phone (95%, 92.5%), `listingAgent` name and phone (95%, 82.5%, with `includePersonalData`), `estimate` with the current Redfin Estimate (72.5%: sold homes 100%, homes for sale 45%) and 60 months of history with the ZIP code, city and county series (75%), `rentEstimate` (67.5%), `schools` with GreatSchools and parent ratings, distance, grades, students and whether each serves the home (100%), `scores` Walk Score, Transit Score and Bike Score (97.5%, 72.5%, 80%), `locationScores` (97.5%), `risk` flood, fire, heat, wind and air factors with FEMA zones and insurance ranges (92.5%), `permits` (55%), `parcel` with FIPS code, APN and lot polygon (97.5%), `zoning` (100%), `views` page views (100%), `comparables` sold nearby, `marketCompetition` (compete score, sale to list ratio, days on market of the area), `sunExposure`, `banner`, `highlights`, `mortgage` (tax rate, insurance, loan limits, current rates). For rentals: floor plans with units, amenities, fees and pet policies, parking, lease terms, office hours and management company. `detailSections` narrows the sections read (faster, same price).

**Agents** (`type: "agent"`), measured on 1,263 agents of Austin, Seattle, Houston, Tampa, Phoenix and Dayton: `agentType` (Redfin agent or partner agent), `brokerage` (90.7%), `officeState` (70.5%), `market`, `rating` (21.1%), `reviews`, `dealsPastYear` (25.5%), `lifetimeDeals`, `lifetimeVolume`, `languages`, `serviceRegions`, `jobTitle`, `location`; with `includePersonalData` also `name` (100%), `email` (83.8%: Redfin's placeholder team addresses are left out), `phone` (12.5%), `photoUrl` (99.8%), `profileUrl`, `agentId`. **Agent details** (the add-on, `agentDetails`): total deals, average response time, regions, team, review counts by stars, the five latest reviews with their text, deal statistics of the last year and lifetime, and up to eight recent sales and eight recent purchases.

#### Example home row (a search row, shortened)

```json
{
  "type": "home",
  "id": "32781243",
  "url": "https://www.redfin.com/TX/Austin/12303-Old-Stage-Cv-78750/home/32781243",
  "status": "forSale",
  "mlsStatus": "Active",
  "listingKind": "mls",
  "mlsNumber": "6636183",
  "price": 445000,
  "pricePerSqft": 301,
  "lastSoldDate": "2021-08-18",
  "beds": 3,
  "baths": 2,
  "sqft": 1478,
  "lotSqft": 7588,
  "lotAcres": 0.174,
  "yearBuilt": 1975,
  "stories": 1,
  "homeType": "house",
  "garageSpaces": 2,
  "address": { "street": "12303 Old Stage Cv", "city": "Austin", "state": "TX", "zip": "78750", "neighborhood": "Village 01 Anderson Mill" },
  "fullAddress": "12303 Old Stage Cv, Austin, TX 78750",
  "latitude": 30.4564726,
  "longitude": -97.7995522,
  "daysOnMarket": 1,
  "keyFacts": ["Open floor plan", "Quartz countertops", "Large center island"],
  "tags": ["New"],
  "photos": ["https://ssl.cdn-redfin.com/photo/92/bigphoto/183/6636183_0.jpg", "https://ssl.cdn-redfin.com/photo/92/bigphoto/183/6636183_1_0.jpg"],
  "photoCount": 27,
  "listingAgent": null,
  "search": { "key": "s02c66f67e3850e5f", "label": "location 1" }
}
```

#### Example Home details (a lookup by address, shortened)

```json
{
  "type": "home",
  "id": "31616871",
  "fullAddress": "904 Avondale Rd, Austin, TX 78704",
  "status": "forSale",
  "mlsStatus": "Coming Soon",
  "price": 699000,
  "detailsStatus": "read",
  "details": {
    "publicRecords": { "sqftFinished": 594, "lotSqft": 5301, "yearBuilt": 1949, "propertyType": "Single Family Residential", "apn": "283034", "county": "Travis County" },
    "listingBroker": { "name": "Compass", "phone": null },
    "estimate": { "value": 691883, "history": [{ "month": "2021-11", "value": 762095 }, { "month": "2021-12", "value": 747434 }] },
    "rentEstimate": { "low": 2091, "high": 2176 },
    "schools": [{ "name": "Travis Heights Elementary School", "rating": 6, "distanceMiles": 0.6, "grades": "PreK-5", "servesHome": true }],
    "scores": { "walkScore": 54, "walkScoreLabel": "Somewhat Walkable", "transitScore": 50, "bikeScore": null },
    "risk": { "flood": { "factor": 1, "femaZones": ["X (unshaded)"], "insuranceLow": 507, "insuranceHigh": 1088 } },
    "permits": [{ "number": "2021-203534 BP", "type": "Building", "status": "final", "issuedOn": "2022-03-28", "finalizedOn": "2022-09-24" }],
    "zoning": { "code": "SF-3-NP", "name": "Family Residence Neighborhood Plan" },
    "marketCompetition": { "region": "Greater South River City", "competeScore": 53, "saleToListRatio": 0.968, "medianDaysOnMarket": 58 }
  }
}
```

#### Example agent row (shortened, personal data off)

```json
{
  "type": "agent",
  "rowKey": "aba1a45d5ae7a00ded53623bf",
  "agentType": "redfin",
  "jobTitle": "Principal Agent",
  "brokerage": "Redfin",
  "officeState": "TX",
  "market": "Austin",
  "rating": 5,
  "reviews": 632,
  "dealsPastYear": 62,
  "lifetimeDeals": 999,
  "name": null,
  "email": null,
  "phone": null,
  "location": { "label": "agent location 1", "kind": "city", "id": 30818, "name": "Austin", "stateCode": "TX" },
  "agentDetails": { "avgResponseMinutes": 5, "reviewCounts": { "total": 632, "fiveStar": 622, "fourStar": 8, "threeStar": 2 } },
  "personalDataHidden": true
}
```

### How much does it cost to scrape Redfin?

You pay per row delivered (pay per event). Prices per 1,000 events:

| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Home | $0.49 | $0.46 | $0.42 | $0.38 |
| Home details (add-on, only when on) | $1.40 | $1.28 | $1.16 | $1.00 |
| Agent | $1.98 | $1.98 | $1.94 | $1.90 |
| Agent details (add-on, only when on) | $1.40 | $1.28 | $1.16 | $1.00 |

Each run also pays a one time Actor start of $0.009 on every plan. Platinum and Diamond plans pay the Gold price. The Store pricing card shows these same prices per 1,000 events: "$0.49 / 1,000" on the Home row means one home costs less than a twentieth of a cent.

- 1,000 homes of a search cost $0.38 to $0.49 plus the $0.009 start fee; with Home details on, $1.38 to $1.89.
- 1,000 agents cost $1.90 to $1.98; with Agent details on, $2.90 to $3.38.
- The prefilled run (20 homes of Austin, TX) costs $0.0188 on the Free plan.
- A home or agent is charged once per run, even when two of your searches find it.
- Free: homes outside your search or filters, repeats, places, regions, homes and addresses not found, and every coverage, status, place lookup and summary row. Home details and Agent details are charged only when every chosen section was read; a partial read is delivered free (`detailsStatus: "partial"`). A run with invalid input charges only the start fee.
- Set a maximum cost per run in the Apify Console: the run stops at the first row it cannot pay and delivers no row unpaid.

### Input

| Setting | What it does |
|---|---|
| `locations` | Places as Redfin names them: `Austin, TX`, `78704`, `Travis County, TX`, `Hyde Park, Austin, TX`, `Texas` (a state is read county by county), `Austin Independent School District`. A place is searched only when exactly one Redfin region is that text; otherwise a free row lists the regions to pick from. |
| `zipCodes` | Five digit ZIP codes. |
| `regionIds` | Redfin region ids written `<kind>:<id>`: `city:30818`, `county:2866`, `neighborhood:172898`, `zip:34098`, `state:36`, `school:263366`, `school-district:5816`, `minor-civil-division:250`. Every id is checked before its search; an unknown id is a free row. |
| `startUrls` | Redfin links: searches (city, ZIP code, county, neighborhood, state, school district, map view) with their `/filter/` part, sold searches (`include=sold-3mo`), rentals pages, homes, agent profiles and `redf.in` short links. An entry may be `{ "url": ..., "maxItems": 50 }` or `{ "requestsFromUrl": "https://.../links.csv" }` (a text or CSV file of links over https; a link with a `/filter/` part alone on its line or in quotes, since its commas would split a CSV line). A link part the Actor does not read is a free row, never a guess. |
| `mapAreas` | A circle `{ "latitude", "longitude", "radiusMiles" }` (0.1 to 50 miles), a box `{ "north", "south", "east", "west" }` or a polygon `{ "polygon": [[lat, lng], ...] }` (3 to 200 points). Only homes inside are delivered. |
| `propertyIds`, `addresses` | Look up single homes by Redfin property id or US street address; each is delivered as Redfin shows it (for sale, sold, pending or off market). An address Redfin does not hold exactly (the same house number, street and unit) is a free row with the nearest matches; a home Redfin shows listed for rent is a free row too (rentals come from a search for rent). |
| `placeLookups` | Free: Redfin's regions matching a text, with their ids. |
| `listingStatus` | `forSale` (default), `sold`, `forRent`. Search links keep their own. |
| `forSaleStatuses`, `listingTypes` | For sale: active, coming soon, contingent, pending; agent listed, MLS for sale by owner, for sale by owner, foreclosure, new construction. |
| `soldWithinDays` | Sold within 1 to 3,650 days (default 90). |
| Filters | `minPrice`, `maxPrice`, `minBeds`, `maxBeds`, `minBaths`, `homeTypes`, `minSqft`, `maxSqft`, `minLotSqft`, `maxLotSqft`, `minYearBuilt`, `maxYearBuilt`, `minStories`, `maxStories`, `maxHoa` (0 = no HOA), `minPricePerSqft`, `maxPricePerSqft`, `maxPropertyTax`, `minParking`, `garage`, `pool`, `waterfront`, `view`, `fireplace`, `airConditioning`, `washerDryerHookup`, `accessible`, `elevator`, `green`, `guestHouse`, `primaryBedroomOnMain`, `rvParking`, `fixerUpper`, `openHouse`, `virtualTour`, `priceReducedWithinDays`, `maxDaysOnMarket`, `minDaysOnMarket`, `financing` (FHA, VA), `minWalkScore`, `minBikeScore`, `minTransitScore`, `redfinListingsOnly`, `excludeShortSales`, `excludeAgeRestricted`, `keywords`. |
| Rentals | `dogsAllowed`, `catsAllowed`, `inUnitLaundry`, `parking`, `furnished`, `moveInBy`, with the rent range (`minPrice`, `maxPrice`), `minBeds`, `minBaths`, `minSqft` and `homeTypes`. |
| `sort` | Newest (default), oldest, price, price per square foot, square feet, lot, beds, baths (each both ways), recently sold, earliest sold. Rentals take newest and price. |
| `maxItems`, `maxItemsPerSearch` | Paid rows in all (default 1,000; homes and agents together) and per search. |
| `includeDetails`, `detailSections`, `maxPhotos` | The Home details add-on, its sections, fewer photo links per home. |
| `agentLocations` | Places whose Redfin agent list to deliver: cities, ZIP codes, counties, or a whole state (read county by county). |
| `includeAgentDetails`, `agentTypes`, `agentsWithEmailOnly`, `agentsWithPhoneOnly`, `agentBrokerage`, `minAgentRating`, `minAgentDeals` | The Agent details add-on and the agent filters. |
| `includePersonalData` | Off by default (see below). |
| `outputFields`, `excludeFields`, `flattenOutput` | Keep only chosen fields (`address.zip`, `details.estimate`) or leave chosen fields out (`remarks`, `details.schools`); write nested fields as dotted columns for spreadsheets. |
| `maxConcurrency` | Parallel requests (1 to 6, default 4). |
| `proxyConfiguration` | Apify Proxy (default): the Actor draws its own datacenter exits, so proxy groups and countries are refused; or your own http:// proxy links. |

#### Input examples

Places with filters, for sale:

```json
{
  "locations": ["Austin, TX", "78704"],
  "listingStatus": "forSale",
  "minBeds": 3,
  "maxPrice": 600000,
  "homeTypes": ["house", "townhouse"],
  "maxItems": 500
}
```

A pasted Redfin search link with its filters, and a sold search by link:

```json
{
  "startUrls": [
    { "url": "https://www.redfin.com/city/30818/TX/Austin/filter/property-type=house,min-price=300k,max-price=600k,min-beds=3", "maxItems": 200 },
    "https://www.redfin.com/zipcode/78704/filter/include=sold-3mo"
  ]
}
```

Sold comps inside a map circle, with Home details:

```json
{
  "mapAreas": [{ "latitude": 30.27, "longitude": -97.74, "radiusMiles": 2 }],
  "listingStatus": "sold",
  "soldWithinDays": 180,
  "sort": "recentlySold",
  "includeDetails": true,
  "maxItems": 100
}
```

Home lookups by property id, address and link:

```json
{
  "propertyIds": ["31216070"],
  "addresses": ["904 Avondale Rd, Austin, TX 78704"],
  "startUrls": ["https://www.redfin.com/TX/Austin/9421-Spring-Hollow-Dr-78750/home/31343774"],
  "includeDetails": true
}
```

Agents of a city and a ZIP code, with their profiles:

```json
{
  "agentLocations": ["Austin, TX", "78704"],
  "includeAgentDetails": true,
  "minAgentRating": 4.5,
  "maxItems": 100
}
```

#### Personal data

Off by default. With `includePersonalData` on, rows also carry agents' names, e-mails, phones, photos, profile links and ids, the listing agent's name and phone, the names of review customers, the street, link and id of the homes in an agent's recent deals, the contact of a rental that is not an apartment building, and for a home sold or let by its owner its street, position, link, risk report link, unit numbers, permits, parcel and listing contact (its Home details then carry the other sections, and are not charged when none of your sections is left). With it off those fields are empty, and agent rows and the rows of homes sold or let by their owner say `personalDataHidden: true`; brokerages, offices and apartment managers are businesses and always included. Texts (a listing's remarks or description, review texts) always come as written, whoever wrote them. You are responsible for using personal data lawfully (GDPR, CAN-SPAM, TCPA and similar).

### What this Actor does not do

- No monitoring mode (only new listings since the last run, change tags, price change or removed listing rows, a store of seen listings). Schedule the Actor and compare the rows in your own sheet; every home row carries its status and the time it was read, and homes for sale their days on market.
- No custom JavaScript run on your rows; use `outputFields`, `excludeFields` and `flattenOutput` to shape them.
- No other sites (Zillow, Realtor.com, Apartments.com, Zumper) in the same run, and no de-duplication across sites.
- No agent e-mails found on agents' own websites: the agent's e-mail is the one Redfin shows, with `includePersonalData`.
- No "recommended" order: Redfin reshuffles it on every request (a repeated request kept 11 of 50 positions), so no search can be read in it without missing and repeating homes. Every stable order is offered; a pasted link in that order is read in the default order and its coverage row says so.
- No listing agent e-mail or licence number: Redfin serves them only to a browser session (0 of 40 homes without one). The listing agent's name and phone come with Home details and `includePersonalData`.
- No favourite and x-out counts (0 of 40 homes without a browser session); page views come with Home details.
- No block of the home page that Redfin serves only to a browser session: cumulative days on market, open house times as a list, photo tags, and the buyer's agent and broker of sold homes. The open house, tags, photos and days on market of the search row are delivered.
- No interactive floor plans of homes for sale (Redfin answered an empty list for 5 of 5 homes that show one); rental floor plans come with Home details.
- No "sell side" threshold data: Redfin's data service has no such block. Price drops are in the price history and the `priceReducedWithinDays` filter.
- Sold prices are empty in states that do not disclose them (Texas and others): `price` is empty and `salePriceHidden` is true.
- The listing agent on search rows depends on the MLS: Columbus 93% and Seattle 98% of homes for sale, Austin 1% and Phoenix 0.5%.
- Redfin serves rental searches with short pages in some areas; when a rentals search does not reach Redfin's count, its coverage row says it is not complete. A very large place with a long sold window can time out at Redfin; the coverage row says so (split it into smaller places or a shorter window).
- No agent list for a neighborhood: Redfin keeps agent lists for cities, ZIP codes and counties, and a state is read through its counties' lists.
- Only redfin.com (US) is read, not redfin.ca.
- Work that earns nothing has a limit: a long list of places, ids or addresses Redfin does not know, or searches that find no home, stops on the unpaid work allowance, and the rest is reported "not reached" on a free row (nothing is charged for it). Lists with real homes among them run on, since each paid row pays for the next lookups.

### FAQ

#### Is it legal to scrape Redfin?

This Actor reads only data Redfin shows to every visitor without a login, and it gives agents' and private sellers' personal data only when you turn it on. Redfin's terms of use restrict automated collection; whether and how you use the data is your decision and responsibility.

#### Does Redfin have an API?

Redfin offers no public API for listings; its free Data Center publishes market aggregates, not homes. This Actor works like an API: send a JSON input through the Apify API and read the homes as JSON.

#### Why does Redfin's download stop at 350 homes, and how do I get more?

Redfin's own Download All button gives at most 350 homes of a search. This Actor reads a search page by page, up to 1,000 homes a page, until it has met Redfin's own count of homes, and the search's coverage row says whether every home was met.

#### How do I get a list of Redfin agents with phone and e-mail?

Put cities, ZIP codes or counties in **Agents: places**; every agent of Redfin's agent list there comes as an Agent row with brokerage, rating, reviews and deals. Names, e-mails and phones come only with **Include personal data** on, and Redfin shows a phone for about one agent in eight.

#### Why is the sale price hidden on some Redfin sold homes?

Some states do not disclose sale prices; in Texas Redfin hid the price of 2,334 of 2,374 Austin sold homes in a test. Such a row has `price` empty and `salePriceHidden` true, and Home details still adds the Redfin Estimate where Redfin shows one.

#### Why does this Actor run with limited permissions?

It needs nothing beyond its own run storage (the dataset it writes and its own key value store), so it runs with Apify's limited permissions: it cannot read or change anything else in your account.

### Use it through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~redfin-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"zipCodes": ["78704"], "listingStatus": "sold", "soldWithinDays": 90, "maxItems": 100}'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_TOKEN>' });
const run = await client.actor('automation_craft/redfin-scraper').call({ locations: ['Austin, TX'], maxItems: 200 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'home').length);
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("automation_craft/redfin-scraper").call(run_input={"propertyIds": ["31616871"], "includeDetails": True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("fullAddress"), item.get("price"))
```

### Changelog

- 0.1 (2026-10-30): first version.

### More data tools by Automation Craft

- [Zillow Scraper: Homes for Sale, Rent and Sold](https://apify.com/automation_craft/zillow-scraper)
- [Realtor.com Scraper: Homes for Sale, Rent & Sold](https://apify.com/automation_craft/realtor-com-scraper)
- [Zillow Property Details Scraper: Price History](https://apify.com/automation_craft/zillow-property-details-scraper)
- [Realtor.com Property Details Scraper by Address](https://apify.com/automation_craft/realtor-com-property-details-scraper)
- [Zillow Agents Scraper: Agent Leads, Sales, Reviews](https://apify.com/automation_craft/zillow-agents-scraper)
- [Realtor.com Agents Scraper: Reviews, Sales, Emails](https://apify.com/automation_craft/realtor-com-agents-scraper)
- [Idealista Scraper: Spain, Italy, Portugal Homes](https://apify.com/automation_craft/idealista-scraper)
- [SeLoger Scraper: Listings, Prices and Agencies](https://apify.com/automation_craft/seloger-scraper)
- [Bien'ici Scraper: France Real Estate Ads & DPE](https://apify.com/automation_craft/bienici-scraper)
- [Immowelt Scraper: Rents, Prices and Energy Data](https://apify.com/automation_craft/immowelt-scraper)
- [Airbnb Scraper: Airbnb Data, Prices, Calendar](https://apify.com/automation_craft/airbnb-scraper)
- [Craigslist Scraper: Listings, Prices & Alerts](https://apify.com/automation_craft/craigslist-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/redfin-scraper/changelog.md

# Actor input Schema

## `locations` (type: `array`):

Places as Redfin names them, one per line: "Austin, TX", "78704", "Travis County, TX", "Hyde Park, Austin, TX", "Texas" (a state is read county by county) or a school district ("Austin Independent School District"). A place is searched only when exactly one Redfin region is that text; otherwise a free row lists the regions to pick from.

## `zipCodes` (type: `array`):

Five digit ZIP codes, one per line (each is read as its Redfin ZIP region).

## `regionIds` (type: `array`):

Regions by Redfin's own id, written "<kind>:<id>": city:30818, county:2866, neighborhood:172898, zip:34098 (Redfin's ZIP region id, not the ZIP code), state:36, school:263366, school-district:5816, minor-civil-division:250. Ids are in the place lookup rows and in Redfin links. An id Redfin does not know is a free row.

## `startUrls` (type: `array`):

Links copied from Redfin: a search page (city, ZIP, county, neighborhood, state, school district; with its /filter/ part, a sold search with include=sold-3mo, a rentals page, a map view), a home, an agent profile or a short link (redf.in). An entry may be { "url": ..., "maxItems": 50 } to cap that link, or { "requestsFromUrl": "https://.../links.csv" } for a text or CSV file of links (a filter link alone on its line or in quotes). A link part the Actor does not read is a free row, never a guess.

## `mapAreas` (type: `array`):

Areas on the map, each one of: { "latitude": 30.27, "longitude": -97.74, "radiusMiles": 2 } (a circle, 0.1 to 50 miles), { "north": 30.3, "south": 30.2, "east": -97.7, "west": -97.8 } (a box) or { "polygon": \[\[30.2, -97.8], \[30.3, -97.8], \[30.3, -97.7]] } (3 to 200 points of latitude and longitude). Only homes inside are delivered.

## `propertyIds` (type: `array`):

Redfin property ids (the number at the end of a home link), one per line. Each home is delivered as Redfin shows it (for sale, sold, pending or off market), search settings do not apply.

## `addresses` (type: `array`):

US street addresses with city and state, one per line ("904 Avondale Rd, Austin, TX 78704"). An address Redfin's address search does not hold exactly is a free row with the nearest matches.

## `listingStatus` (type: `string`):

The status of every place, ZIP code, region id and map area search: for sale, recently sold or for rent. Search links keep their own. Default: for sale.

## `forSaleStatuses` (type: `array`):

Homes for sale to include. Default: active and coming soon (Redfin's own default).

## `listingTypes` (type: `array`):

Listing kinds to include. Default: agent listed, MLS for sale by owner, for sale by owner and new construction (foreclosures left out, as on Redfin).

## `soldWithinDays` (type: `integer`):

Recently sold homes sold within this many days (1 to 3650). Default: 90. A very large place with a long window can time out at Redfin: the coverage row says so.

## `sort` (type: `string`):

The order homes are read and delivered in. Default: newest listings first (for sale, for rent), most recently sold first (sold). Rentals take newest, price low and price high.

## `minPrice` (type: `integer`):

Lowest list or sale price; for rentals the lowest monthly rent.

## `maxPrice` (type: `integer`):

Highest list or sale price; for rentals the highest monthly rent.

## `minBeds` (type: `integer`):

At least this many bedrooms (0 = studios too).

## `maxBeds` (type: `integer`):

At most this many bedrooms (homes for sale and sold).

## `minBaths` (type: `number`):

At least this many bathrooms (1, 1.5, 2, ...).

## `homeTypes` (type: `array`):

For sale and sold: house, condo, townhouse, multi family, land, other, manufactured, co-op ("other" also returns manufactured homes, as on Redfin). For rent: house, condo, townhouse, apartment.

## `minSqft` (type: `integer`):

At least this many square feet of living area.

## `maxSqft` (type: `integer`):

At most this many square feet (homes for sale and sold).

## `minLotSqft` (type: `integer`):

Lot at least this many square feet (43560 = 1 acre).

## `maxLotSqft` (type: `integer`):

Lot at most this many square feet.

## `minYearBuilt` (type: `integer`):

Year built at least.

## `maxYearBuilt` (type: `integer`):

Year built at most.

## `minStories` (type: `integer`):

At least this many stories.

## `maxStories` (type: `integer`):

At most this many stories (1 = single story homes).

## `maxHoa` (type: `integer`):

Monthly HOA dues at most this much; 0 = homes with no HOA.

## `minPricePerSqft` (type: `integer`):

Price per square foot at least.

## `maxPricePerSqft` (type: `integer`):

Price per square foot at most.

## `maxPropertyTax` (type: `integer`):

Yearly property tax at most.

## `minParking` (type: `integer`):

At least this many parking spaces.

## `garage` (type: `boolean`):

Only homes with a garage.

## `pool` (type: `string`):

Any pool, a private pool, a community pool, either, or homes without a private pool.

## `waterfront` (type: `boolean`):

Only waterfront homes.

## `view` (type: `boolean`):

Only homes with a view.

## `fireplace` (type: `boolean`):

Only homes with a fireplace.

## `airConditioning` (type: `boolean`):

Only homes with air conditioning.

## `washerDryerHookup` (type: `boolean`):

Only homes with a washer and dryer hookup.

## `accessible` (type: `boolean`):

Only homes marked accessible.

## `elevator` (type: `boolean`):

Only homes with an elevator.

## `green` (type: `boolean`):

Only homes with green or energy efficient features.

## `guestHouse` (type: `boolean`):

Only homes with a guest house.

## `primaryBedroomOnMain` (type: `boolean`):

Only homes with the primary bedroom on the main floor.

## `rvParking` (type: `boolean`):

Only homes with RV parking.

## `fixerUpper` (type: `boolean`):

Only fixer uppers.

## `openHouse` (type: `string`):

Only homes with an open house: any time or this weekend.

## `virtualTour` (type: `boolean`):

Only homes with a virtual tour.

## `priceReducedWithinDays` (type: `integer`):

Only homes whose price was reduced within this many days (for sale).

## `maxDaysOnMarket` (type: `integer`):

Listed at most this many days ago (for sale).

## `minDaysOnMarket` (type: `integer`):

On the market at least this many days (for sale).

## `financing` (type: `string`):

Only homes eligible for FHA or VA financing.

## `minWalkScore` (type: `integer`):

Walk Score at least (1 to 100).

## `minBikeScore` (type: `integer`):

Bike Score at least (1 to 100).

## `minTransitScore` (type: `integer`):

Transit Score at least (1 to 100).

## `redfinListingsOnly` (type: `boolean`):

Only homes listed by Redfin agents.

## `excludeShortSales` (type: `boolean`):

Leave short sales out.

## `excludeAgeRestricted` (type: `boolean`):

Leave age restricted (55+) communities out.

## `keywords` (type: `string`):

Words Redfin matches in the listing description, for example "guest house" (Redfin matches the full description; rows show the first 699 characters of it).

## `dogsAllowed` (type: `boolean`):

Only rentals that allow dogs.

## `catsAllowed` (type: `boolean`):

Only rentals that allow cats.

## `inUnitLaundry` (type: `boolean`):

Only rentals with a washer and dryer in the unit.

## `parking` (type: `boolean`):

Only rentals with parking.

## `furnished` (type: `boolean`):

Only furnished rentals.

## `moveInBy` (type: `string`):

Only rentals available to move in on or before this date (YYYY-MM-DD).

## `maxItems` (type: `integer`):

Stop after this many paid rows in all (homes and agents). Status, coverage and summary rows are free and not counted. Default: 1,000.

## `maxItemsPerSearch` (type: `integer`):

Stop each search (and each agent location) after this many rows. A link entry's own "maxItems" wins for that link.

## `includeDetails` (type: `boolean`):

Adds each home's Redfin record, charged as a Home details event: price and tax history, public records, amenities, listing agent and broker, the Redfin Estimate and its 5 year history, rent estimate, schools, Walk Score, location scores, flood, fire, heat, wind and air risk, permits, zoning, parcel, page views, comparable sales, market competition, sun exposure; for rentals the floor plans, units, amenities and policies. Charged only when every chosen section was read.

## `detailSections` (type: `array`):

The sections Home details reads (all by default). Fewer sections read faster; the price is the same.

## `maxPhotos` (type: `integer`):

Cap the photo links a row carries (0 = none). Default: every photo.

## `agentLocations` (type: `array`):

Places whose Redfin agent list to deliver (Redfin agents and partner agents), one per line: "Austin, TX", "78704", "Travis County, TX", or a state ("Delaware", read county by county). Each agent is an Agent row.

## `includeAgentDetails` (type: `boolean`):

Adds each agent's profile, charged as an Agent details event on top of the Agent: total deals, response time, service regions, review counts by stars, the latest reviews with their text, deal statistics of the last year and lifetime, recent sales and purchases. Charged only when every part was read.

## `agentTypes` (type: `array`):

Redfin agents, partner agents of other brokerages, or both (default).

## `agentsWithEmailOnly` (type: `boolean`):

Only agents whose e-mail Redfin shows.

## `agentsWithPhoneOnly` (type: `boolean`):

Only agents whose phone Redfin shows.

## `agentBrokerage` (type: `string`):

Only agents whose brokerage name holds these words, for example "Compass".

## `minAgentRating` (type: `number`):

Only agents rated at least this (0 to 5 stars).

## `minAgentDeals` (type: `integer`):

Only agents with at least this many deals in the past year.

## `includePersonalData` (type: `boolean`):

Off by default. On, rows also carry agents' names, e-mails, phones, photos, profile links and ids, the listing agent's name and phone, review customers' names, the street, link and id of an agent's deal homes, a non building rental's contact, and for a home sold or let by its owner its street, position, link and risk report link. Texts (remarks, reviews) always come as written. You are responsible for lawful use (GDPR, CAN-SPAM, TCPA).

## `outputFields` (type: `array`):

Keep only these fields of each row (names as in the output, nested ones with a dot: "address.zip", "details.estimate"). Empty: every field.

## `excludeFields` (type: `array`):

Leave these fields out of each row (names as in the output, nested ones with a dot: "remarks", "details.schools"); every other field is kept. Use it or "outputFields", not both.

## `flattenOutput` (type: `boolean`):

Write nested fields as dotted columns ("address.city") for spreadsheets.

## `placeLookups` (type: `array`):

Texts to look up in Redfin's regions without searching them: each gives a free row with the matching regions and their ids (to use in "regionIds").

## `maxConcurrency` (type: `integer`):

How many requests run at once (1 to 6). Default: 4.

## `proxyConfiguration` (type: `object`):

Apify Proxy is used by default (datacenter). You may give your own http:// proxy links instead.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "listingStatus": "forSale",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

## `report` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Austin, TX"
    ],
    "listingStatus": "forSale",
    "maxItems": 20,
    "includeDetails": false,
    "includePersonalData": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/redfin-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Austin, TX"],
    "listingStatus": "forSale",
    "maxItems": 20,
    "includeDetails": False,
    "includePersonalData": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/redfin-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Austin, TX"
  ],
  "listingStatus": "forSale",
  "maxItems": 20,
  "includeDetails": false,
  "includePersonalData": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation_craft/redfin-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/redfin-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sZSmCfekubhqef1CM/builds/f7wl3xA1Bqvr0ClYK/openapi.json
