Housing.com $0.7💰
Pricing
from $0.70 / 1,000 results
Housing.com $0.7💰
From $0.7/1K. Scrape residential property listings from housing.com. Supports buy and rent across 750+ cities.
Pricing
from $0.70 / 1,000 results
Rating
5.0
(1)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
33
Total users
10
Monthly active users
6 days ago
Last modified
Categories
Share
Housing.com India Property Scraper
Scrape residential property listings from housing.com, India's leading property platform. Supports buy and rent across 750+ cities.
Features
- 750+ Indian cities - Mumbai, Delhi, Bangalore, Pune, Chennai, Kolkata, and more
- Buy & Rent - new projects, resale, and rental listings
- Rich data - BHK configurations with individual pricing, coordinates, amenities, images, seller info, RERA tags, EMI
- Post-filters - filter by BHK, price range, and property type (client-side)
- City aliases - "Delhi", "Bangalore", "Bombay", "Calcutta", "Madras" all resolve correctly
- Fast & cheap - ~700-1000 listings/min
Quick Start
Buy properties in Mumbai
{"mode": "search","service": "buy","city": "Mumbai","max_properties": 30}
3 BHK apartments in Andheri West under 5 Cr
{"mode": "search","service": "buy","city": "Mumbai","locality": "andheri_west","min_bhk": 3,"max_bhk": 3,"max_price": 50000000,"max_properties": 50}
Rentals in Bangalore Koramangala
{"mode": "search","service": "rent","city": "Bangalore","locality": "koramangala","max_properties": 30}
2-3 BHK in Delhi Dwarka
{"mode": "search","service": "buy","city": "Delhi","locality": "dwarka","min_bhk": 2,"max_bhk": 3,"max_properties": 100,"max_pages": 5}
Daily monitoring of a search (incremental mode)
{"mode": "search","service": "buy","city": "Mumbai","locality": "andheri_west","max_properties": 200,"incrementalMode": true,"emitExpired": true}
Schedule this to run daily. The first run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED/EXPIRED properties.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (build query from city/locality) |
service | string | buy | buy or rent |
city | string | Mumbai | City name. Aliases supported: Delhi, Bangalore, Bombay, Calcutta, Madras, Gurugram |
locality | string | - | Locality within city (e.g. andheri_west, bandra_west, koramangala). Leave empty for entire city |
min_price | integer | - | Minimum price in INR (post-filter). Buy: e.g. 5000000 = 50L. Rent: e.g. 30000 |
max_price | integer | - | Maximum price in INR (post-filter) |
min_bhk | number | - | Minimum BHK, e.g. 2 (post-filter) |
max_bhk | number | - | Maximum BHK, e.g. 3 (post-filter) |
property_type | string | - | project, resale, or rent (post-filter) |
max_properties | integer | 30 | Max properties to scrape (0=unlimited). Counts properties that passed the filters above (same properties push_data would emit with Incremental mode off) — in Incremental mode a subset of that count may still be suppressed as UNCHANGED rather than actually pushed/billed. |
max_pages | integer | 5 | Max pages (30 listings/page) |
resumeFromRunId | string | - | Paste a previous run ID or dataset ID to continue a large pull without returning or charging for properties already collected there. See Resume & recurring updates below. |
incrementalMode | boolean | false | Turn on for daily/recurring monitoring of the same search — see Resume & recurring updates below. |
stateKey | string | - | Optional. Name a monitoring campaign, or share state across differently-configured runs. Incremental mode only. |
emitUnchanged | boolean | false | Also return (and bill) properties unchanged since the last run. Incremental mode only. |
emitExpired | boolean | false | Also return (and bill) properties no longer found, once a run fully scanned the tracked search. Incremental mode only. |
proxy | object | - | Optional proxy configuration |
Resume & recurring updates
Two distinct features:
- Resume (
resumeFromRunId) continues one interrupted pull. Paste a previous run ID or dataset ID and this run skips everylistingIdalready collected there — no re-scraping, no re-billing. - Incremental mode (
incrementalMode) is for scheduling this actor daily/weekly against the same city/locality/service (or URL set) and filters, and getting only what changed. The actor remembers its own state in a key-value store — no run ID to paste.- The first run returns every matching property as
NEW. - Later runs return
NEW,UPDATED, andREAPPEAREDproperties by default.UNCHANGEDproperties are suppressed (not returned, not billed) unlessemitUnchangedis on. EXPIREDproperties (tracked previously, no longer found) are only ever produced whenemitExpiredis on and the run fully scanned the tracked search to its natural end — not whenmax_properties/max_pagescapped it, and not whenresumeFromRunIdwas used, since a partial scan cannot tell "gone" from "not reached yet".- State is tracked per city/locality/service (or URL set) + every post-filter (
min_price,max_price,min_bhk,max_bhk,property_type) —max_properties/max_pagesare caps, not part of the tracked scope, so raising them never starts a new monitoring campaign. SetstateKeyto name a campaign explicitly or to deliberately share state across differently-configured runs. - Each returned property gets
changeType,changedFields,firstSeenAt,lastSeenAt. These four fields are absent entirely whenincrementalModeis off — the default output shape is unchanged. UPDATEDmeans the property's own listed details changed (price, title, area, amenities, images, ...). It ignoresscraped_at, which is just a timestamp of when this actor happened to fetch the page — that field always differs run to run and is excluded from comparison for that reason alone, not because housing.com's own data is unreliable.scraped_atstill appears with its live, current value on every returned row.
- The first run returns every matching property as
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. 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. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items 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.
Output Fields
| Field | Type | Description |
|---|---|---|
listingId | string | Unique listing ID |
title | string | Property or project name |
subtitle | string | BHK summary (e.g. "2, 3 BHK Flats") |
address | string | Locality and city |
propertyType | string | project, resale, or rent |
price_display | string | Formatted price (e.g. "₹9.8 Cr") |
price_values | array | Raw price in INR [min, max] |
currency | string | Always "INR" |
area_value | number | Built-up area |
area_unit | string | Area unit (sq.ft) |
latitude | number | Property latitude |
longitude | number | Property longitude |
features | array | Configurations, possession date, avg price |
bhk_configs | array | Individual BHK options with pricing |
amenities | array | Society amenities |
sellers | array | Seller/agent names |
seller_firms | array | Agency/firm names |
highlights | array | Property highlights (parking, gym, etc.) |
emi | string | Estimated monthly EMI |
tags | array | Tags (e.g. rera_verified) |
images | array | Image URLs (up to 15) |
image_count | integer | Total images available |
url | string | Full URL on housing.com |
changeType | string | Incremental mode only: NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED vs. the previous run for this state key. Absent when Incremental mode is off. |
changedFields | array | Incremental mode only: field names that changed since the previous run. Never includes scraped_at (see Resume & recurring updates above). |
firstSeenAt | string | Incremental mode only: ISO timestamp this property was first seen under this state key. |
lastSeenAt | string | Incremental mode only: ISO timestamp this property was last seen present under this state key. |