Housing.com Scraper at a glance
Housing.com Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes listingid, title, address, type and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.00 per 1,000 results on the Apify Free plan and from $0.70 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
- Real Estate, Developer Tools, Automation
- Pricing
- $1.00 per 1,000 results (Free plan), from $0.70 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 25 options
From $0.70/1K. Scrape residential property listings from Housing.com across 750+ cities. Extract structured data for properties available to buy or rent, including prices, locations, property details, and more.
What Housing.com Scraper can do
- Two ways to find listings. Build a search from city, locality and service, or paste Housing.com search URLs directly.
- 750+ Indian cities, with common aliases resolved automatically (Bangalore/Bengaluru, Bombay/Mumbai, Calcutta/Kolkata, Madras/Chennai, Gurgaon/Gurugram).
- Rich property data. Price, individual BHK configurations with their own pricing and area, coordinates, amenities, images, seller and agency names, EMI estimates and tags such as RERA verification.
- Buy and rent, new projects and resale, all through the same scraper.
- Post-search filters for price range, BHK count and property type, so the dataset only contains what matches.
- Built for schedules. Incremental mode returns only new and changed listings on recurring runs, and a run that stalls before completing fails loudly instead of returning an empty dataset.
Choose what to collect
These inputs let you configure Housing.com Scraper - Buy & Rent Property Listings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Scraping mode: 'search' builds query from city/locality, 'url' extracts locality from provided housing.com URLs |
urlsarray | Housing.com URLs (url mode only): city pages /in/buy/ or /in/rent/, locality pages /in/buy//, (buy or rent). Search-result links such as /search?f=... are not supported. Single project or listing pages are not supported and are skipped with a warning. |
servicestring | Buy or Rent |
citystring | City name (e.g. 'Mumbai', 'Delhi', 'Bangalore', 'Pune'). Use the city listing to find exact names. |
localitystring | Locality/area within the city (e.g. 'andheri_west', 'bandra_west'). Leave empty for entire city. |
citiesarray | Extra cities to scrape in the same run, in addition to City (e.g. ["Pune", "Bangalore"]). Same Service applies to all. Max Properties is a total across all cities. Ignored in URL mode. |
min_priceinteger | Minimum price in INR. Post-filter, applied client-side after fetching results. For buy: e.g. 5000000 = 50 Lakhs. For rent: e.g. 30000 = ₹30K/month. |
Show 18 more inputs
| Input | What it controls |
|---|---|
max_priceinteger | Maximum price in INR. Post-filter, applied client-side. |
min_bhknumber | Minimum BHK (e.g. 2 for 2+ BHK). Post-filter, applied client-side. |
max_bhknumber | Maximum BHK (e.g. 3 for up to 3 BHK). Post-filter, applied client-side. |
property_typestring | Filter by property type. Post-filter, applied client-side. |
days_oldinteger | Only keep listings posted within the last N days. Post-filter on the listing's posted date; listings with no posted date are kept. In incremental mode a tracked listing that is still live but has aged past the window is retired quietly, with no EXPIRED row. |
max_propertiesinteger | Maximum number of properties to scrape (0 = the 100,000 maximum) |
max_pagesinteger | Maximum number of result pages (30 listings per page) |
dataset_namestring | Custom dataset name (leave empty for default) |
clear_datasetboolean | Clear the dataset before scraping |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large pull of properties without returning or charging for properties already collected there. Use this after an interrupted run, or when continuing a pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring of the same city/locality/URL search. The first run returns all matching properties as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED properties -- a property is UPDATED only when its own listed details change (price, title, area, amenities, images, etc.); the scraped_at timestamp is ignored for this comparison since it always differs run to run by construction (every returned property still carries its current scraped_at value). Turn on "Emit unchanged" or "Emit expired" only when you also want those properties returned (and billed). State is kept separately for each city/locality/service or URL set and filter combination; 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. |
stateKeystring | Optional. 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 city/locality/service (or URLs) and filters used -- different search setups then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return properties 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. |
emitExpiredboolean | Off by default. Turn on to also return properties 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 to its natural end -- not when Max Properties or Max Pages capped it, or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Incremental mode only. Field names (for example tags or highlights) that must NOT make a property count as UPDATED when only they change. The fields are still returned in every row; they are just left out of the comparison and out of changedFields. scraped_at is always ignored. Fields added in a later version are compared only once your saved baseline already contains them (no one-time wave of UPDATED rows). Leave empty to compare every other field. |
mcpConnectorsarray | Optionally 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. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap 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.
listingIdlistingIdtitleTitleaddressAddresspropertyTypeTypeprice_displayPricearea_valueAreaarea_unitUnitsubtitleConfigurlurllatitudeLatlongitudeLngfeaturesfeaturesShow 26 more fields
bhk_configsbhk_configsamenitiesamenitiessellersSelleremiEMItagsTagspostedAtpostedAtupdatedAtupdatedAtpossessionDatepossessionDateisVerifiedisVerifiedverificationStatusverificationStatusprojectNameprojectNamecitycitytransactionTypetransactionTypefurnishingfurnishingfacingfacingfloorNumberfloorNumbertotalFloorstotalFloorsbedroomsbedroomsconstructionStatusconstructionStatusageOfPropertyageOfPropertypricePerAreapricePerAreaisReraVerifiedisReraVerifiedchangeTypeChangechangedFieldsChanged fieldsfirstSeenAtFirst seenlastSeenAtLast seenExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"listingId": "P123ab4567cd",
"title": "Sunrise Heights",
"subtitle": "2, 3 BHK Flats",
"address": "Andheri West, Mumbai",
"propertyType": "resale",
"price_display": "Rs 1.85 Cr",
"price_values": [
16500000,
21000000
],
"currency": "INR",
"area_value": 950,
"area_unit": "sq.ft",
"latitude": 19.1197,
"longitude": 72.8468,
"features": [
"2, 3 BHK",
"Possession: Dec 2026",
"Avg. Price: Rs 19,500/sq.ft"
],
"bhk_configs": [
{
"id": "cfg1",
"price_display": "Rs 1.65 Cr",
"area": "750 sq.ft",
"label": "2 BHK"
},
{
"id": "cfg2",
"price_display": "Rs 2.1 Cr",
"area": "950 sq.ft",
"label": "3 BHK"
}
],
"amenities": [
"Swimming Pool",
"Gym",
"Power Backup",
"Covered Parking"
],
"sellers": [
"Anita Sharma"
],
"seller_firms": [
"Sharma Realty"
],
"highlights": [
"Covered Parking",
"24x7 Security"
],
"emi": "Rs 1,28,450/mo",
"tags": [
"rera_verified"
],
"images": [
"https://img.housingcdn.com/sample1.jpg",
"https://img.housingcdn.com/sample2.jpg"
],
"image_count": 12,
"url": "https://housing.com/in/buy/resale/mumbai/andheri-west/sunrise-heights-p123ab4567cd",
"scraped_at": "2026-09-28T05:12:33.123456"
}Ways to use this data
- Real estate investors and analysts: track prices per locality over time to spot undervalued areas or fast-moving markets.
- Property portals and aggregators: enrich or cross-list Housing.com inventory inside your own site or app.
- Agents and brokers: monitor competing listings, new projects and price changes in your service area.
- Home buyers and renters: build a structured shortlist across multiple localities and cities instead of browsing page by page.
- Market researchers: build historical datasets of listings, EMI estimates and amenities for analysis.
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 Housing.com Scraper return?
The documented output for Housing.com Scraper includes listingid, title, address, type, price, area, unit and config. Availability of each field depends on the source page and the selected mode.
How much does Housing.com Scraper cost?
It costs $1.00 per 1,000 results on the Apify Free plan and from $0.70 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. The first scheduled run returns every matching property as NEW; later runs return only NEW, UPDATED and REAPPEARED properties, and unchanged ones are not billed unless you turn on emitUnchanged.
Why did I get fewer properties than Max Properties?
min_price, max_price, min_bhk, max_bhk and property_type are post-filters: the actor fetches full pages of results from Housing.com first, then keeps only the properties that match. If your filters are narrow, raise Max Pages so the actor has more listings to filter from; a low page cap can run out of pages before reaching your target count.
Why did my run fail instead of returning an empty dataset?
If a search stops before reaching Housing.com's own end of results, and nothing was collected, the run fails with a clear message instead of finishing as an empty success. When the requests themselves keep failing (five in a row) the run stops at once instead of retrying every remaining search, and the message says it is a connection problem: run it again in a few minutes. When the city or locality is not recognised, the message names the value you entered and asks you to check its spelling (the way Housing.com writes it, for example andheri_west) instead. A search that genuinely has no matching properties, or whose results were all excluded by your filters, still finishes successfully with an empty or partial dataset.
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.
