Homes.com Scraper: For Sale, Rent, Sold & Open Houses
Pricing
from $1.80 / 1,000 property results
Homes.com Scraper: For Sale, Rent, Sold & Open Houses
Scrape US property records from Homes.com. Pick a city, state or ZIP and a channel (for sale, for rent, recently sold, open houses, foreclosures), or paste links. One flat row per property with price, beds, baths, size, address, geo, agent and brokerage.
Pricing
from $1.80 / 1,000 property results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Homes.com Scraper turns Homes.com, one of the most visited US real estate portals, into a clean property data feed. Get price, beds, baths, square footage, full address, coordinates, listing agent and brokerage for homes for sale, for rent, recently sold, open houses and foreclosures across the United States. Search by city, state or ZIP, or paste Homes.com links, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Forty listings per page, no extra requests. Every search results page already carries a full set of detailed listings, so a typical search returns complete rows without opening a single property page.
- Detail enrichment on demand. Switch on price and tax history, HOA fees, parking, utilities, schools, highlights and the full description, and pay the surcharge only for listings actually returned.
- Five ways to shape a search. Location, ZIP, bedroom count, a fixed maximum price and sort order, all built from segments Homes.com actually publishes.
- Every channel Homes.com offers. For sale, for rent, recently sold, open houses and foreclosures, plus per-property-type variants like houses, condos, townhouses and land.
- Paste links instead of building a search. A property link returns one fully detailed row; a search link is walked page by page from wherever it starts, including a link that already points at page 2 or later.
- Built for monitoring. Incremental mode returns only new and updated listings on recurring runs by default (plus reappeared and expired ones once Emit expired is also on), and a run that could not read anything fails loudly instead of reporting a false empty result.
- Resume without re-paying. Continue one interrupted crawl by pasting its run or dataset ID; listings it already returned are skipped, not re-collected or re-billed.
Use Cases
- Real estate investors: track price drops and days-on-market across a metro area to time offers.
- PropTech and analytics teams: build historical price and tax datasets for valuation models.
- Lead generation and CRM tools: pull the agent and brokerage contact details published on each listing.
- Market researchers: compare rent and for-sale channels across ZIP codes and property types.
- Portfolio managers: monitor a saved search or a set of properties on a schedule for what actually changed.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
listingKey | "q7w8e9r0t1y2u" |
url | "https://www.homes.com/property/1200-example-st-austin-tx-78701/q7w8e9r0t1y2u/" |
listingChannel / isSold | "for_sale" / false |
name | "1200 Example St, Austin, TX 78701" |
price / priceCurrency | 545000 / "USD" |
priceLabel | "Last List Price" (recently-sold channel only; usually absent for sale/rental listings) |
statusLabel | "$10K PRICE DROP" (also "Sold Feb 3, 2026" on a recently-sold record) |
bedrooms / bathrooms | 4 / 2.5 |
livingAreaSqft / yearBuilt | 2410 / 2006 |
streetAddress / city / state / postalCode | "1200 Example St" / "Austin" / "TX" / "78701" |
propertyType | "SingleFamilyResidence" |
soldDate / daysOnMarket / pricePerSqft | "Feb 3, 2026" / 18 / 226 (recently-sold channel only) |
agentName / agentTitle | "A. Example" / "Listing Agent" |
agentPhone / agentEmail | "(512) 555-0142" / "agent@example.com" |
brokerageName | "Example Realty Group" |
primaryImageUrl / description | lead photo URL / one-line summary |
latitude / longitude | 30.2672 / -97.7431 |
priceHistory | one entry per event: date, event, price, listToSalePercent, pricePerSqft (with detail enrichment) |
taxHistory | one entry per year: taxPaid, totalAssessment, landAssessment, improvementAssessment (with detail enrichment) |
changeType | "NEW" (also "UPDATED", "UNCHANGED" with incremental mode; "REAPPEARED"/"EXPIRED" only with Emit expired too) |
With detail enrichment on, a row also carries priceHistorySource, taxHistorySource, amenityGroups (the full home-details block, grouped as {group, values}), hoaFees, parking, lotDetails, utilities, schools, highlights and fullDescription. With incremental mode on, a row also carries changedFields, firstSeenAt and lastSeenAt. Every row also carries country (always US), agentUrl, availability, datePosted, dateModified and scrapedAt.
How to Use
- Pick a mode:
search(a US location and a listing channel) orurl(paste Homes.com links). - In search mode, fill in the location and optional filters; in URL mode, paste search and/or property links.
- Turn on Fetch full property details if you want price/tax history, HOA, schools and the full description.
- Set Max items (and optionally Max pages) to control run size and cost, then click Start.
Search for houses under a price cap, newest first:
{"mode": "search","location": "Austin, TX","listingType": "houses_for_sale","maxPrice": 800000,"sort": "newest","maxItems": 40}
Search rentals with a bedroom filter:
{"mode": "search","location": "Denver, CO","listingType": "for_rent","minBedrooms": 2,"maxItems": 60}
Paste links (a sold-channel search page and a property page), with full details:
{"mode": "url","urls": ["https://www.homes.com/austin-tx/sold/","https://www.homes.com/property/1200-example-st-austin-tx-78701/q7w8e9r0t1y2u/"],"listingType": "sold","fetchDetails": true}
Recurring monitoring of a ZIP code:
{"mode": "search","location": "78701","listingType": "for_sale","incrementalMode": true,"stateKey": "austin-78701-for-sale","maxItems": 0}
A property link always reads its own page (it is the only source for that row), so it bills the detail-enrichment surcharge for every property row it returns, regardless of the Fetch full property details toggle. A search link is walked exactly like search mode, and only bills the surcharge for the listings it returns when that toggle is on.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/homes-com-scraper").call(run_input={"mode": "search", "location": "Austin, TX", "listingType": "for_sale", "maxItems": 40})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["name"], item["price"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/homes-com-scraper').call({mode: 'search', location: 'Austin, TX', listingType: 'for_sale', maxItems: 40,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
About the filters
Homes.com publishes filters as fixed URL pages rather than free-form parameters, and it silently ignores a page it does not recognise: asking for a filter it does not publish returns the unfiltered result set with a normal 200 OK. That is a quiet way to be charged for rows you did not ask for, so this actor only offers the filters Homes.com actually publishes, and refuses anything else with a clear message instead of running an unfiltered search. In practice that means bedrooms are 1 to 5, and the maximum price is one of $800,000 / $900,000 / $1,000,000 / $1,500,000 / $2,000,000. Filters build the search URL, so they apply to search mode only; a search link you paste in URL mode is walked from its path as given, but any query-string parameters on it are not kept.
Resume and recurring updates
Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset ID and every listing it already returned is skipped this run, so you do not pay twice. A resumed search walk is not cut short by that overlap: the guard that ends a walk on a repeated page compares each page against this run's own earlier pages, never against the resumed seed, so the walk keeps going past pages the previous run already fully covered, and only stops on a genuinely short, empty or repeated page (within this walk), or at Max pages. If Max pages is set low enough that the walk cannot get past the pages the previous run already collected, a resumed run can still return zero new rows this time; raise Max pages, or leave it at 0, to give the walk enough room to reach the new listings.
Incremental mode (incrementalMode) is for scheduled runs over the same search scope. Each listing is classified NEW, UPDATED (with changedFields), or UNCHANGED (suppressed and not billed unless emitUnchanged is on) by default. REAPPEARED and EXPIRED additionally need emitExpired on: EXPIRED is only produced once a run with emitExpired on has proved it scanned the whole tracked search end to end (not capped by Max items, not run with Resume, and it actually scanned something), and REAPPEARED can only be produced for a listing that a previous such run already marked EXPIRED. stateKey names or shares an incremental campaign; leave it empty and the actor derives one automatically from the location, channel, filters and detail settings.
Send results into your apps (MCP connectors)
Optionally pipe results straight into the tools you already use over Model Context Protocol: Notion, Linear, Airtable, or the Apify MCP server. This is an extra delivery step after the scrape; the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify > Settings > Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field.
- For Notion, also set
notionParentPageUrlto the page where item pages should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | select | search | search picks a location and a listing channel; url scrapes exactly the links you paste. |
location | string | Austin, TX | Search mode. A US city and state (Austin, TX) or a 5-digit ZIP (78701). |
zipCode | string | (none) | Search mode. Optionally narrow the search to one 5-digit ZIP inside the location. |
minBedrooms | integer | (none) | Search mode. Homes.com publishes fixed per-count bedroom pages, so only 1 to 5 can be requested, and it matches listings with exactly that many bedrooms rather than a true minimum. |
maxPrice | integer | (none) | Search mode. Fixed maximum-price page: 800000, 900000, 1000000, 1500000 or 2000000. Any other value is refused, not ignored. |
sort | select | relevance | Search mode. newest puts the most recently listed properties first. |
urls | array | (none; prefill: sample search and property links) | URL mode. Homes.com search links (walked page by page) and/or property links (one detailed row each, always billing the detail surcharge). |
listingType | select | for_sale | The listing channel: for sale (and per-property-type variants), for rent (and per-property-type variants), recently sold, open houses, foreclosures. Also labels the rows a pasted link returns. |
fetchDetails | boolean | false | Read each property's own page: price and tax history, home details, HOA, parking, utilities, schools, highlights, full description. Adds a per-listing surcharge, charged only for listings actually returned. |
maxItems | integer | 20 | The single cap on the run. 0 returns everything the search has, bounded by the natural end of results. |
maxPages | integer | 0 | Optional extra ceiling on result pages walked per search. 0 means no page limit. |
resumeFromRunId | string | (none) | Continue one interrupted crawl: paste a previous run ID or dataset ID, and listings it already returned are skipped. |
incrementalMode | boolean | false | For scheduled monitoring: the first run returns everything as NEW, later runs return only what changed. |
stateKey | string | (none) | Optional name for an incremental campaign. Different keys keep separate baselines; the same key shares one. |
emitUnchanged | boolean | false | Also return listings that have not changed, marked UNCHANGED. Returns, and bills, extra rows. |
emitExpired | boolean | false | Also return listings no longer found after a complete scan, marked EXPIRED. Returns, and bills, extra synthetic rows. |
proxy | object | Apify Proxy enabled | Homes.com serves listing pages to US connections only and refuses low-quality exits, so the run climbs to a residential US connection when a cheaper one is refused, unless you pin a specific proxy group or use your own proxy URLs, which always take priority. |
mcpConnectors | array | (none) | Pipe a condensed summary per item into Notion, Linear, Airtable or the Apify MCP server. Authorize once under Apify > Settings > Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: the parent page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written per connector. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"listingKey": "q7w8e9r0t1y2u","url": "https://www.homes.com/property/1200-example-st-austin-tx-78701/q7w8e9r0t1y2u/","listingChannel": "for_sale","isSold": false,"name": "1200 Example St, Austin, TX 78701","price": 545000,"priceCurrency": "USD","priceLabel": "List Price","statusLabel": "$10K PRICE DROP","propertyType": "SingleFamilyResidence","bedrooms": 4,"bathrooms": 2.5,"livingAreaSqft": 2410,"yearBuilt": 2006,"streetAddress": "1200 Example St","city": "Austin","state": "TX","postalCode": "78701","country": "US","latitude": 30.2672,"longitude": -97.7431,"availability": "InStock","datePosted": "2026-06-15T00:00:00.000","dateModified": "2026-09-01T00:00:00.000","brokerageName": "Example Realty Group","agentName": "A. Example","agentTitle": "Listing Agent","agentPhone": "(512) 555-0142","agentEmail": "agent@example.com","agentUrl": "https://www.homes.com/real-estate-agents/a-example/exampleid/","primaryImageUrl": "https://images.homes.com/example/listing-photo.jpg","description": "Updated single-family home near downtown Austin.","fullDescription": "Updated single-family home near downtown Austin with an open floor plan, a fenced backyard and a two-car garage.","priceHistory": [{ "date": "07/02/2026", "event": "Price Changed", "price": 545000, "listToSalePercent": -1.8, "pricePerSqft": 226 }],"priceHistorySource": "Example MLS","taxHistory": [{ "year": 2025, "taxPaid": 9120, "totalAssessment": 512000, "landAssessment": 140000, "improvementAssessment": 372000 }],"taxHistorySource": "Public Records","amenityGroups": [{ "group": "Interior Features", "values": ["Hardwood floors", "Walk-in closet"] }],"hoaFees": ["$45 Monthly HOA Fee"],"parking": ["2 Car Garage"],"lotDetails": ["0.18 Acre Lot"],"utilities": ["Public Sewer", "Public Water"],"schools": ["Example Elementary School", "Example High School"],"highlights": ["Recently updated kitchen"],"changeType": "NEW","changedFields": [],"firstSeenAt": "2026-09-04T09:41:00Z","lastSeenAt": "2026-09-04T09:41:00Z","scrapedAt": "2026-09-04T09:41:00Z"}
Plan Requirement
Homes.com serves its listing pages to US connections only and refuses low-quality exits, so the run automatically climbs to a residential US connection when a cheaper one is refused, unless you pin a specific proxy group or use your own proxy URLs, which always take priority. Leave the Proxy configuration enabled for the most reliable results.
FAQ
How much does it cost?
You pay per property row returned, plus a per-listing surcharge only for rows where detail enrichment actually ran, plus a one-time actor-start charge. The Pricing tab shows the current rates. Use Max items to cap the cost of any run, and remember that a pasted property link in URL mode reads its detail page and bills the surcharge for every such row it returns, whether or not the toggle is on.
Is it legal to scrape Homes.com?
This actor collects only publicly available property data. You are responsible for how you use it: follow Homes.com's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts such as price and specs are generally treated as data, but photos, descriptions and agent details may carry their own rights.
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 and updated listings by default (plus reappeared ones once you also turn on Emit expired), and unchanged ones are not billed unless you turn on Emit unchanged.
Why was my Bedrooms or Maximum price value rejected instead of just ignored?
Homes.com publishes these filters as fixed URL pages, and silently answers an unrecognised page with the unfiltered result set. Rather than risk billing you for rows you did not ask for, this actor only accepts the values Homes.com actually publishes (bedrooms 1 to 5, and the five listed price ceilings) and refuses anything else with a clear message.
Why did my run fail instead of returning an empty dataset?
If every page this run tried came back refused, the run stops with a clear message so "no listings here" is never confused with "nothing could be read". A genuinely empty search (pages read fine, nothing matched) still succeeds and says so. Run it again in a few minutes if the connection was the problem.
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 results into Notion, Linear or Airtable.
๐ Want more Homes data?
Pair this actor with these related scrapers from the same team:
| ๐ Homes.co.nz Scraper Scrape Homes.co.nz listings by location or URL with pagination. Extract property details... | ๐ Redfin Scraper Scrape redfin.com home listings: price, beds, baths, sqft, lot, year built, coordinates... |
| ๐งฉ Zillow Scraper Scrape zillow.com properties for sale, for rent and recently sold across the US: price... | ๐ OnTheMarket Scraper Scrape onthemarket.com for-sale, to-rent and new-homes listings with 85+ fields: price... |
| ๐ Realtor.ca From $1/1K. Scrape Realtor.ca property listings with prices, descriptions, images, agent... | ๐ NewHomeSource Scrape new homes, floor plans, builders and communities from NewHomeSource.com. Search by... |
๐ Browse all abotapi scrapers
๐ฌ Support & custom scrapers
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- โญ Enjoying it? A quick review on the actor page helps other users find it.