Realtor.com Scraper - Homes for Sale & Rent Data
Pricing
from $2.20 / 1,000 listings
Realtor.com Scraper - Homes for Sale & Rent Data
Collect US Realtor.com homes for sale and rent by city, ZIP, or listing URL. Get prices, property details, photos, and available agent contacts. Pay per delivered listing row plus a start fee.
Pricing
from $2.20 / 1,000 listings
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Realtor.com Scraper
Collect US homes for sale and rental listings from Realtor.com as structured rows for spreadsheets, market research, and property comparisons.
- Search a city or ZIP, or supply specific listing URLs.
- Get prices, bedrooms, bathrooms, floor area, addresses, and listing links.
- Include available photos, MLS information, agent contacts, rental fees, and floorplans.
- Filter residential listings by property type and price.
- Pay per delivered row: $3.00 per 1,000 rows on the Free plan, plus a small start fee.
What does Realtor.com Scraper do?
Realtor.com Scraper collects residential property listings from Realtor.com in the United States. Each dataset row represents a listing, not an individual photo or contact. Use the rows to compare asking prices, review rental inventory, or update a spreadsheet of known properties.
- Location search: enter
locationas a US city and state or ZIP. - Listing selection: choose
sale,rent, orbothwithlistingType. - Specific properties: fill
detailUrlsto collect known listings instead of searching a location. - Details:
enrichDetailsis on by default for search results. It adds available detail-page information to the same row; it does not create separately billed add-on rows.
What data can you extract from Realtor.com?
Sale and rental rows share one structure. Available fields vary by listing; a field being supported does not mean every property supplies it.
| Field | Description | Example |
|---|---|---|
propertyId | Property identifier | 1234567890 |
listingId | Listing identifier | 1234567891 |
name | Community name or street line; otherwise empty | Example Apartments |
listingType | Sale or rental row | sale |
status | Source listing status | for_sale |
propertyType | Source property category; also returned as type | single_family |
street | Plain street line | 123 Example St |
address | Structured street, unit, city, state, ZIP, and country | {"locality":"Austin","region":"TX"} |
city | Property city | Austin |
state | State code | TX |
zipCode | ZIP code | 78701 |
listPrice | Asking price in USD, when supplied | 450000 |
listPriceMin | Lower rental price in USD, when supplied | 1500 |
listPriceMax | Upper rental price in USD, when supplied | 2200 |
beds | Bedroom count | 3 |
baths | Bathroom count, including fractions | 2.5 |
sqft | Interior floor area in square feet | 1800 |
geo | Latitude and longitude; empty if either is missing | {"lat":30.27,"lng":-97.74} |
listingUrl | Link to the listing | https://www.realtor.com/realestateandhomes-detail/... |
photos | Available photo objects, capped at 50 | [{"href":"https://example.com/photo.jpg"}] |
authority | MLS or listing source name | Example MLS |
daysOnMls | Days listed, when supplied | 12 |
phones | Available advertiser or office phone numbers | [{"value":"+1 555 0100","type":null}] |
emails | Available contact emails; may be a platform mailbox | [{"value":"name@example.com","type":null}] |
person | Agent, advertiser, or platform name and role | {"name":"Jane Doe","role":"listing_agent"} |
org | Property agency or broker information | {"name":"Example Realty","id":null} |
hoa | Available homeowners association information | null |
petPolicy | Available rental pet policy | null |
floorplans | Available rental floorplan information | null |
scrapedAt | Collection timestamp | 2026-10-24T08:00:00Z |
Other supported fields include monthlyFees, oneTimeFees, propertyHistory, and taxHistory. Check detailAttempted, detailSucceeded, and detailErrorCode to distinguish a successful detail lookup from a search-only row. leadSource is detail after successful detail collection and search for search-only or fallback rows.
address.unit means an apartment or suite, not the house number. Rental rows can contain ranges such as bedsMin and bedsMax; they should not be read as a single available apartment. Photos and floorplans are attributes of the listing row.
How to scrape Realtor.com
- Open Realtor.com Scraper in Apify Console.
- Enter a
location, such asAustin, TX, or paste listing links intodetailUrls. - Set
maxResultsto a small number such as3for the first run. - Click Start and wait for the run to finish.
- Open the dataset and download the rows, or read them through the API.
Empty input starts an example search for Austin, TX, using the form's sale selection and a limit of 3 rows. Normal event prices apply to this example. Supplying a target selects the appropriate collection path automatically; there is no mode field to set.
Search a location
Use one US city and state, or one ZIP, in location. Choose sale for homes for sale, rent for rentals, or both to include both in the same allowance. The limit is not doubled when you choose both.
Collect specific listings
Put one or more listing-page URLs in detailUrls. These take precedence over location; the Actor skips location search. Each URL must contain a property identifier ending like _M12345-67890. Copy actual listing links from Realtor.com: a search-page URL is not a detail URL. Detail URLs fetch the property directly even when enrichDetails is false.
What to fill in
| Field | What to enter | Default |
|---|---|---|
location | US city and state or ZIP | No default; form sample Austin, TX |
detailUrls | Array of Realtor.com listing URLs | None |
maxResults | Maximum rows per input, from 1 to 200 | 70; form sample 3 |
listingType | sale, rent, or both for a location search | sale |
propertyTypes | Any of house, condo, townhouse, multi_family, mobile, farm, land, apartment | [], all types |
propertyType | Older single-type filter; merged with propertyTypes | Empty |
minPrice | Minimum asking price or rent in USD | None |
maxPrice | Maximum asking price or rent in USD | None |
enrichDetails | Add available detail-page fields to search results | true |
includeRaw | Include source property data under raw; increases row size | false |
For-sale search:
{"location": "Austin, TX","listingType": "sale","propertyTypes": ["house", "condo"],"maxPrice": 600000,"maxResults": 3}
Rental search:
{"location": "78701","listingType": "rent","maxPrice": 2500,"maxResults": 3}
Sale and rent together:
{"location": "Austin, TX","listingType": "both","maxResults": 4}
Specific listing, with an illustrative URL to replace with a real one:
{"detailUrls": ["https://www.realtor.com/realestateandhomes-detail/123-Example-St_Austin_TX_78701_M12345-67890"],"maxResults": 1}
maxItems and limit are aliases for maxResults. city, zip, and zipCode are accepted for location; urls and startUrls are accepted for detailUrls. Close field-name misspellings can be corrected, while other unknown fields are ignored with a note.
Invalid property filters are ignored rather than stopping collection. An inverted price range is also ignored, so check your filters before starting. Unusable listing URLs fail with INVALID_INPUT: followed by the field and a correction, before any row is charged; the start fee still applies. Each run writes the input resolver's interpretation to INPUT_REPORT in its default key-value store, including corrections, ignored fields, and example-run status.
Output example
This shortened, illustrative sale row uses placeholders for property and contact details:
{"name": "123 Example St","type": "single_family","propertyType": "single_family","status": "for_sale","country": "USA","authority": "Example MLS","listingId": "1234567891","propertyId": "1234567890","listingType": "sale","street": "123 Example St","city": "Austin","state": "TX","zipCode": "78701","listPrice": 450000,"beds": 3,"baths": 2.5,"sqft": 1800,"listingUrl": "https://www.realtor.com/realestateandhomes-detail/123-Example-St_Austin_TX_78701_M12345-67890","phones": [{"value": "+1 555 0100", "type": null}],"emails": [],"person": {"name": "Jane Doe", "role": "listing_agent"},"detailAttempted": true,"detailSucceeded": true,"detailErrorCode": null,"leadSource": "detail","source": "realtor.com","scrapedAt": "2026-10-24T08:00:00Z"}
Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. JSON preserves nested objects and arrays. The key-value store also provides RUN_SUMMARY with counts and warnings, INPUT_ECHO with interpreted input, and ERROR_SUMMARY when a failure is reported.
Why use this Realtor.com scraper?
- Pay for delivered rows. Row charges apply to dataset rows, not unsuccessful listing attempts; there is also a start fee.
- Keep usable partial results. When collection ends early with partial rows, those rows can still be delivered. Rows already written to the dataset remain available. A forced stop before delivery is not a guarantee that every collected row will appear.
- Inspect missing detail data. Per-row detail status helps separate missing source information from a failed lookup.
- Use several known URLs. Collect multiple supplied properties in one run without searching their cities separately.
- No proxy setup. You do not need to set up proxies.
How much does it cost to scrape Realtor.com?
The Actor uses pay-per-event pricing. The start event costs $0.005 per allocated GB, with a minimum of one event. At the default 512 MB memory, the start charge is $0.005. Platform usage is included in these prices.
| Apify plan | Start charge at 512 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
maxResults applies to each location or supplied detail URL. It defaults to 70; larger requests are collected in parts of up to 70, within the schema maximum of 200 per input. A specific property URL normally yields one listing, not repeated copies to fill its allowance.
Free Apify plan users are limited to 10 runs of this Actor and 200 rows per run. Paid plans remove this 10-run restriction, not the input limit. The whole run also stops at the Maximum cost per run you set (maxTotalChargeUsd in the API).
Example: one location delivering 100 rows on the Free plan at 512 MB costs 100 × $0.003 + $0.005 = $0.305. Fewer delivered rows mean a lower row charge. A run returning no rows has no row charge, but still has its start charge.
What happens when the run timeout is too short
When automatic resume is accepted for a search that needs longer than the remaining timeout, the run pauses instead of failing immediately. Its status message is "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." It temporarily appears as ABORTED.
Once results are ready, the same run resumes, delivers to the same dataset, and can finish as SUCCEEDED. When continuing a partially delivered result, it reports "Resumed: delivering N rows." Previously delivered rows are skipped to avoid delivering and charging them twice.
The pause-and-resume limit is 3 times per run. Keep the default timeout of 3600 seconds to reduce interruptions. Not every ABORTED run is a resumable pause: check the status message before starting another run.
The synchronous API endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and can return an empty dataset during a pause. For longer searches, start asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server
Add this Actor to a remote MCP client such as Claude, ChatGPT, Cursor, or VS Code:
https://mcp.apify.com?tools=lentic_clockss/realtor-com-scraper
Sign in through Apify OAuth when prompted, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent then reads rows with get-dataset-items. Clients without remote MCP support can use npx @apify/actors-mcp-server --tools lentic_clockss/realtor-com-scraper with APIFY_TOKEN set.
Example prompt: "Find three Realtor.com homes for sale in Austin, TX, priced below $600,000. Return the prices, bedroom counts, and listing links."
Apify API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/realtor-com-scraper").call(run_input={"location": "Austin, TX", "listingType": "sale", "maxResults": 3})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/realtor-com-scraper').call({location: 'Austin, TX', listingType: 'sale', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP calls, send POST https://api.apify.com/v2/acts/lentic_clockss~realtor-com-scraper/runs with your JSON input and Authorization: Bearer <YOUR_APIFY_TOKEN>. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json using the run's defaultDatasetId.
Integrations
Use Apify's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or your own webhook. Apify Schedules can run a saved search regularly.
FAQ
Is it legal to scrape Realtor.com?
This Actor collects publicly available listing data. You are responsible for checking applicable website terms and data protection law. Personal data, including agent contact details, needs a lawful basis for your intended use; public visibility alone is not permission for every use.
Why did my run end as ABORTED?
Check the status message. An automatic-resume message means the run is temporarily paused and should restart when results are ready. A manual abort or another failure is different; do not assume every ABORTED run will resume.
How many results can I get?
Request 1–200 rows per input with maxResults, default 70. Available listings and your cost limit can reduce that number. Free-plan runs have a 200-row total cap and a 10-run allowance for this Actor.
Why are some fields empty?
The listing may not publish them, collection may not request them, or detail enrichment may fail. Search-only runs have fewer detail fields. Inspect detailSucceeded, detailErrorCode, and leadAbsences; an empty value does not prove that the property lacks that feature.
Can I collect sale and rental listings together?
Yes. Set listingType to both for a location search. Both categories share the input's row allowance; the Actor does not promise equal counts when availability differs.
Are rental contacts always individual agents?
No. person.role can be platform, and an email can belong to an agency or platform rather than a specific agent. Review the role and contact fields before using them.
Does this collect commercial properties or agent profiles?
No. It covers residential listings, including the residential site's multi-family, farm, and land categories. Commercial office, retail, industrial, and agent profile pages are outside this Actor's scope.
Limitations
- US residential listings only; other countries and property portals are not covered.
- One location per search input;
locationis not an array of cities. - Listing availability changes. The Actor does not guarantee a requested count or complete market coverage.
enrichDetails: falseskips extra detail collection for search results, not for supplied detail URLs.- Photos are capped at 50 per row;
photosTruncatedandphotosTotalflag truncation. Embeddedunitsand units withinraware capped at 5. details,specials, and organization IDs are not currently collected. Individual agent websites and social links are not populated.- Contact availability is not guaranteed. The Actor does not submit contact forms.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- Craigslist Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Apartments.com Rental Scraper
- Dot Property Scraper
- FINN.no Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.