Homes.com Scraper icon

Homes.com Scraper

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…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Homes.com Scraper at a glance

Homes.com Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes listing key, change, channel, sold and property, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.50 per 1,000 results on the Apify Free plan and from $1.80 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
Web data
Pricing
$2.50 per 1,000 results (Free plan), from $1.80 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
23 options

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.

What Homes.com Scraper: For Sale, Rent, Sold & Open Houses can do

  • 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.

Choose what to collect

These inputs let you configure Homes.com Scraper: For Sale, Rent, Sold & Open Houses. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestringsearch = pick a US location and a listing channel, and get every matching property. url = paste homes.com search or property links and get only those.

Choices: search, url

locationstringA US city and state ('Austin, TX'), or a 5-digit ZIP code ('78701'). Accepted in any casing and with or without the comma.
zipCodestringOptional. Narrow the search to a single 5-digit US ZIP code inside the location above.
minBedroomsintegerOptional. homes.com exposes bedroom filtering as one fixed page per count, so only 1 to 5 can be requested and the value matches listings with exactly that bedroom count. Leave empty for no bedroom filter.
maxPriceintegerOptional. homes.com only publishes fixed maximum-price pages: 800000, 900000, 1000000, 1500000 or 2000000. Any other value is rejected with a clear message rather than silently ignored. Leave empty for no price ceiling.
sortstringResult ordering. 'Newest' puts the most recently listed properties first, which is the useful setting when you cap the run with Max items.

Choices: relevance, newest

urlsarrayOnly used when mode = url. A property link always reads its full property page, so it always bills the detail surcharge. A search link is walked like search mode.
Show 16 more inputs
More input fields
InputWhat it controls
listingTypestringWhich homes.com channel to read. 'Recently sold' returns closed sales with the sale date, days on market and price per square foot. 'Open houses' returns only listings with a scheduled open house.

Choices: for_sale, houses_for_sale, condos_for_sale, townhouses_for_sale, multi_family_for_sale, land_for_sale, for_rent, houses_for_rent, condos_for_rent, townhouses_for_rent, apartments_for_rent, sold, open_houses, foreclosure

fetchDetailsbooleanReads each property page and adds the sections that do not exist on a result card: price and property history (with list-to-sale percentages and price per square foot), multi-year tax history with land and improvement assessments, grouped home details, HOA fees, parking, utilities, schools, highlights and the full listing description. Adds one page read per listing and bills a per-listing detail-enrichment surcharge only for listings actually returned.
maxItemsintegerThe single cap on the run: stop after this many property rows across all searches and URLs. Defaults to 20 so a run stays small unless you raise it. 0 = unlimited, bounded only by the natural end of results (or Max pages, if set).
maxPagesintegerOptional hard cap on the number of result pages walked per search or pasted search link. Each page carries up to 40 listings. 0 (default) means no page limit: the walk stops naturally on a short page, an empty page, or a page that repeats listings already collected.
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large crawl without returning or charging for listings already collected there. For recurring monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED listings. A listing is UPDATED when any of its returned data changed (price, status, description, photos, agent, details...), except the scrape time and days on market, which are never compared; 'What counts as a change' narrows this to price and availability only, and 'Ignore fields' excludes more fields. changedFields names what moved. Turn on 'Emit unchanged' or 'Emit expired' only when you also want those rows returned (and billed). State is kept separately for each location, channel, filter and detail setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the location, channel, filters and detail settings, so different searches never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, never when Max items capped it, when Resume was used, or when the run scanned nothing. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
changeScopestringAll fields (default): any change to a listing's data makes it UPDATED, except fields that change on their own (the scrape time and days on market). Price and availability only: only a change to price, price label, currency, availability, status, sold flag or sold date, or to a price-history entry, makes a listing UPDATED; description, photos, agent and the other details never do.

Choices: all, priceAndStock

compactUpdatesbooleanOff by default. Turn on to return UPDATED and EXPIRED listings as short rows: identifiers, current price and availability, priceChanges (old and new value) and variantChanges (price-history events added, removed or changed). NEW rows stay complete. A compact row carries no detail-page data, so the detail-enrichment surcharge is not charged for it.
expireAfterMissedScansintegerWith Emit expired on: a listing is marked EXPIRED only after it was missing from this many complete scans in a row (default 1). EXPIRED means the listing was no longer found in the search results; it does not prove the home was sold or delisted.
ignoreFieldsForChangesarrayField names whose changes never make a listing UPDATED (they stay in the output). A dotted path such as priceHistory.pricePerSqft ignores that key inside every element of a list. Fields that change on their own (the scrape time and days on market) are always ignored.
mcpConnectorsarrayOptionally 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.
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap 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.

listingKeyListing key (text)
changeTypeChange (text)
listingChannelChannel (text)
isSoldSold (boolean)
nameProperty (text)
pricePrice (number)
priceCurrencyCurrency (text)
priceLabelPrice label (text)
statusLabelStatus (text)
soldDateSold date (text)
daysOnMarketDays on market (number)
pricePerSqftPrice / sq ft (number)
Show 40 more fields
propertyTypeProperty type (text)
bedroomsBeds (number)
bathroomsBaths (number)
livingAreaSqftSq ft (number)
yearBuiltYear built (number)
streetAddressStreet (text)
cityCity (text)
stateState (text)
postalCodeZIP (text)
countryCountry (text)
latitudeLatitude (number)
longitudeLongitude (number)
availabilityAvailability (text)
datePostedListed (text)
dateModifiedUpdated (text)
brokerageNameBrokerage (text)
agentNameAgent (text)
agentTitleAgent role (text)
agentPhoneAgent phone (text)
agentEmailAgent email (text)
agentUrlAgent page (link)
primaryImageUrlPhoto (image)
descriptionSummary (text)
fullDescriptionFull description (text)
highlightsHighlights (array)
schoolsSchools (array)
amenityGroupsHome details (array)
lotDetailsLot details (array)
hoaFeesHOA fees (array)
parkingParking (array)
utilitiesUtilities (array)
priceHistoryPrice history (array)
priceHistorySourcePrice history source (text)
taxHistoryTax history (array)
taxHistorySourceTax history source (text)
urlListing URL (link)
changedFieldsChanged fields (array)
firstSeenAtFirst seen (text)
lastSeenAtLast seen (text)
scrapedAtScraped at (text)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "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"
}

Ways to use this data

  • 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.

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 Homes.com Scraper return?

The documented output for Homes.com Scraper includes listing key, change, channel, sold, property, price, currency and price label. Availability of each field depends on the source page and the selected mode.

How much does Homes.com Scraper cost?

It costs $2.50 per 1,000 results on the Apify Free plan and from $1.80 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 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 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.

Ready to collect with Homes.com Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.