Realtor.com Scraper - Homes for Sale & Rent Data avatar

Realtor.com Scraper - Homes for Sale & Rent Data

Pricing

from $2.20 / 1,000 listings

Go to Apify Store
Realtor.com Scraper - Homes for Sale & Rent Data

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

0

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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 location as a US city and state or ZIP.
  • Listing selection: choose sale, rent, or both with listingType.
  • Specific properties: fill detailUrls to collect known listings instead of searching a location.
  • Details: enrichDetails is 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.

FieldDescriptionExample
propertyIdProperty identifier1234567890
listingIdListing identifier1234567891
nameCommunity name or street line; otherwise emptyExample Apartments
listingTypeSale or rental rowsale
statusSource listing statusfor_sale
propertyTypeSource property category; also returned as typesingle_family
streetPlain street line123 Example St
addressStructured street, unit, city, state, ZIP, and country{"locality":"Austin","region":"TX"}
cityProperty cityAustin
stateState codeTX
zipCodeZIP code78701
listPriceAsking price in USD, when supplied450000
listPriceMinLower rental price in USD, when supplied1500
listPriceMaxUpper rental price in USD, when supplied2200
bedsBedroom count3
bathsBathroom count, including fractions2.5
sqftInterior floor area in square feet1800
geoLatitude and longitude; empty if either is missing{"lat":30.27,"lng":-97.74}
listingUrlLink to the listinghttps://www.realtor.com/realestateandhomes-detail/...
photosAvailable photo objects, capped at 50[{"href":"https://example.com/photo.jpg"}]
authorityMLS or listing source nameExample MLS
daysOnMlsDays listed, when supplied12
phonesAvailable advertiser or office phone numbers[{"value":"+1 555 0100","type":null}]
emailsAvailable contact emails; may be a platform mailbox[{"value":"name@example.com","type":null}]
personAgent, advertiser, or platform name and role{"name":"Jane Doe","role":"listing_agent"}
orgProperty agency or broker information{"name":"Example Realty","id":null}
hoaAvailable homeowners association informationnull
petPolicyAvailable rental pet policynull
floorplansAvailable rental floorplan informationnull
scrapedAtCollection timestamp2026-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

  1. Open Realtor.com Scraper in Apify Console.
  2. Enter a location, such as Austin, TX, or paste listing links into detailUrls.
  3. Set maxResults to a small number such as 3 for the first run.
  4. Click Start and wait for the run to finish.
  5. 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

FieldWhat to enterDefault
locationUS city and state or ZIPNo default; form sample Austin, TX
detailUrlsArray of Realtor.com listing URLsNone
maxResultsMaximum rows per input, from 1 to 20070; form sample 3
listingTypesale, rent, or both for a location searchsale
propertyTypesAny of house, condo, townhouse, multi_family, mobile, farm, land, apartment[], all types
propertyTypeOlder single-type filter; merged with propertyTypesEmpty
minPriceMinimum asking price or rent in USDNone
maxPriceMaximum asking price or rent in USDNone
enrichDetailsAdd available detail-page fields to search resultstrue
includeRawInclude source property data under raw; increases row sizefalse

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 planStart charge at 512 MBPrice per rowPrice 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 ApifyClient
client = 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

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; location is not an array of cities.
  • Listing availability changes. The Actor does not guarantee a requested count or complete market coverage.
  • enrichDetails: false skips extra detail collection for search results, not for supplied detail URLs.
  • Photos are capped at 50 per row; photosTruncated and photosTotal flag truncation. Embedded units and units within raw are 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.

More real estate and property data scrapers from the same publisher:

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.