Homes.com Scraper with Contacts & History avatar

Homes.com Scraper with Contacts & History

Pricing

from $0.70 / 1,000 property listings

Go to Apify Store
Homes.com Scraper with Contacts & History

Homes.com Scraper with Contacts & History

Extract Homes.com listings at scale with rich property detail, agent and agency contacts, pricing, media, sale and rental history, MLS data, and flexible market filters. Built for enterprise-grade real estate intelligence, lead enrichment, inventory monitoring, and automated analytics pipelines.

Pricing

from $0.70 / 1,000 property listings

Rating

0.0

(0)

Developer

Fatih Tahta

Fatih Tahta

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Homes.com Scraper

Slug: fatihtahta/homes-com-scraper

Overview

Homes.com Scraper collects structured real estate listing records from Homes.com, including listing identity, listing URL, status, deal type, pricing, location, property characteristics, media counts, contact details, and source context. Homes.com is a public real estate marketplace where current and historical property inventory can be useful for market research, operational reporting, competitive monitoring, and enrichment workflows. The actor turns location-based Homes.com searches into repeatable JSON datasets that can be used in analytics tools, data warehouses, CRMs, and internal applications. It is designed for automation and recurring data acquisition, with consistent record structures that make repeated runs easier to compare, deduplicate, and synchronize. Output availability depends on what Homes.com publicly exposes at run time, but the actor is structured to support dependable, operationally consistent collection workflows.

Why Use This Actor

  • Market research and analytics teams: collect structured property inventory for market intelligence, pricing studies, availability tracking, neighborhood comparison, and operational reporting.
  • Product and content teams: populate real estate experiences, internal directories, editorial research, or listing comparison tools with normalized public listing attributes.
  • Developers and data engineering teams: feed downstream systems with JSON records that are suitable for ETL pipelines, scheduled exports, warehouse ingestion, and dataset normalization.
  • Lead generation and enrichment teams: build targeted real estate prospect lists using public listing, location, property, and contact attributes where available.
  • Monitoring and competitive tracking teams: schedule repeatable collection jobs to observe inventory movement, recent listings, price changes, and listing mix across selected markets.

Common Use Cases

  • Market intelligence: monitor supply, pricing, availability, property types, locations, and listing status movement across target markets.
  • Lead generation: build targeted prospect lists from public property listings and available contact information.
  • Competitive monitoring: track listing changes across neighborhoods, price bands, property categories, or sale and rental segments.
  • Catalog and directory building: populate internal databases with structured public real estate records.
  • Data enrichment: add current public property attributes to existing CRM, BI, analytics, or research datasets.
  • Recurring reporting: schedule periodic runs for dashboards, alerts, regional summaries, or trend analysis.
  • Targeted inventory review: collect listings that match specific criteria such as price, bedrooms, bathrooms, lot size, year built, publication age, or keyword.

Quick Start

  1. Choose a required location, such as a city, state, ZIP code, neighborhood, or market name.
  2. Select the deal_type that matches your goal: for-sale, rental, sold, not-for-sale, or all available inventory.
  3. Add optional filters such as price, property type, bedrooms, bathrooms, building size, lot size, listing status, publication date, or keyword.
  4. Set a small limit for the first validation run so you can inspect the output shape quickly.
  5. Run the actor in Apify Console and review the first dataset records.
  6. Increase the limit, broaden coverage, adjust filters, or schedule the actor once the output matches your workflow.

Input Parameters

Provide a required Homes.com location, then choose the listing mode, optional property filters, sort order, enrichment setting, coverage setting, and output limit.

ParameterTypeDescriptionDefault
locationstringRequired Homes.com market or area. Use a city, state, ZIP code, neighborhood, or market name.–
deal_typestringListing mode. Allowed values: buy, rent, sold, not_for_sale, all.buy
min_priceintegerMinimum listing price in USD. Applies to price-filtered listing searches where supported.–
max_priceintegerMaximum listing price in USD. Applies to price-filtered listing searches where supported.–
property_typearray of stringsProperty categories to include. Allowed values: house, townhouse, condo, co_op, lot_land, mobile_homes, multifamily, other, apartment.–
min_bedroomstringMinimum bedroom count. Allowed values: studio, 1, 2, 3, 4, 5+.–
max_bedroomstringMaximum bedroom count. Allowed values: studio, 1, 2, 3, 4, 5+.–
min_bathroomstringMinimum bathroom count. Allowed values: 1, 2, 3, 4, 5+.–
max_bathroomstringMaximum bathroom count. Allowed values: 1, 2, 3, 4, 5+.–
min_building_areastringMinimum building area in square feet. Allowed values: 500, 750, 1000, 1250, 1500, 1750, 2000, 2250, 2500, 2750, 3000, 3500, 4000, 4500, 5000, 6000, 7000, 8000, 9000, 10000.–
max_building_areastringMaximum building area in square feet. Allowed values: 500, 750, 1000, 1250, 1500, 1750, 2000, 2250, 2500, 2750, 3000, 3500, 4000, 4500, 5000, 6000, 7000, 8000, 9000, 10000.–
min_land_areastringMinimum lot size. Allowed values: 3000_sqft, 5000_sqft, 7000_sqft, 0.25_acre, 0.5_acre, 0.75_acre, 1_acre, 1.5_acres, 2_acres, 2.5_acres, 3_acres, 4_acres, 5_acres, 10_acres, 15_acres, 20_acres, 50_acres, 100_acres, 500_acres, 1000_acres.–
max_land_areastringMaximum lot size. Allowed values: 3000_sqft, 5000_sqft, 7000_sqft, 0.25_acre, 0.5_acre, 0.75_acre, 1_acre, 1.5_acres, 2_acres, 2.5_acres, 3_acres, 4_acres, 5_acres, 10_acres, 15_acres, 20_acres, 50_acres, 100_acres, 500_acres, 1000_acres.–
min_psfintegerMinimum price per square foot in USD. Applies to price-per-square-foot searches where supported.–
max_psfintegerMaximum price per square foot in USD. Applies to price-per-square-foot searches where supported.–
keywordstringKeyword or phrase used to narrow listings by matching public listing text or attributes.–
mls_numberstringMLS number used to target a known listing when available.–
sale_listing_statusarray of stringsFor-sale listing statuses to include. Allowed values: coming_soon, active, under_contract, pending.["coming_soon", "active"]
sale_listing_typearray of stringsFor-sale listing types to include. Allowed values: resale, new_construction, pre_foreclosure, foreclosure, short_sale, auction.–
publication_datestringListing age window for sale and rental searches. Allowed values: last_24_hours, less_than_3_days, less_than_7_days, less_than_1_month, more_than_7_days, more_than_14_days, more_than_1_month, more_than_3_months, more_than_6_months, more_than_1_year.–
price_reduction_periodstringPrice reduction timing window for for-sale searches. Allowed values: last_3_days, last_7_days, last_14_days, last_30_days, over_1_month, over_2_months, over_3_months.–
min_parkingstringMinimum parking spaces. Allowed values: 1+, 2+, 3+, 4+.–
garage_parkingbooleanRequire garage parking when parking filters are relevant.false
open_house_and_toursstringOpen house or media availability filter. Allowed values: open_house, 3d_tours, matterport_3d_tour, video.–
min_greatschools_ratingstringMinimum GreatSchools rating. Allowed values: 5+, 6+, 7+, 8+, 9+, 10.–
min_niche_grade_ratingstringMinimum Niche grade. Allowed values: C, B, B+, A-, A, A+.–
viewsarray of stringsView types to include for sale or rental listings. Allowed values: mountain_hills, water, city, woods, other.–
min_building_yearstringEarliest year built. Allowed values: 1900, 1925, 1950, 1960, 1970, 1980, 1990, 2000, 2005, 2010, 2015, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026.–
max_building_yearstringLatest year built. Allowed values: 1900, 1925, 1950, 1960, 1970, 1980, 1990, 2000, 2005, 2010, 2015, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026.–
min_storiesstringMinimum number of stories. Allowed values: 1, 2, 3.–
max_storiesstringMaximum number of stories. Allowed values: 1, 2, 3.–
sort_bystringResult ordering. Allowed values: recommended, newest, price_low_to_high, price_high_to_low, rental_rate_low_to_high, rental_rate_high_to_low, year_built.recommended
enrich_databooleanCollect richer details from individual listing pages when available, such as highlights, MLS information, property details, and history tables. This can make runs slower.false
maximize_coveragebooleanUse for broad markets when you want a stronger effort to collect more available results. May increase run time.false
limitintegerMaximum number of records to save. Minimum value: 1. Leave empty to collect as many matching results as the configured search can return.–

Choosing Inputs

Start with the most important scope decision: location. A specific city, ZIP code, neighborhood, or market produces a more focused dataset, while a broader location improves discovery but may require a higher limit or maximize_coverage.

Use deal_type to align the run with the inventory you need: for-sale listings, rentals, sold properties, not-for-sale properties, or all available inventory. Add filters gradually. Narrow filters such as price, bedrooms, bathrooms, lot size, school ratings, publication date, or keyword produce more targeted records, while broader filters increase discovery and help market exploration.

For validation, set a small limit first and inspect the dataset. After confirming the output shape and coverage, increase limit, adjust sort_by, or enable maximize_coverage for large markets where broader collection is needed.

Example Inputs

For-sale market validation

{
"location": "Los Angeles, CA",
"deal_type": "buy",
"property_type": ["house", "townhouse"],
"min_price": 500000,
"max_price": 1200000,
"sort_by": "newest",
"limit": 25
}

Rental inventory review

{
"location": "Austin, TX",
"deal_type": "rent",
"property_type": ["apartment"],
"min_bedroom": "1",
"max_price": 3000,
"sort_by": "rental_rate_low_to_high",
"limit": 50
}

Broad discovery with conservative coverage

{
"location": "Phoenix, AZ",
"deal_type": "all",
"min_building_year": "2000",
"max_building_area": "3000",
"maximize_coverage": true,
"limit": 100
}

Output

Output destination

The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs with minimal post-processing.

The example below documents the listing record shape. If additional entity types or record shapes are returned in future versions, each shape should be documented separately based on its example output.

Record envelope and stable identifiers

Each record is a Homes.com listing object with top-level identity fields, grouped listing attributes, and source context. The recommended idempotency key is listing_id; when a workflow needs an additional guard, use a composite key such as listing_id plus url, or compare source_context.fingerprint.

Use the recommended key for deduplication and upserts when loading records into warehouses, CRMs, search indexes, or internal databases. Stable identifiers make records easier to merge, deduplicate, and sync across repeated runs.

The source_context.fingerprint field provides an additional comparison value for repeat collection workflows.

When enrich_data is enabled, records keep the same base shape and may include additional optional fields under pricing, location, property, contact, listing_details, history, and source_context. The actor only enriches listings discovered from the requested search scope.

Examples

Example: listing record

{
"listing_id": "vqrb8jewftvgn",
"url": "https://www.homes.com/property/12401-filmore-637-st-sylmar-ca-unit-637/vqrb8jewftvgn/",
"title": "12401 Filmore #637 St Unit 637, Sylmar, CA 91342",
"status": "for sale",
"deal_type": "buy",
"pricing": {
"price": "$120,000",
"map_price": "120K",
"currency": "USD"
},
"location": {
"address": "12401 Filmore #637 St Unit 637, Sylmar, CA 91342",
"latitude": 34.28713,
"longitude": -118.40353
},
"property": {
"property_type": "ManufacturedHome",
"beds": "1 Bed",
"baths": "1 Bath",
"sqft": "460 Sq Ft",
"description": "The home has been remodeled inside-out with new appointments, such as new kitchen with stove and microwave included in the sale,1 new mini-split for your comfort. The flooring, dual-pane windows, paint inside and outside, just about everithng is new. The remodeling was done with excellent taste and decor to blend with the necessities of today's world. The complex has a pool and entertainments"
},
"media": {
"primary_image_url": "https://images.homes.com/listings/115/1184088684-117623812/12401-filmore-637-st-sylmar-ca-primaryphoto.jpg",
"image_count": 14
},
"contact": {
"agent_name": "Federico Triebel",
"agency_name": "Federico J. Triebel",
"agency_phone": "(747) 946-5552"
},
"source_context": {
"seed_id": "a4c67fb8079a88949510",
"seed_type": "search",
"seed_value": "Los Angeles, CA",
"page_index": 1,
"fingerprint": "0efff9064f9cd0e8ce52",
"source_keys": {
"location_key": "8cxzcm6d86l58",
"property_asset_key": "ng2c9tq"
}
}
}

Field Reference

Listing Record

listing_id (string, required): Stable Homes.com listing identifier when available.

url (string, required): Public Homes.com listing URL.

title (string, optional): Human-readable listing title or address-style heading.

status (string, optional): Listing status, such as for sale.

deal_type (string, required): Collection mode used for the listing, such as buy, rent, sold, not_for_sale, or all.

pricing.price (string, optional): Display price exactly as available from the listing.

pricing.map_price (string, optional): Compact price label when available.

pricing.price_per_sqft (string, optional): Listing-page price per square foot label when enrichment is enabled and available.

pricing.estimated_payment (string, optional): Estimated payment text from the listing page when enrichment is enabled and available.

pricing.monthly_price_label (string, optional): Rental price label from the listing page, such as total monthly price, when enrichment is enabled and available.

pricing.currency (string, optional): Currency code, such as USD.

location.address (string, optional): Public listing address or location label.

location.latitude (number, optional): Latitude coordinate when available.

location.longitude (number, optional): Longitude coordinate when available.

location.building_name (string, optional): Building or community name from the listing page when available.

location.neighborhood (string, optional): Neighborhood label from the listing page when available.

property.property_type (string, optional): Property category or type label.

property.beds (string, optional): Bedroom count as displayed by the source.

property.baths (string, optional): Bathroom count as displayed by the source.

property.sqft (string, optional): Building area as displayed by the source.

property.description (string, optional): Public listing description when available.

property.year_built (integer or string, optional): Year-built value when available.

property.lease_term (string, optional): Rental lease term text from the listing page when enrichment is enabled and available.

property.highlights (array, optional): Listing-page highlight labels when enrichment is enabled and available.

property.details (object, optional): Grouped listing-page property details when enrichment is enabled and available.

property.fees_and_policies (object, optional): Rental fees and policies sections, such as pet policy categories and fee rows, when enrichment is enabled and available.

media.primary_image_url (string, optional): Primary listing image URL.

media.image_count (integer, optional): Number of listing images when available.

contact.agent_name (string, optional): Listing agent name when publicly available.

contact.agency_name (string, optional): Agency or brokerage name when publicly available.

contact.agency_phone (string, optional): Agency or listing phone number when publicly available.

contact.property_manager_label (string, optional): Rental contact label, such as PROPERTY MANAGER, when enrichment is enabled and available.

contact.property_manager_name (string, optional): Rental property manager name when enrichment is enabled and available.

contact.property_manager_phone (string, optional): Rental property manager or listing phone number when enrichment is enabled and available.

contact.sold_agents (array, optional): Last seller and buyer agent details from sold listing pages when enrichment is enabled and available.

contact.affiliated_agents (array, optional): Agents affiliated with a sold home, including role, company, phone, and sales labels when enrichment is enabled and available.

listing_details.mls_number (string, optional): MLS number from the detail page when available.

listing_details.mls_source (string, optional): MLS or source attribution from the detail page when available.

listing_details.apn (string, optional): Assessor parcel number from the detail page when available.

listing_details.date_posted (string, optional): Listing posted date from structured detail metadata when available.

listing_details.date_modified (string, optional): Listing modified date from structured detail metadata when available.

listing_details.availability (string, optional): Structured availability value from the detail page when available.

listing_details.total_views (string, optional): Total views label from the detail page when available.

listing_details.meta_description (string, optional): Detail-page meta description when available.

listing_details.listing_provider (string, optional): Detail-page listing provider attribution when enrichment is enabled and available.

listing_details.sale_details (object, optional): Sold-listing sale summary, such as sold date, sold price per square foot, list-to-sale difference, and time on market, when enrichment is enabled and available.

history.price (array, optional): Listing price history rows when enrichment is enabled and available.

history.tax (array, optional): Tax history rows when enrichment is enabled and available.

history.purchase (array, optional): Purchase history rows when enrichment is enabled and available.

source_context.seed_id (string, optional): Identifier for the configured input scope that produced the record.

source_context.seed_type (string, optional): Input scope type, such as search.

source_context.seed_value (string, optional): Input value that produced the record, such as the requested location.

source_context.page_index (integer, optional): Result page index associated with the record when available.

source_context.fingerprint (string, optional): Stable comparison value for deduplication and repeated collection workflows.

source_context.detail_source_url (string, optional): Listing page URL used for enrichment when available.

source_context.detail_status_code (integer, optional): HTTP status from the enrichment detail request when available.

source_context.enriched (boolean, optional): Indicates that detail-page data was merged into the base record.

source_context.source_keys.location_key (string, optional): Source-provided location key when available.

source_context.source_keys.property_asset_key (string, optional): Source-provided property asset key when available.

Data Quality, Guarantees, And Handling

  • Structured records: results are normalized into predictable JSON objects for downstream use.
  • Best-effort extraction: fields may vary by region, session, availability, listing type, or source-side presentation changes.
  • Optional fields: null-check optional fields in downstream code, especially media, contact, coordinates, descriptions, and source-specific keys.
  • Deduplication: use listing_id as the primary key where available; for stronger matching, combine it with url or compare source_context.fingerprint.
  • Freshness: results reflect the publicly available data at run time.
  • Repeated runs: use the recommended idempotency key when syncing data into warehouses, CRMs, or search indexes.

Tips For Best Results

  • Start with a small limit to validate the output shape before scaling up.
  • Use one location or market segment per run when you need cleaner segmentation.
  • Leave optional filters empty when the goal is broad discovery.
  • Add filters gradually to understand how each field changes coverage.
  • Use deal_type and sort_by together when monitoring specific inventory segments.
  • Enable maximize_coverage for broad markets only after a smaller validation run looks correct.
  • Use listing_id and source_context.fingerprint for deduplication when storing results over time.

How to Run on Apify

  1. Open the actor in Apify Console.
  2. Configure the available input fields for the target location and listing scope.
  3. Set the maximum number of outputs to collect with limit.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and review the first records.
  6. Download results in JSON, CSV, Excel, or other supported formats.

Scheduling & Automation

Scheduling

Automated Data Collection

Schedule runs to keep Homes.com listing datasets fresh for recurring analysis, enrichment, monitoring, and reporting workflows. Use schedules when you need consistent collection intervals rather than manual one-off runs.

  • Navigate to Schedules in Apify Console
  • Create a new schedule: daily, weekly, or custom cron
  • Configure input parameters
  • Enable notifications for run completion
  • Add webhooks for automated processing

Integration Options

  • CRM enrichment: sync public listing, location, price, property, and contact attributes into account or lead records.
  • BI dashboards: monitor pricing, availability, property mix, market coverage, and listing movement over time.
  • Data warehouses: load normalized listing records into historical tables for trend analysis and reporting.
  • Google Sheets or Airtable: review smaller market samples, validate records, and coordinate lightweight operations.
  • Webhooks: trigger ingestion, validation, alerts, or notification workflows after each completed run.
  • Data enrichment pipelines: join Homes.com listing data with internal market, lead, geography, or valuation datasets.

Export Formats And Downstream Use

Apify datasets can be exported from the platform or consumed by downstream systems. Choose the format that matches your operational workflow.

  • JSON: for APIs, applications, and data pipelines.
  • CSV or Excel: for spreadsheet workflows and manual review.
  • API access: for automated ingestion into internal systems.
  • BI and warehouses: for reporting, dashboards, and historical analysis.

Performance

Estimated run times:

  • Small runs (< 1,000 outputs): ~3-5 minutes
  • Medium runs (1,000-5,000 outputs): ~5-15 minutes
  • Large runs (5,000+ outputs): ~15-30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record. Highly filtered runs can finish faster, while broad discovery, maximize_coverage, or enrich_data runs may take longer.

Limitations

  • Availability depends on what Homes.com publicly exposes at run time.
  • Some optional fields may be missing on sparse records, listing previews, regional variants, or records with limited public information.
  • Very broad searches may take longer or require higher limit values.
  • Target-side changes can affect field availability, naming, or display formatting.
  • Regional, account, or availability differences may change visible results.
  • Price, date, status, and property filters depend on the selected deal_type and what matching public inventory contains.

Troubleshooting

  • No results returned: check filter combinations, location spelling, and whether Homes.com has matching public records for the selected scope.
  • Fewer results than expected: broaden filters, raise limit, or verify that the target market contains enough matching records.
  • Some fields are empty: optional fields depend on what each listing publicly provides.
  • Run takes longer than expected: reduce scope, lower limit for validation, turn off enrich_data when lightweight records are enough, or split broad collection into smaller locations or segments.
  • Output changed: compare the current output with the field reference and include a small sample when reporting an issue.

FAQ

What data does this actor collect?

It collects public Homes.com listing records, including listing identity, URL, title, status, deal type, pricing, location, property attributes, media information, contact fields when available, and source context. When enrich_data is enabled, it may also add listing-page details such as highlights, MLS information, property detail groups, and history tables.

Can I filter by location, category, date, price, or other criteria?

Yes. The actor requires location and supports filters such as deal_type, price range, property type, bedrooms, bathrooms, building size, lot size, price per square foot, keyword, MLS number, listing status, listing type, publication date, price reduction period, parking, tours, school ratings, views, year built, stories, sort order, and output limit.

Why did I receive fewer results than my limit?

The limit is a maximum, not a guarantee. A run may return fewer records when the selected market has fewer matching public listings, when filters are narrow, or when some records are not available at run time.

Can I schedule recurring runs?

Yes. Use Apify schedules to run the actor daily, weekly, or on a custom cron schedule for monitoring, reporting, and enrichment workflows.

How do I avoid duplicates across runs?

Use listing_id as the primary idempotency key where available. For stricter matching, combine listing_id with url or compare source_context.fingerprint.

Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets support JSON, CSV, Excel, and other export formats from the dataset interface.

Does this actor collect private data?

No. The actor is intended to collect publicly available listing information from Homes.com. Users are responsible for using the data in accordance with applicable laws, regulations, and terms.

What should I include when reporting an issue?

Include the input used, with sensitive values redacted if needed, the run ID, expected versus actual behavior, and a small output sample when it helps explain the issue.

Compliance & Ethics

Responsible Data Collection

This actor collects publicly available real estate listing information from Homes.com for legitimate business purposes, including:

  • Real estate research and market analysis
  • Listing monitoring for pricing, availability, and inventory changes
  • Data enrichment for analytics, reporting, and operational workflows

This section is informational and not legal advice. Users are responsible for determining whether their use of the collected data complies with applicable laws, regulations, contractual obligations, and platform terms.

Best Practices

  • Use collected data in accordance with applicable laws, regulations, and the target site's terms.
  • Respect individual privacy and personal information.
  • Use data responsibly and avoid disruptive or excessive collection.
  • Do not use this actor for spamming, harassment, or other harmful purposes.
  • Follow relevant data protection requirements where applicable, including GDPR and CCPA.

Support

For help, use the actor page or the Issues section associated with the actor. Include the input used, with sensitive values redacted if needed, the run ID, expected versus actual behavior, and a small output sample when relevant.