Realtor Search Scraper (Cheap)
Pricing
from $1.99 / 1,000 results
Realtor Search Scraper (Cheap)
Property scraper that extracts Realtor.com listings, prices, and agent details so investors and agents can analyze market data and find deals affordably.
Pricing
from $1.99 / 1,000 results
Rating
0.0
(0)
Developer
Data API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
Realtor.com Search Scraper

Pulling homes off Realtor.com by hand means clicking through pages of search results and copying price, beds, address, and agent into a sheet one card at a time. This scraper does it for you. Set your filters, press start, and every matching home comes back as a clean row with price, location, size, status, photos, and agent already split into fields. It's fast and code-free, and you only pay for the listings you actually pull.
What you get
Each home in the search comes back as one row, grouped into a few kinds of data:
- Identity and link —
propertyId,mlsListingId,listingPath,listingStatus - Price and dates —
askingPrice,soldPrice,priceCutAmount,listedDate,soldDate - Home details —
homeType,homeSubType,bedroomCount,bathLabel,interiorSqft,lotSqft,yearBuilt,garageSpaces - Location —
streetAddress,cityName,stateName,stateCode,zipCode,lat,lng,countyName,countyFips,streetViewLink - Media —
coverPhoto,photoCount,photoLinks,hasMatterport - Market flags —
comingSoon,freshListing,priceDropped,foreclosure,newBuild,pending,contingent,auction,fractionalOwnership - Agent and source —
primaryAgentName,primaryAgentEmail,primaryAgentOffice,primaryAgentPhones,secondaryAgentName,brandingName,sourceName,openHouses,collectedAt
Quick start
- Decide what you want: a market state (
listingStatusessuch asfor_saleorsold) plus a location (zipCode,cityName,stateCode, oraddressLine). - Add any extra filters you need, like price range, bedroom count, home type, or amenity keywords.
- Set a Total listings cap so you control how many homes you pull and what you spend.
- Press Start, then export the rows as JSON, CSV, Excel, or XML.

Use cases
- Comparable sales research — pull recent
soldhomes in a ZIP to price a listing or an offer - Lead lists for agents — gather active homes plus agent names and offices in a target city
- Investment sourcing — filter for foreclosures, price drops, or new construction across a state
- Rental hunting — pull
for_renthomes that allow cats or dogs in one neighborhood - Market dashboards — feed live Realtor.com data into your own sheet, BI tool, or model
Input
| Field | Type | Required | Description |
|---|---|---|---|
listingStatuses | array of strings | Yes | Market states to pull, such as for_sale, sold, or for_rent. Prefilled with for_sale. |
zipCode | string | No | One 5-digit US ZIP to target a single neighborhood. |
stateCode | string | No | Two-letter US state, best paired with another filter. |
cityName | string | No | Exact city name; pair with stateCode for repeated names. |
streetName | string | No | Homes along one street. |
addressLine | string | No | One exact address line for a single-home lookup. |
propertyTypes | array of strings | No | Home categories like single_family or condo. |
featureKeywords | array of strings | No | Required amenities like pool or waterfront. |
bedsMin / bedsMax | integer | No | Bedroom floor and ceiling. |
bathsMin / bathsMax | integer | No | Bathroom floor and ceiling. |
listPriceMin / listPriceMax | integer | No | Asking price range in USD. |
soldPriceMin / soldPriceMax | integer | No | Sold price range in USD; applies when listingStatuses includes sold. |
soldDateFrom / soldDateTo | string | No | Sale date window in YYYY-MM-DD. |
sqftMin / sqftMax | integer | No | Interior living area range in square feet. |
lotSqftMin / lotSqftMax | integer | No | Lot size range in square feet. |
yearBuiltFrom / yearBuiltTo | integer | No | Construction year window. |
hoaFeeMax | integer | No | Highest monthly HOA fee to accept. Ignored when noHoaFee is on. |
noHoaFee | boolean | No | Keep only homes with no HOA fee. Default false. |
openHouseFrom / openHouseTo | string | No | Open house date window in YYYY-MM-DD. |
pendingOnly | boolean | No | Keep only pending homes. Default false. |
contingentOnly | boolean | No | Keep only contingent homes. Default false. |
foreclosureOnly | boolean | No | Keep only homes in foreclosure. Default false. |
newConstructionOnly | boolean | No | Keep only newly built homes. Default false. |
hasVirtualTour | boolean | No | Keep only listings with a virtual tour. Default false. |
hasMatterport | boolean | No | Keep only listings with a Matterport 3D walkthrough. Default false. |
catsAllowed | boolean | No | Rentals that allow cats. Default false. |
dogsAllowed | boolean | No | Rentals that allow dogs. Default false. |
sortField | string | No | Field to order results by. Default list_date. |
sortDirection | string | No | desc or asc. Default desc. |
agentSourceId | string | No | Listings tied to one agent source ID. |
sellingAgentName | string | No | Match by the selling agent's name. |
mlsListingId | string | No | Pull one listing by its MLS ID. |
propertyId | string | No | Pull one home by its Realtor.com property ID. |
fulfillmentId | string | No | Listings tied to an agent fulfillment ID. |
pageSize | integer | No | Listings per API call, up to 200. Default 200. |
startOffset | integer | No | Index to start from. Default 0. |
resultsLimit | integer | No | Hard cap on total listings collected. Default 1000. |
timeoutSeconds | integer | No | Whole-run timeout. Default 300. |
requestTimeoutSeconds | integer | No | Per-request timeout. Default 45. |
proxyConfiguration | object | No | Proxy settings; US datacenter is the default. |
Example input
{"listingStatuses": ["sold", "for_sale"],"zipCode": "30301","propertyTypes": ["single_family", "multi_family"],"featureKeywords": ["waterfront", "fireplace"],"bedsMin": 2,"listPriceMin": 250000,"listPriceMax": 750000,"resultsLimit": 1000,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyCountry": "US" }}
Output
Every home that matches your filters becomes one row, paginated automatically up to your resultsLimit. Fields Realtor.com does not publish for a given home come back null rather than guessed.
Example output
{"listingAttribution": "Listing courtesy of Peachtree Realty Group","propertyId": "M98765-43210","mlsListingId": "7421809","listingPath": "123-Magnolia-St_Atlanta_GA_30301_M98765-43210","listingStatus": "for_sale","askingPrice": 489000,"soldPrice": null,"priceCutAmount": 11000,"listedDate": "2024-05-18T00:00:00Z","soldDate": null,"homeType": "single_family","homeSubType": null,"bedroomCount": "4","bathLabel": "3","interiorSqft": 2480,"lotSqft": 8276,"yearBuilt": 2016,"garageSpaces": 2,"streetAddress": "123 Magnolia St","cityName": "Atlanta","stateName": "Georgia","stateCode": "GA","zipCode": "30301","lat": 33.7490,"lng": -84.3880,"countyName": "Fulton","countyFips": "13121","streetViewLink": "https://maps.googleapis.com/maps/api/streetview?location=33.7490,-84.3880","coverPhoto": "https://ap.rdcpix.com/abc123/cover-l.jpg","photoCount": 38,"photoLinks": ["https://ap.rdcpix.com/abc123/photo1-l.jpg","https://ap.rdcpix.com/abc123/photo2-l.jpg"],"hasMatterport": true,"comingSoon": false,"freshListing": true,"priceDropped": true,"foreclosure": false,"newBuild": false,"pending": false,"contingent": false,"auction": false,"fractionalOwnership": false,"sourceId": "FMLS","sourceName": "First Multiple Listing Service","sourceType": "mls","sourceListingId": "7421809","showContactAgent": true,"marketType": "for_sale","leadType": "co_broke","veteransUnitedEligible": false,"productTags": ["core.agent", "core.broker"],"productBrand": "essentials","primaryAgentType": "agent","primaryAgentName": "Jane Carter","primaryAgentEmail": "jane@peachtreerealty.com","primaryAgentOffice": "Peachtree Realty Group","primaryAgentPhones": ["+14045551234"],"secondaryAgentType": null,"secondaryAgentName": null,"secondaryAgentEmail": null,"secondaryAgentOffice": null,"secondaryAgentPhones": [],"brandingName": "Peachtree Realty Group","searchPromotions": [],"communityPromotions": [],"openHouses": [{ "start_date": "2024-05-25T17:00:00Z", "end_date": "2024-05-25T20:00:00Z" }],"collectedAt": "2024-05-20T14:32:08.512000+00:00","errorMessage": null}
Output fields
| Field | Type | Description |
|---|---|---|
listingAttribution | string | Required attribution text for the listing. |
propertyId | string | Realtor.com internal property ID. |
mlsListingId | string | MLS listing number. |
listingPath | string | URL slug for the listing page. |
listingStatus | string | Market state: for_sale, sold, for_rent, and so on. |
askingPrice | integer | Current list price in USD. |
soldPrice | integer | Closing price in USD, present only on sold homes. |
priceCutAmount | integer | Price drop in USD. |
listedDate | string | When the home went on the market. |
soldDate | string | When the home closed. |
homeType | string | Broad category such as single_family or condo. |
homeSubType | string | Finer category under the home type. |
bedroomCount | string | Bedrooms, or a range when given. |
bathLabel | string | Consolidated bathroom count. |
interiorSqft | integer | Indoor living area in square feet. |
lotSqft | integer | Lot size in square feet. |
yearBuilt | integer | Year construction finished. |
garageSpaces | integer | Garage parking spots. |
streetAddress | string | Street line of the address. |
cityName | string | City. |
stateName | string | Full state name. |
stateCode | string | Two-letter state code. |
zipCode | string | ZIP or postal code. |
lat | number | Latitude. |
lng | number | Longitude. |
countyName | string | County. |
countyFips | string | County FIPS code. |
streetViewLink | string | Google Street View URL. |
coverPhoto | string | Lead listing photo URL. |
photoCount | integer | Number of photos. |
photoLinks | array | Listing photo URLs, up to ten. |
hasMatterport | boolean | Listing has a Matterport 3D walkthrough. |
comingSoon | boolean | Listing is tagged coming soon. |
freshListing | boolean | Listing is under 14 days old. |
priceDropped | boolean | Price fell within the last 30 days. |
foreclosure | boolean | Home is in foreclosure. |
newBuild | boolean | Home is newly constructed. |
pending | boolean | Listing is pending. |
contingent | boolean | Listing is contingent. |
auction | boolean | Home is sold at auction. |
fractionalOwnership | boolean | Home is fractionally owned. |
sourceId | string | Listing source identifier. |
sourceName | string | Source MLS or feed name. |
sourceType | string | Type of the listing source. |
sourceListingId | string | Listing ID from the source feed. |
showContactAgent | boolean | Whether a contact-an-agent action is shown. |
marketType | string | Lead market classification. |
leadType | string | Lead routing type. |
veteransUnitedEligible | boolean | Qualifies for Veterans United financing. |
productTags | array | Promotional product tags on the listing. |
productBrand | string | Brand behind the product placement. |
primaryAgentType | string | Role of the first advertiser. |
primaryAgentName | string | Name of the first advertiser. |
primaryAgentEmail | string | Email of the first advertiser, when public. |
primaryAgentOffice | string | Office of the first advertiser. |
primaryAgentPhones | array | Phone numbers for the first advertiser. |
secondaryAgentType | string | Role of the second advertiser. |
secondaryAgentName | string | Name of the second advertiser. |
secondaryAgentEmail | string | Email of the second advertiser, when public. |
secondaryAgentOffice | string | Office of the second advertiser. |
secondaryAgentPhones | array | Phone numbers for the second advertiser. |
brandingName | string | Branding label on the listing. |
searchPromotions | array | Promotions returned with the search result. |
communityPromotions | array | Promotions tied to the home's community. |
openHouses | array | Scheduled open house windows. |
collectedAt | string | ISO 8601 timestamp for when the row was captured. |
errorMessage | string | Reason a request failed; null on success. |
Tips for best results
- Always pair
listingStatuseswith a location filter. A bare status with nozipCode,cityName,stateCode, oraddressLinecan pull far more homes than you want. - Use
resultsLimitto keep spend predictable. The run stops the moment it hits that number, so a small cap is a cheap way to test your filters first. soldPriceMinandsoldPriceMaxonly bite whenlistingStatusesincludessold, so addsoldto the status list when you want comps.- If Realtor.com starts throttling, switch
proxyConfigurationfrom datacenter to residential and raiserequestTimeoutSeconds. - Tighten
bedsMin,listPriceMin, andpropertyTypesbefore widening your area. Narrow filters keep the dataset focused and the cost down.
How can I use Realtor.com listing data?
How can I use the Realtor.com Search Scraper to pull comparable sales?
Add sold to listingStatuses, set a zipCode or cityName, and give it a soldDateFrom so the comps stay recent. Each row carries soldPrice, soldDate, bedroomCount, interiorSqft, and streetAddress, which is everything you need to price a listing or back up an offer.
How can I build a real estate lead list from Realtor.com search results?
Keep listingStatuses on for_sale for your target city and export the run. The output includes primaryAgentName, primaryAgentEmail, primaryAgentOffice, and primaryAgentPhones for each home, so you get an agent contact sheet alongside the property data.
How can I find investment property data on Realtor.com?
Turn on foreclosureOnly or newConstructionOnly, or filter by priceDropped after export, to surface distressed and motivated listings across a stateCode. Combine askingPrice, lotSqft, yearBuilt, and priceCutAmount to score deals against your criteria.
How can I scrape Realtor.com rentals that allow pets?
Set listingStatuses to for_rent and switch on catsAllowed or dogsAllowed. The scraper returns rental homes with askingPrice, bedroomCount, and full address fields, ready to drop into a search sheet for tenants or property managers.
Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
Support
Questions, feature requests, or a field you'd like added? Reach out at data.apify@proton.me and we'll get back to you.