# Indian Property Listings Finder by City & BHK (`dataspryva/indian-property-listings-finder-by-city-and-bhk`) Actor

Search sale and rental property listings across 31 Indian cities by BHK, property type, locality and price band, with area, poster identity and listing links for buyers, agents and researchers.

- **URL**: https://apify.com/dataspryva/indian-property-listings-finder-by-city-and-bhk.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## MagicBricks Listings Finder: Sale, Rent & Detail Pages

Collect **MagicBricks** property listings across 108 Indian cities. Search for sale, rent, or both with BHK, budget, area, furnishing, possession and locality filters; paste search-result links to keep the site's own filters; or paste property-detail links for a single enriched record. Every listing keeps a clean, human-readable set of price, size, project, seller, RERA, GPS, amenity and image fields.

### What this actor does

- **Five modes:** `searchForSale`, `searchForRent`, `searchProperties`, `bySearchUrl`, `byPropertyUrl`
- **108 cities** with the site's own canonical names, plus locality filters and 13 residential and commercial property types
- **Server-side filters:** BHK, budget, area, furnishing, possession, tenant preference, last-24-hours posting age and six sort orders
- **Optional detail pages** add project, developer, RERA registrations, full address, GPS, complete amenities, estimated deposit, maintenance, booking amount and brokerage
- **Clean output:** numeric INR prices, carpet and covered areas, ISO dates, absolute links, and empty fields omitted instead of returned as null

### Output per property

- `propertyId` — MagicBricks listing id
- `title` — listing headline
- `propertyType` — Apartment, Builder Floor, Independent House, Villa, Plot, Penthouse, Studio Apartment, Farm House, Serviced Apartment, Commercial Office, Office in IT Park/SEZ, Commercial Shop or Commercial Showroom
- `transactionType` — Sale or Rent
- `saleType` — New Property or Resale (sale listings)
- `price` — price as shown on MagicBricks (e.g. `1.10 Cr`)
- `priceInr` — numeric asking price in Indian Rupees
- `priceCurrency` — `INR`
- `pricePerSqft` — rate per square foot (the site's own value, or derived from price and carpet area when it is missing)
- `priceBreakdown` — all-inclusive price, stamp duty and brokerage (detail pages)
- `bookingAmount`, `maintenanceCharges`, `maintenancePeriod`, `securityDeposit` (MagicBricks estimate), `brokerage`
- `area` — covered or carpet area as a display string
- `carpetArea`, `carpetAreaUnit`, `coveredArea`, `coveredAreaUnit`
- `bedrooms`, `bathrooms`, `balconies`
- `floorNumber`, `totalFloors`, `floorDisplay`
- `furnishing`, `facing`, `ownershipType`, `ageOfProperty`, `parking`
- `possessionStatus`, `availableFrom`
- `postedAt`, `postedLabel`, `expiresAt`
- `city`, `locality`, `address`, `landmark`
- `latitude`, `longitude` — real coordinates, omitted when the source only carries a zero placeholder
- `projectName`, `projectId`, `projectUrl`, `developerName`
- `reraIds[]`, `reraUrl`, `agentReraId`, `approvedBy`
- `postedBy` — publicly displayed owner, agent or builder name
- `listerName`, `listerType`, `companyName`
- `agentId`, `agentUrl`, `agentRating`, `agentExperienceSince`, `agentBuyersServed`
- `description`, `autoDescription`
- `amenities[]`, `luxuryAmenities[]`, `amenitiesFacing`
- `images[]`, `imageUrl`, `imageCount`
- `searchUrl` — the search that produced the record
- `detailFetched` — present when detail-page data was merged
- `source` — `magicbricks`
- `recordType` — `property`
- `scrapedAt` — ISO 8601 timestamp

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `searchForSale` | `searchForSale`, `searchForRent`, `searchProperties`, `bySearchUrl` or `byPropertyUrl` |
| `startUrls` | array | – | MagicBricks search or property links (URL modes) |
| `city` | string | `Mumbai` | One of 108 Indian cities (search modes) |
| `localities` | array | – | Locality names inside the city; one search per locality (search modes) |
| `propertyType` | string | `Apartment` | 13 residential and commercial types (search modes) |
| `bedrooms` | string | `Any` | `Any`, `1`, `2`, `3`, `4` or `5+` (search modes) |
| `priceMin` | integer | – | Minimum price in INR (search modes) |
| `priceMax` | integer | – | Maximum price in INR (search modes) |
| `areaMin` | integer | – | Minimum area in sq.ft (search modes) |
| `areaMax` | integer | – | Maximum area in sq.ft (search modes) |
| `furnishing` | string | `Any` | `Any`, `Furnished`, `Semi-Furnished` or `Unfurnished` (search modes) |
| `possessionStatus` | string | `Any` | `Any`, `Ready to Move` or `Under Construction` (sale searches) |
| `postedSince` | string | `Any` | `Any` or `1` (last 24 hours; search modes). MagicBricks exposes only this server-side window. |
| `tenantType` | string | `Any` | `Any`, `Bachelors` or `Family` (rent searches). MagicBricks exposes these two server-side. |
| `sortBy` | string | `Relevance` | Relevance, price, recency or rate per sq.ft (search modes) |
| `maxItems` | integer | `50` | Hard cap on returned listings (1–10,000) |
| `includeDetails` | boolean | `false` | Open each listing's detail page for project, RERA, address, GPS, amenities and cost data |

#### Example: 2 BHK flats for sale in Mumbai

```json
{
  "mode": "searchForSale",
  "city": "Mumbai",
  "propertyType": "Apartment",
  "bedrooms": "2",
  "priceMin": 10000000,
  "priceMax": 30000000,
  "maxItems": 100
}
```

#### Example: rentals in two Bangalore localities

```json
{
  "mode": "searchForRent",
  "city": "Bangalore",
  "localities": ["Whitefield", "Hebbal"],
  "bedrooms": "2",
  "furnishing": "Furnished",
  "tenantType": "Bachelors",
  "maxItems": 60
}
```

#### Example: keep the filters from a MagicBricks search link

```json
{
  "mode": "bySearchUrl",
  "startUrls": [
    {"url": "https://www.magicbricks.com/property-for-sale/residential-real-estate?cityName=Pune&proptype=Villa"}
  ],
  "maxItems": 50
}
```

#### Example: enrich a handful of property links

```json
{
  "mode": "byPropertyUrl",
  "startUrls": [
    {"url": "https://www.magicbricks.com/propertyDetails/3-BHK-1600-Sq-ft-Multistorey-Apartment-FOR-Sale-Juhu-in-Mumbai&id=4d423836393237353637"}
  ],
  "maxItems": 10
}
```

### Use cases

- **Home buyers** — shortlist flats by BHK, budget, locality and ready-to-move status
- **Tenants** — compare furnished rentals by locality, deposit and maintenance
- **Real-estate agencies** — monitor new listings and seller types in target micro-markets
- **Market research** — compare asking prices and rates per sq.ft across cities and property types
- **PropTech products** — feed structured listing, project and RERA data into search and valuation tools

### FAQ

**Is this affiliated with MagicBricks?**
No. This is an independent, third-party actor that reads publicly visible MagicBricks pages. It is not operated by or endorsed by MagicBricks.

**Do I need a MagicBricks account or cookies?**
No. Every supported mode works without a login, cookies or API keys.

**How many listings can one run return?**
`maxItems` is a hard cap up to 10,000. MagicBricks serves 30 listings per page and exposes a finite number of results for each filter set. Once that ceiling is reached, narrow the city, locality, property type or budget to reach more listings. The run summary says when the ceiling was hit.

**Why do some records have more fields than others?**
Fields are filled only when the source publishes them. A listing without a project, RERA number or agent rating simply omits those fields. Empty strings, nulls and empty lists are never emitted.

**What does `includeDetails` add?**
It opens each listing's detail page for project name, developer, RERA registrations, full address, GPS, complete amenities, description, image gallery, estimated deposit, maintenance, booking amount, brokerage and price breakup. It is slower and uses more resources than a plain search, so it is off by default.

**Which URLs can I paste?**
A search-results URL that contains `property-for-sale` or `property-for-rent` and `cityName=`, or a `/propertyDetails/...` link. City landing pages such as `property-for-sale-rent-in-Mumbai` do not contain listings; the actor reports that instead of returning zero silently.

**Can I get phone numbers or email addresses?**
No. MagicBricks reveals contact details only after an OTP or login flow, so this actor does not return phones, emails or masked numbers.

**Why does the listing count change between pages?**
MagicBricks updates results continuously. The actor removes duplicate listings by id and stops when a page repeats, so a run can finish slightly below the site's displayed result count.

**Do I need to configure a proxy?**
No. The actor chooses a working connection to MagicBricks automatically. Fill in the input and run it.

**Can I search several localities at once?**
Yes. Add each locality to `localities`; the actor runs a separate search per locality and removes duplicates. Multiple localities are not combined into one AND filter.

# Actor input Schema

## `mode` (type: `string`):

What to collect. Search by city and filters, paste MagicBricks search-result URLs, or paste property-detail URLs.

## `startUrls` (type: `array`):

MagicBricks search-result or property-detail links (mode=bySearchUrl or byPropertyUrl).

## `city` (type: `string`):

Indian city to search (mode=searchForSale, searchForRent, searchProperties).

## `localities` (type: `array`):

Optional locality or neighbourhood names inside the city (mode=searchForSale, searchForRent, searchProperties). One search is run per locality.

## `propertyType` (type: `string`):

Type of property to search (mode=searchForSale, searchForRent, searchProperties).

## `bedrooms` (type: `string`):

Bedroom count. 5+ is sent as 5, the site's maximum (mode=searchForSale, searchForRent, searchProperties).

## `priceMin` (type: `integer`):

Lowest asking price in Indian Rupees (mode=searchForSale, searchForRent, searchProperties).

## `priceMax` (type: `integer`):

Highest asking price in Indian Rupees (mode=searchForSale, searchForRent, searchProperties).

## `areaMin` (type: `integer`):

Smallest covered or carpet area in square feet (mode=searchForSale, searchForRent, searchProperties).

## `areaMax` (type: `integer`):

Largest covered or carpet area in square feet (mode=searchForSale, searchForRent, searchProperties).

## `furnishing` (type: `string`):

Furnishing state filter (mode=searchForSale, searchForRent, searchProperties).

## `possessionStatus` (type: `string`):

Ready-to-move or under-construction filter (mode=searchForSale, searchProperties).

## `postedSince` (type: `string`):

Only listings posted in the last 24 hours (mode=searchForSale, searchForRent, searchProperties). MagicBricks does not expose wider server-side posting windows.

## `tenantType` (type: `string`):

Who the landlord accepts (mode=searchForRent and rent searches in searchProperties). MagicBricks exposes Bachelors and Family server-side.

## `sortBy` (type: `string`):

Order of search results (mode=searchForSale, searchForRent, searchProperties).

## `maxItems` (type: `integer`):

Hard cap on the number of property records returned.

## `includeDetails` (type: `boolean`):

Also open each listing's detail page for project, developer, RERA, full address, GPS, amenities, deposit and maintenance data (search modes).

## Actor input object example

```json
{
  "mode": "searchForSale",
  "startUrls": [],
  "city": "Mumbai",
  "propertyType": "Apartment",
  "bedrooms": "Any",
  "furnishing": "Any",
  "possessionStatus": "Any",
  "postedSince": "Any",
  "tenantType": "Any",
  "sortBy": "Relevance",
  "maxItems": 3,
  "includeDetails": false
}
```

# Actor output Schema

## `listings` (type: `string`):

Dataset containing all scraped MagicBricks property listings.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "searchForSale",
    "startUrls": [],
    "city": "Mumbai",
    "propertyType": "Apartment",
    "bedrooms": "Any",
    "furnishing": "Any",
    "possessionStatus": "Any",
    "postedSince": "Any",
    "tenantType": "Any",
    "sortBy": "Relevance",
    "maxItems": 3,
    "includeDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/indian-property-listings-finder-by-city-and-bhk").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "searchForSale",
    "startUrls": [],
    "city": "Mumbai",
    "propertyType": "Apartment",
    "bedrooms": "Any",
    "furnishing": "Any",
    "possessionStatus": "Any",
    "postedSince": "Any",
    "tenantType": "Any",
    "sortBy": "Relevance",
    "maxItems": 3,
    "includeDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/indian-property-listings-finder-by-city-and-bhk").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "searchForSale",
  "startUrls": [],
  "city": "Mumbai",
  "propertyType": "Apartment",
  "bedrooms": "Any",
  "furnishing": "Any",
  "possessionStatus": "Any",
  "postedSince": "Any",
  "tenantType": "Any",
  "sortBy": "Relevance",
  "maxItems": 3,
  "includeDetails": false
}' |
apify call dataspryva/indian-property-listings-finder-by-city-and-bhk --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/indian-property-listings-finder-by-city-and-bhk"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xX3BqO6n2yMRjYlzB/builds/9lCmU3P2oSAmJd2ok/openapi.json
