Use it for market research and inventory tracking, investment screening, sold comparables, rental market analysis, listing monitoring, valuation work, or structured US listing data for apps and models. It runs in your Apify account, and you do not need a Realtor.com account, cookies or proxies.
What it collects
- Listings for sale, for rent or recently sold, found by city, ZIP code, neighborhood, county or Realtor.com URL.
- Price and status: list price, price cut, last sale, listing date, HOA fee and listing flags such as pending, foreclosure or new construction.
- The property: type, beds, baths, interior and lot size, year built, stories, garage and description.
- Location and media: full address, county, coordinates, a Street View link, and photo URLs with room tags.
- History and context: price and sale history, tax history with assessments, nearby schools with ratings, value estimates, MLS details, and flood and noise scores.
- Listing agents and offices, and floor plans for community rentals.
How it works
Realtor.com Scraper searches Realtor.com and pushes every listing to your dataset as structured JSON. There is no headless browser, no bot challenge to fight and no login wall on your end. Give it locations, Realtor.com URLs or both, and it queues exactly the searches needed, deduplicating across queries and staying within your maxItems cap and pay-per-event budget as it goes.
Search as many cities, ZIP codes, neighborhoods or counties as you like, or paste Realtor.com search URLs with their filters already applied; a property page URL returns that one property. mode switches between for-sale listings, rentals, including community rental floor plans, and recently sold homes, with a sold-within window for comps. By default every result is the complete property record, at the same price as a lighter summary.
Use cases
- Market researchers and analysts — track inventory, list prices, price cuts and days on market across metros.
- Investors and wholesalers — screen for-sale and sold listings by price, size and lot to find deals and pull comps.
- Agents and brokerages — monitor competing listings, price reductions and recent sales in your farm area.
- Rental analysts and property managers — follow asking rents and community floor plans in rent mode.
- Appraisers and lenders — pull sale history, tax assessments and value estimates for valuation work.
- PropTech and data teams — feed structured US listing data into apps, dashboards and models.
Input
Set these in the Actor’s input form on Apify, or send them as JSON through the API.
-
locations— Cities, ZIP codes, neighborhoods or counties, one per line, such asAustin, TX,78701orTravis County, TX. Each location is searched on its own, and results are deduplicated across locations, so you never pay twice for the same property. Provide locations, start URLs or both. The input form pre-fillsAustin, TX. -
startUrls— Realtor.com URLs. Search pages, such asrealtor.com/realestateandhomes-search/Austin_TX/type-condo/price-200000-500000,/rentals/…,/apartments/…or/show-recently-sold, keep their own mode and filters. Property pages (realtor.com/realestateandhomes-detail/…) return that one property. -
mode— Which listings to search forlocations:BUY(“For sale”), the default;RENT(“For rent”); orSOLD(“Recently sold”). Search URLs use the mode in the URL itself. -
maxResultsPerQuery— Properties per location or search URL, from 0 to 10,000.0fetches all available results; Realtor.com shows at most 10,000 per search. The input form pre-fills 100. -
includeDetails— On, the default: each result is the full property record, with the description, all photos, price and sale history, tax history, schools, agents, HOA fee, estimates, and flood and noise data. Off: a lighter summary with the price, beds, baths, size, address and up to 3 photos. Same price either way. -
includeFloorplans— Off by default. Adds floor plans to full property details; only community rentals (apartment buildings) have them.
Search filters
Applied to every location, and on top of the filters already in a search URL. Filters narrow the results at no extra cost; leave a field empty to skip it.
-
type— Property types to return; empty means all types.single-family-home(“Single-family home”),multi-family-home(“Multi-family home”),condo(“Condo”),condop(“Condop”),coop(“Co-op”),townhome(“Townhome”),apartments(“Apartment”),mfd-mobile-home(“Manufactured / mobile home”),farms-ranches(“Farm / ranch”) orland(“Land”). -
sort— Result order; empty keeps Realtor.com’s default order. For sale:relevant,newest,newest-built,luxury,affordable,highest-price,lowest-price,open-house-date,recently-reduced,largest-sqft,lot-sizeorphoto-count. For rent:best-match,recently-added,newest-built,luxury,affordable,highest-priceorlowest-price. Sold:sold-date,newest-built,luxury,affordable,highest-price,lowest-price,largest-sqft,lot-sizeorphoto-count. The form showslargest-sqftas “Largest size” andphoto-countas “Most photos”. A sort that doesn’t fit the mode is ignored. -
minPricemaxPrice— Price range in USD. For rentals it is the monthly rent; in sold mode it filters on the listing price. -
minBedmaxBed— Bedroom range.minBed: 0includes studios. -
minBathmaxBath— Bathroom range. -
minSqftmaxSqft— Interior size range in square feet. -
minLotSqftmaxLotSqft— Lot size range in square feet; 1 acre is 43,560 sqft. -
minYearBuiltmaxYearBuilt— Earliest and latest year built, each from 1500 to 2100, shown in the form as “Built after” and “Built before”. -
keyword— Only listings whose text contains this keyword, such aspoolorwaterfront. -
radius— Widens the search to this many miles around the location, from 0 to 50. -
daysOnMarket— Only listings added to Realtor.com within this many days. -
tags— Amenities a listing must all have:garage-1-or-more(“Garage (1+)”),garage-2-or-more(“Garage (2+)”),garage-3-or-more(“Garage (3+)”),swimming-pool(“Swimming pool”),spa-or-hot-tub(“Spa or hot tub”) orhorse-facilities(“Horse facilities”). -
includePending— On by default. Turn it off to hide listings that are already pending or contingent. -
soldWithin— Sold mode only: how far back to look for sales, as a string.1(“Last month”),3(“Last 3 months”),6(“Last 6 months”), the default,12(“Last year”),24(“Last 2 years”) or36(“Last 3 years”).
Limits and output
These two apply to the whole run.
-
maxItems— Overall cap across all locations and URLs combined.0or empty means unlimited, and each location or URL is still capped bymaxResultsPerQuery. The input form pre-fills 1,000. -
customMapFunction— Optional(object) => objectJavaScript function applied to every item, to reshape or enrich it. It must not be used for filtering. Leave it empty to store items unchanged.
Custom map function
Use customMapFunction to reshape or enrich items on the fly. The input form pre-fills a function that returns each item unchanged, a starting point to edit:
(object) => { return {...object} } The README sets one rule:
- No filtering. The function takes an item and returns an item.
The input form adds that the function must not be used for filtering, and that accounts using it for filtering may be banned.
Input tips
Take a quick sample
Set maxResultsPerQuery to 10 and run one location: a cheap, fast check that the location and filters return what you expect.
Search several cities with filters
This input searches two cities for single-family homes under $600,000 with at least 3 bedrooms:
{
"locations": [
"Austin, TX",
"Round Rock, TX"
],
"mode": "BUY",
"type": [
"single-family-home"
],
"maxPrice": 600000,
"minBed": 3,
"maxResultsPerQuery": 200
} Pull sold comps
Use mode: SOLD with sort: sold-date and a soldWithin window, plus the same bed, bath and size range as your subject property. Sold prices are blank in non-disclosure states such as Texas. This input pulls the last 3 months of sold homes in one ZIP code, newest sales first:
{
"locations": [
"78701"
],
"mode": "SOLD",
"sort": "sold-date",
"soldWithin": "3",
"maxResultsPerQuery": 100
} Start from a Realtor.com search
Copy a search you already set up on Realtor.com into startUrls. Its mode and filters (type, price, beds, baths, size, lot, days on market, radius, hide pending, page) are kept, and any filters you set in the input are applied on top. This input mixes a filtered search URL with a single property page:
{
"startUrls": [
{
"url": "https://www.realtor.com/realestateandhomes-search/Austin_TX/type-condo/price-200000-500000"
},
{
"url": "https://www.realtor.com/realestateandhomes-detail/<property-permalink>"
}
],
"maxResultsPerQuery": 50
} Cover a whole region
List every city or ZIP code up front. Cross-query dedup means a property found by two overlapping locations is never charged twice, so one batched run never costs more than separate runs.
Output
Each run writes its results to an Apify dataset. Each item is one unique Realtor.com property. A location that returns no matches adds no items; no placeholder row is stored. includeDetails sets the item’s shape: a full property record by default, or a lighter summary. Missing values are null rather than absent, so every item of one shape has the same keys. In Apify Console, the dataset opens with table views of the same data: Overview, Pricing, Property details, Location, Price history, Tax history, Nearby schools, Agents and Summaries.
These are the main fields of an item.
-
idlistingIdurl— The property and listing IDs, and the property’s Realtor.com URL. -
inputSource— The location or URL from your input that found the property. -
statuslistPricepriceReducedAmountlistDate— The listing status, list price, price cut and listing date. -
lastSoldPricesoldOn— The last sale price and date. The price is oftennull, even for sold homes, because many states, such as Texas, don’t disclose sale prices. -
typebedsbathssqftlotSqftyearBuilt— Property type, rooms, interior and lot size in square feet, and year built. -
addresscoordinates— Street, city, state, ZIP code and county; latitude and longitude. -
photoshistorytaxHistory— Photo URLs with room tags; price and sale events; tax by year, with assessments. -
nearbySchoolsadvertisersestimates— Nearby schools with ratings, levels and distance; listing agents and offices; value estimates.
{
"inputSource": "Austin, TX",
"includeDetails": true,
"id": "0000000001",
"listingId": "0000000002",
"url": "https://www.realtor.com/realestateandhomes-detail/123-Example-St_Austin_TX_78701_M00000-00001",
"status": "for_sale",
"listPrice": 450000,
"priceReducedAmount": 5000,
"type": "condos",
"subType": "condo",
"beds": 2,
"baths": 2,
"sqft": 1100,
"yearBuilt": 2015,
"address": {
"street": "123 Example St Unit 4",
"locality": "Austin",
"region": "TX",
"postalCode": "78701",
"county": "Travis"
},
"photos": [
{
"href": "https://example.com/photo-1.jpg",
"tags": [
"exterior"
]
}
],
"flags": {
"isNewListing": false,
"isPriceReduced": true,
"isPending": false
},
"hoaFee": 300,
"history": [
{
"date": "2026-09-15",
"eventName": "Price Changed",
"price": 450000,
"sourceName": "Example MLS"
}
],
"nearbySchools": [
{
"name": "Example Elementary School",
"rating": 8,
"levels": [
"elementary"
],
"distance": 0.5,
"fundingType": "public"
}
]
} {
"inputSource": "Austin, TX",
"includeDetails": false,
"propertyId": "0000000001",
"url": "https://www.realtor.com/realestateandhomes-detail/123-Example-St_Austin_TX_78701_M00000-00001",
"price": 450000,
"soldPrice": null,
"beds": 2,
"baths": 2,
"sqft": 1100,
"location": {
"address": "123 Example St Unit 4",
"city": "Austin",
"state": "TX",
"postalCode": "78701"
}
} {
"inputSource": "Austin, TX",
"includeDetails": false,
"propertyId": "0000000003",
"name": "Example Apartments",
"priceMin": 1200,
"priceMax": 2400,
"location": {
"address": "456 Example Ave",
"city": "Austin",
"state": "TX",
"postalCode": "78701"
}
} Field reference
Every documented key of a dataset item, with its JSON type. A dot marks a key inside an object.
| Field | Type | Meaning |
|---|---|---|
inputSource | string | The location or URL from your input that found the property. |
includeDetails | boolean | Tells the two shapes apart: true on a full property record, false on a summary. A property whose full details can’t be loaded comes back as a summary instead of being dropped. |
id | string | The property ID on a full record; a summary carries propertyId instead. |
listingId | string | The listing ID. |
permalink url | string | The property’s Realtor.com permalink, and its full page URL. |
status | string | The listing status, as for_sale in the README’s sample. |
listPrice | number | The list price. |
lastSoldPrice | number or null | The last sale price. Often null, even for sold homes, because many states, such as Texas, don’t disclose sale prices. |
soldOn | string | The last sale date, as YYYY-MM-DD. |
listDate | string | When the property was listed, in ISO 8601. |
priceReducedAmount | number | The price cut. |
name | string or null | A community’s name, as the Summaries view labels it; null in the README’s sample, a condo listing. |
type subType | string | The property type and sub-type, as condos and condo in the README’s sample. |
beds | number | Bedrooms. |
baths bathsFull bathsHalf | number or null | Bathrooms: in total, full and half. |
sqft lotSqft | number | Interior and lot size in square feet. |
garage stories | number or null | The garage and stories counts. |
yearBuilt | number | The year built. |
description | string | The listing description. |
address.street address.locality address.region address.postalCode | string | Street, city, state and ZIP code. |
address.county address.countyFipsCode | string | The county and its FIPS code. |
coordinates.latitude coordinates.longitude | number | The property’s map coordinates. |
photoCount | number | How many photos the listing has. |
photos | array | Photo URLs (href), each with room tags such as exterior. The Actor returns URLs and does not download images. |
streetViewUrl | string | A signed Street View URL. |
flags.isNewListing flags.isPriceReduced flags.isPending flags.isContingent flags.isForeclosure flags.isNewConstruction flags.isComingSoon | boolean | Listing flags. |
hoaFee | number | The HOA fee. |
history | array | Price and sale events, each with a date, an eventName such as Price Changed, a price and a sourceName. |
taxHistory | array | One entry per tax year: the year, the tax, and an assessment with building, land and total values. |
nearbySchools | array | Nearby schools, each with a name, rating, levels, distance in miles and fundingType. |
details | array | Listing detail groups, each with a category, a parentCategory and text lines such as “Bedrooms: 1”. |
advertisers | array | Listing agents and offices, each with a name, type, email, href, office and phones. |
branding | array | Listing branding, each entry with a type, name and photo. |
estimates | array | Value estimates, each with a source, an estimate and a date. |
mls.id mls.name mls.listingId mls.type | string | The MLS that supplied the listing, and the listing’s ID there. |
local.noise.score local.flood.score | number or null | Noise and flood scores. |
local.flood.severity | string | The flood risk, as minimal in the README’s sample. |
floorplans | array | Floor plans, with includeFloorplans on. Only community rentals have them; the array is empty in the README’s sample. |
units | null | In the README’s sample, as null; the README does not describe it. Check a run of your own before relying on it. |
propertyId | string | On a summary, the property ID. |
price soldPrice | number or null | On a summary, the price and the sale price. soldPrice is often null, like lastSoldPrice. |
priceMin priceMax | number | On a community rental’s summary, its price range. |
location.address location.city location.state location.postalCode | string | On a summary, the address. |
How to run it
- Open the Actor on Apify, listed as “Realtor.com Scraper”, and sign in. You need an Apify account.
- Fill in the Input tab, then click Start.
- When the run finishes, open the Output tab and click Export to download the dataset as JSON, CSV or another format.
Or send the same input to the Apify API. This call runs the Actor and returns its dataset items. Replace $APIFY_TOKEN with the API token from your Apify Console.
curl -X POST \
"https://api.apify.com/v2/actors/batscrape~realtor-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locations":["Austin, TX"],"maxResultsPerQuery":10}' The call waits up to 300 seconds. For a longer run, start it asynchronously and read the dataset when it finishes. Read the Apify API reference.
New to Apify? See how BatScrape Actors run on Apify. To run it on a schedule, or send results on when a run finishes, see schedules and webhooks.
Pricing
Pay per event. A run is charged when it starts, then one result event for every unique property delivered to your dataset. Full details, floor plans and photos are included, with no separate per-location, per-page or detail fee. A property found by more than one location or URL is stored and charged once, and a search that returns nothing adds no result charges. Every result is checked against the run’s charge budget before it’s stored, so a run stops cleanly instead of overspending. See current rates on Apify .
Limitations
- It covers the United States, which is what Realtor.com lists. International listings aren’t supported.
- It returns photo URLs with room tags, but does not download or store image files.
- Realtor.com shows at most 10,000 properties per search, so
maxResultsPerQuery: 0fetches up to that many for each location or search URL. - Sale prices (
lastSoldPrice,soldPrice) are oftennull, even for sold homes, because many states, such as Texas, don’t disclose them. In sold mode,minPriceandmaxPricefilter on the listing price. - Floor plans exist only for community rentals, and only on full property details.
-
modeapplies only tolocations: search URLs keep their own mode. Asortvalue that doesn’t belong to the chosen mode is ignored. - A property whose full details can’t be loaded comes back as a summary, so a full-details run can hold both shapes.
- A run stops when it reaches
maxItemsormaxResultsPerQuery, or can’t afford another result within your charge budget. -
customMapFunctionmay reshape or enrich items, but must not be used for filtering.
FAQ
Answers from the Actor’s README on Apify.
Do I need a Realtor.com account, cookies or proxies?
No. Searches run through a backend service, so you don’t need a login, cookies or proxies.
Are full property details and floor plans extra?
No. Every result costs the same, whether it’s a summary or a full property record, with or without floor plans.
Can I use a Realtor.com URL with filters already applied?
Yes. Paste search URLs (for sale, /rentals/, /apartments/ or /show-recently-sold) into startUrls. Their filters are kept. Property page URLs work too.
Does it download photos?
No. It returns photo URLs with room tags, but doesn’t download or store image files itself.
Which countries are covered?
The United States, which is what Realtor.com lists. International listings aren’t supported.
Why did a run return few or no results?
Check these first:
-
maxItemsandmaxResultsPerQuery: the run stops once either is reached. - The charge budget: a run that can’t afford another result stops cleanly rather than erroring.
- The location spelling: use “City, ST”, a 5-digit ZIP code or “County Name, ST”.
- The filters: a narrow price, bed or year range combined with amenities can leave nothing, so loosen them.
- The
sortvalue: one that doesn’t belong to the chosen mode is ignored, as the log shows. - That
locationsorstartUrlsisn’t empty, and that start URLs are realtor.com URLs.
How do I keep the cost of a run down?
Four settings help:
- Set
maxResultsPerQueryto only what you need per location. - Set
maxItemsto a hard cap that matches your budget. - Use filters to narrow results instead of scraping a whole market and filtering afterwards.
- Batch overlapping locations into one run: cross-query dedup means overlaps are never charged twice.
Related reading
- What to check before budgeting an Actor run — Understand the questions behind a scraping budget: the Actor’s current pricing, your input limits, sample output, and the effect of retries or incomplete runs.
- Planning predictable output for our Apify Actors — How we’re approaching output schemas for BatScrape: explicit fields, example records, and clear change notes before consumers build on a dataset.
- Planning a scraper around the data you need — A practical starting checklist for a scraping task: define the records, inspect a sample, identify useful fields, and make the output easy to validate.
- How to use BatScrape Actors on Apify — Run an Actor in Apify Console or through the API, export its dataset, schedule runs and pass results to automation tools.
Other BatScrape Actors
- TikTok Shop Scraper — Scrape US TikTok Shop products by keyword or store, and full product pages and buyer reviews from product URLs. Export prices, discounts, ratings, units sold, SKU stock and shipping.
- Reddit Scraper — Search Reddit posts or comments by keyword across all subreddits. Export titles, text, subreddits, authors, scores and comment counts, sorted by relevance, newest, top or most comments.
- Threads Scraper — Search Threads by keyword or collect a public account’s latest posts. Export text, authors, engagement, topics, mentions, links and media URLs without a Threads login.
- TikTok Scraper — Search TikTok by keyword and export unique videos with creator profiles, engagement stats, music, hashtags and media URLs. Sort by relevance or likes, filter by date and region.
- Douyin Scraper — Search Douyin (抖音), also known as TikTok China, by keyword. Export unique posts with creator profiles, engagement stats, music and media URLs.
- FollowScores Scraper — Extract live football fixtures, results and team profiles for 11 European competitions and 214 teams.
Every published Actor is on the scrapers hub.