Realtor.com at a glance
Realtor.com is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, type, status, address and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.50 per 1,000 results on the Apify Free plan and from $0.90 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, AI, Developer Tools
- Pricing
- $1.50 per 1,000 results (Free plan), from $0.90 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 22 options
- Run success
- 100.0% of completed public runs in the last 30 days
From $0.9/1K. Extract property listings from realtor.com. Get comprehensive data, including prices, property details, agent contacts, coordinates, photos, and more. Supports for sale, rental, and recently sold listings across all US markets.
What Realtor.com $0.9💰 Listings, Prices & Agent Details can do
- Two ways to search. Pick a city and state and let the scraper build the search, or paste a realtor.com search URL you already filtered in a browser.
- Three listing types. For sale, for rent and recently sold, each with its own set of fields (sold price and date, or rental price ranges and unit listings).
- Deep filtering. Property type, beds, baths, price range, open house only and new construction only, applied server side.
- Agent, brokerage and MLS data. Names, emails, phones, office names, MLS ID and source for every listing that has them.
- Photos and tours. Up to 10 large format photos, total photo count, 3D tour links and a Google Street View URL when available.
- Resume built in. Checkpoint based resume that continues automatically after a restart, plus a separate option to continue one specific interrupted run by ID.
Choose what to collect
These inputs let you configure Realtor.com $0.9💰 Listings, Prices & Agent Details. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring | Location mode = pick city + state + filters below. URL mode = paste any realtor.com search URL already refined in a browser (recommended for complex filters). |
locationsarray | Cities or neighborhoods to search. Add one or more locations, the scraper will search each one. |
listingTypestring | Type of listings to scrape. |
propertyTypestring | Filter by property type. |
bedsMininteger | Minimum number of bedrooms (1-5). |
bathsMininteger | Minimum number of bathrooms (1-5). |
priceMininteger | Minimum listing price in USD. |
Show 15 more inputs
| Input | What it controls |
|---|---|
priceMaxinteger | Maximum listing price in USD. |
openHouseOnlyboolean | Only return listings with open houses (for_sale only, ignored for rent/sold). |
newConstructionOnlyboolean | Only return new construction listings (for_sale and sold only, ignored for rent). |
urlsarray | One or more full realtor.com search URLs. Tip: open realtor.com in your browser, apply any filters (price, beds, property type), then paste the resulting URL here. |
maxListingsinteger | Maximum number of listings to collect (0 = unlimited) |
maxPagesinteger | Maximum pages to scrape per location (0 = unlimited) |
resumeFromCheckpointboolean | Resume a previous run from the last saved checkpoint |
resumeFromRunIdstring | Paste a previous run ID or dataset ID from this account to continue that interrupted crawl, listings it already collected are skipped so this run returns only the delta. Leave empty for a normal run. Different from Resume From Checkpoint above (which auto-continues via this actor's own internal state, no ID needed) and from Incremental mode below (which tracks a recurring search across runs on its own). |
incrementalModeboolean | Turn this ON when you run this actor on a SCHEDULE against the same search. Each listing is classified as NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED compared to the last run of the same search (see State key below). OFF by default so existing runs are unaffected. See emitUnchanged/emitExpired below to control which of those extra rows are returned. |
stateKeystring | Only used when Incremental mode is ON. Identifies which saved baseline this search is compared against. Leave empty to auto-derive one from your location/URL and filter settings, two differently-configured searches never share a baseline either way. Set your own text here only if you want full control (e.g. to intentionally share one baseline across two different-looking searches). |
emitUnchangedboolean | Only used when Incremental mode is ON. OFF by default: a listing identical to the last run is not returned (and not billed). Turn ON to get every tracked listing back on every run, each tagged changeType, this bills a dataset item for every UNCHANGED row too, not just NEW/UPDATED ones. |
emitExpiredboolean | Only used when Incremental mode is ON. OFF by default. Turn ON to get a tombstone row (changeType: EXPIRED) for any previously-tracked listing no longer found, only emitted after a run that scanned every configured search to its natural end (a resume, a block, or a Max Pages/Max Listings cap skips EXPIRED detection that run and keeps the previous state as-is). Each EXPIRED row bills a dataset item like any other row. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
propertyIdID (text)listingTypeType (text)statusStatus (text)addressAddress (object)pricePrice (object)featuresFeatures (object)urlURL (link)changeTypeChange (text)changedFieldsChanged Fields (array)agentsAgents (object)brokerageBrokerage (text)mlsIdMLS ID (text)Show 4 more fields
mlsNameMLS (text)buildingNameBuilding (text)petPolicyPets (object)unitsUnits (object)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"propertyId": "P100234567",
"listingId": "L299887766",
"url": "https://www.realtor.com/realestateandhomes-detail/123-Main-St_Portland_OR_97201_M12345-67890",
"listingType": "for_sale",
"status": "for_sale",
"address": {
"street": "123 Main St",
"city": "Portland",
"state": "Oregon",
"stateCode": "OR",
"postalCode": "97201",
"county": "Multnomah",
"full": "123 Main St, Portland, OR, 97201"
},
"coordinates": {
"latitude": 45.5231,
"longitude": -122.6765
},
"price": {
"value": 525000,
"display": "$525,000"
},
"features": {
"propertyType": "single_family",
"bedrooms": 3,
"bathrooms": 2.5,
"sqft": 1850,
"lotSqft": 5200,
"yearBuilt": 2005,
"garage": 2
},
"flags": {
"isNewListing": true
},
"agents": [
{
"name": "Jane Smith",
"email": "jane@example.com",
"type": "seller",
"office": "Example Realty Group",
"phone": "5035551234"
}
],
"brokerage": "Example Realty Group",
"mlsId": "MLS12345",
"mlsName": "RMLS",
"streetViewUrl": "https://maps.googleapis.com/maps/api/streetview?...",
"hasMatterport": true,
"photos": [
"https://ap.rdcpix.com/example-photo-od-w480_h360_x2.jpg"
],
"photoCount": 32,
"countyFips": "41051",
"listDate": "2026-03-15T10:00:00.000000Z",
"scrapedAt": "2026-03-23T10:30:00.000Z"
}Ways to use this data
- Real estate agents and brokers: build a live feed of new and updated listings in the markets you serve.
- Investors and analysts: track price cuts, days on market and recently sold comps for a neighborhood or price band.
- Apartment and rental hunters: monitor rentals in a city with pet policy and unit level pricing.
- Market research and reporting: collect structured listing data across many cities for dashboards or spreadsheets.
- Lead generation tools: pull agent and brokerage contact details alongside the listings they represent.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Realtor.com return?
The documented output for Realtor.com includes id, type, status, address, price, features, url and change. Availability of each field depends on the source page and the selected mode.
How much does Realtor.com cost?
It costs $1.50 per 1,000 results on the Apify Free plan and from $0.90 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated, reappeared and (if enabled) expired listings, and unchanged ones are not returned or billed unless you turn emitUnchanged on.
What is the difference between Resume From Checkpoint, resumeFromRunId, and Incremental mode?
They solve three different problems. Resume From Checkpoint (on by default) auto-continues this actor's own progress after a restart of the same run, no ID needed. resumeFromRunId continues one specific past run by ID, useful when you manually split a very large search across multiple runs. Incremental mode is for a search you run repeatedly on a schedule; it remembers its own baseline and classifies each listing as new, updated, unchanged, reappeared or expired, without needing any ID at all.
Why did my run fail instead of returning zero listings?
Most problems, including no listings found for your search or a page that could not be loaded, end the run as succeeded with a status message and fewer (or zero) listings, rather than failing it. The run actually fails only when resumeFromRunId points at a run or dataset ID that cannot be found in your account, or when incrementalMode and resumeFromRunId are both set while that search already has saved incremental state (remove one of the two, or use a different stateKey, to resolve it).
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each listing (up to maxNotifyListings, default 50) into Notion, Linear or Airtable.
