# Magicbricks Property Listings & Price Drop Monitor (`neverempty/magicbricks-listings`) Actor

Magicbricks.com homes for sale or rent in any Indian city as clean JSON: price in INR, BHK, carpet area, price per sq ft, locality, project, RERA id, amenities and photos. Monitoring mode returns only listings that newly appear in your search, plus price drops; its first run is free. Unofficial.

- **URL**: https://apify.com/neverempty/magicbricks-listings.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listing returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 Property Listings & Price Drop Monitor

Get Magicbricks.com properties for sale or rent in any Indian city as clean, ready-to-use rows: price in INR as a number, BHK, carpet and super built-up area in sq ft, price per sq ft, locality, project, developer, project RERA ids, furnishing, possession status, amenities and photos. Search a city, up to 10 localities, buy or rent, a price range and BHK, the same way you search on the site.

Turn on **monitoring mode** and schedule the Actor: each run returns only the listings that newly appear in these search results since the last run (including listings an advertiser posted again), and with "new listings and price drops" it also returns remembered listings whose price went down, with the earlier price and the drop in rupees and percent. The first monitoring run only remembers what is listed now and is free.

### What you can do with it

- **Get new listings in Mumbai, Bangalore, Pune, Hyderabad, Delhi NCR and more** every hour or every morning, straight into a sheet, CRM or alert.
- **Catch price drops** on flats you already know about: `previousPriceInr`, `priceDropInr` and `priceDropPercent` on every drop.
- **Compare prices per sq ft** by locality, BHK, project and possession status with numbers you can sort and chart.
- **Follow new projects** with their developer and RERA registration ids, or only resale homes, or only owner listings.

### What you get for each listing

| Field | Example |
|---|---|
| `listingId`, `url` | `87011551`, link to the listing on magicbricks.com |
| `title` | `2BHK Multistorey Apartment for Resale in Runwal Bliss at Kanjurmarg East` |
| `searchMode`, `transactionType`, `propertyType` | `buy`, `Resale`, `Apartment` |
| `bhk`, `bathrooms`, `balconies` | `2`, `2`, `2` |
| `priceInr`, `priceText`, `priceType` | `16000000`, `1.60 Cr`, `sale` (rent: the monthly rent with `monthly-rent`) |
| `pricePerSqftInr` | `20000` |
| `carpetAreaSqft`, `coveredAreaSqft`, `plotAreaSqft` | `600`, `800`, `null` (sq yards, sq m, acres and hectares are converted to sq ft) |
| `furnishing`, `availability`, `availableFrom` | `Semi-Furnished`, `Ready to Move`, date for under-construction homes |
| `floor`, `totalFloors`, `facing`, `parking`, `ownership` | `40`, `50`, `East`, `1 Covered`, `Freehold` |
| `maintenanceInr`, `maintenancePeriod`, `bookingAmountInr` | `5500`, `Monthly`, `200000` |
| `tenantPreference` | rent: `Bachelors`, `Family` or `Bachelors/Family` |
| `locality`, `city`, `landmark`, `latitude`, `longitude` | `Kanjurmarg East`, `Mumbai`, landmark text, `19.13143`, `72.93419` |
| `projectName`, `projectUrl`, `developer`, `projectReraIds` | `Runwal Bliss`, project link, `Runwal Enterprises`, `["P51800001296", ...]` |
| `postedBy`, `agencyName` | `Agent`, the broker's business name (`Owner` and `Builder` too) |
| `amenities`, `description`, `imageCount`, `mainImageUrl`, `imageUrls` | lists and photo URLs |
| `postedAt`, `updatedLabel` | `2026-10-20T13:35:48.000Z`, `Today` |
| `changeType`, `previousPriceInr`, `priceDropInr`, `priceDropPercent` | monitoring: `new` or `price-drop` with the earlier price |
| `searchCity`, `searchLocalities`, `source`, `scrapedAt` | the city and localities Magicbricks resolved your search to, time of the run |

### How to use it

**A city and localities**

```json
{
  "searchMode": "buy",
  "city": "Mumbai",
  "localities": ["Andheri West", "Powai"],
  "bhk": ["2", "3"],
  "minPrice": 10000000,
  "maxPrice": 30000000,
  "maxListings": 100
}
```

Prices are in rupees: 1 crore = `10000000`, 1 lakh = `100000`. For rent, the price range is the monthly rent.

**Rentals for bachelors in Bangalore**

```json
{ "searchMode": "rent", "city": "Bangalore", "localities": ["Koramangala", "HSR Layout"], "tenantType": "bachelors", "maxPrice": 40000 }
```

**Hourly feed of new listings and price drops**

```json
{
  "city": "Pune",
  "localities": ["Baner"],
  "monitoringMode": true,
  "alertOn": "new-and-price-drops"
}
```

Schedule it in Apify (for example every hour). The first run remembers what is listed now for free; each later run returns only listings that newly appear in the results since the run before (a listing it has returned once is not returned as new again), plus remembered listings that are now cheaper. If more new listings appear than your maximum, a free row says so and the rest come in the next run.

#### Filters

- Sent to Magicbricks, so fewer pages are read: BHK, property type, minimum and maximum price.
- Checked on every row: the same four again, plus area in sq ft, furnishing, possession status (ready to move or under construction), posted by (owner, agent, builder), new or resale, tenants accepted, keywords (any / all), keywords to exclude and posted within N days.
- A listing whose value is not stated (for example no furnishing given) is kept rather than dropped.

#### Order

Newest first by default, which is what a monitoring feed needs. You can also choose Magicbricks relevance, lowest or highest price, or lowest price per sq ft.

### Input

| Field | What it does |
|---|---|
| `searchMode` | `buy` or `rent` |
| `city` | A city name (Mumbai, Bangalore or Bengaluru, New Delhi or Delhi, Gurgaon or Gurugram, Noida, ...) or a Magicbricks city code |
| `localities` | Up to 10 localities in that city; empty = the whole city |
| `bhk`, `propertyTypes` | BHK 1 to 5 (5 = 5 and more); apartment, builder floor, penthouse, studio, house, villa, plot |
| `minPrice`, `maxPrice` | Price in INR (monthly rent for `rent`) |
| `minAreaSqft`, `maxAreaSqft` | Area in sq ft |
| `furnishing`, `availability`, `postedBy`, `transactionType`, `tenantType` | Row filters described above |
| `keywords`, `keywordMatch`, `excludeKeywords`, `postedWithinDays` | Text and date filters |
| `sortBy` | `newest`, `relevance`, `price-low`, `price-high`, `price-per-sqft-low` |
| `maxListings` / `maxPages` | Stop after this many listings returned / results pages read (30 listings per page) |
| `monitoringMode`, `alertOn`, `resetMonitoringState` | Return only what is new (and, with `new-and-price-drops`, what got cheaper); start the memory again |

### Pricing

You pay per listing returned, plus one small run fee charged once in each run that actually read listings from Magicbricks (including a monitoring run that found nothing new). Normal searches and new-listing monitoring pay the run start fee. Price-drop monitoring (`alertOn`: new and price drops) pays a slightly higher price-watch run fee instead, because it reads up to 10 result pages on every check to compare prices; a run never pays both fees. Runs that read nothing are not charged at all: a city or locality Magicbricks does not know, an input error such as a minimum price above the maximum, an empty search, a page that could not be read, and the first monitoring run. Rows that explain a result instead of returning a listing are always free. Set a spending limit on the run and the Actor stops at that limit; in monitoring mode, listings it could not return are kept for the next run.

### FAQ

**How do I get new Magicbricks listings in my city every day?**
Turn on "Monitoring mode", set the city and localities, and schedule the Actor. The first run is free and remembers what is listed now; every later run with the same input returns only listings that newly appear in the results since the run before, including listings an advertiser posted again.

**How do I track price drops on Magicbricks?**
Choose "New listings and price drops" in monitoring mode. Each run then also returns remembered listings whose price is now lower, with `previousPriceInr`, `priceDropInr` and `priceDropPercent`.

**Can I export Magicbricks rentals with the rent as a number?**
Yes. Rent listings come with `priceInr` as the monthly rent, `priceType` `monthly-rent`, the amount the listing asks upfront in `bookingAmountInr`, maintenance and the tenants accepted.

**What happens if I misspell a city or locality?**
The run stops with one free row that says which name was not recognised and lists Magicbricks' own suggestions when it has any. It never returns the whole city in place of a locality it does not know. Common other names work: Bengaluru, Delhi, Gurugram, Bombay, Calcutta and Madras are searched as the city Magicbricks lists them under.

**Are owners' or agents' phone numbers or names included?**
No. Rows contain the broker's business name, not people: owners' and agents' personal names and ids are left out, and Indian phone numbers inside descriptions are replaced with "\[phone removed]".

### Limitations

- Magicbricks shows the date a listing was posted and an "updated" label; the row keeps both. Monitoring mode decides what is new by the listing id it remembers: a listing it already returned or remembered is never returned as new again, and a listing that newly appears in the results counts as new even if it was first listed earlier and the advertiser posted it again.
- A locality search returns what Magicbricks files under that locality, which includes its own sub-areas (for example Cauvery Colony under Koramangala); `locality` shows the exact place of each listing.
- Price drops are checked on the first pages of the search (10 pages = 300 listings by default, more with `maxPages`). A remembered listing further down is checked when it comes back into those pages.
- The search returns the photos shown on the results page; open the listing URL for the full gallery.
- This is an unofficial tool and is not affiliated with Magicbricks. Use the data in line with the site's terms and the law that applies to you.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

## `searchMode` (type: `string`):

buy = homes for sale, rent = homes to rent. Rent rows carry the monthly rent in priceInr with priceType monthly-rent.

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

An Indian city, e.g. Mumbai, Bangalore (Bengaluru), Pune, Hyderabad, Chennai, New Delhi, Gurgaon (Gurugram), Noida, Kolkata, Ahmedabad. A Magicbricks city code (digits) also works. An unknown name returns a free row with Magicbricks' suggestions. Empty = Mumbai.

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

Up to 10 localities inside the city, e.g. Andheri West, Powai, Koramangala, Whitefield. Empty = the whole city. A locality Magicbricks does not know stops the run with a free row listing its suggestions, instead of returning the whole city.

## `bhk` (type: `array`):

Bedroom counts to keep. 5 means 5 BHK and above. Empty = any. Sent to Magicbricks and checked again on every row.

## `propertyTypes` (type: `array`):

Empty = apartments, builder floors, penthouses, studios, houses and villas (plots are left out unless you pick them).

## `minPrice` (type: `integer`):

In rupees: the sale price for buy, the monthly rent for rent. 1 crore = 10000000, 1 lakh = 100000. 0 = no minimum. Listings without a price are kept.

## `maxPrice` (type: `integer`):

In rupees: the sale price for buy, the monthly rent for rent. 0 = no maximum. Listings without a price are kept.

## `minAreaSqft` (type: `integer`):

Covered (super built-up) area, else carpet area, else plot area, all converted to square feet. 0 = no minimum.

## `maxAreaSqft` (type: `integer`):

Same area as the minimum. 0 = no maximum.

## `furnishing` (type: `array`):

Empty = any. Listings that do not state furnishing are kept.

## `availability` (type: `string`):

ready = ready to move (or available immediately), under-construction = new projects not yet finished.

## `postedBy` (type: `array`):

Empty = everyone. Owner = listed by the owner, Agent = by a broker, Builder = by the developer.

## `transactionType` (type: `string`):

Only for buy. new = new property from a project, resale = a home sold by its current owner.

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

Only for rent. Keeps listings open to bachelors or to families. Listings that do not say are kept.

## `keywords` (type: `array`):

Keep listings whose title, description, locality, project, developer or amenities contain these words, e.g. sea view, gated, metro.

## `keywordMatch` (type: `string`):

any = at least one keyword, all = every keyword.

## `excludeKeywords` (type: `array`):

Drop listings that contain any of these words, e.g. auction, PG.

## `postedWithinDays` (type: `integer`):

Keep listings posted in the last N days. 0 = no limit. Listings without a posting date are kept.

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

newest = most recently posted first. Monitoring mode always reads newest first.

## `maxListings` (type: `integer`):

How many listings to return. You are charged only for the listing rows you receive. Magicbricks shows 30 listings per page.

## `maxPages` (type: `integer`):

Upper limit on result pages read (30 listings each). 0 = automatic: enough pages for the maximum listings, 40 for monitoring, 10 for price-drop monitoring.

## `monitoringMode` (type: `boolean`):

Remembers this search between runs and returns only listings that newly appear in these search results since the last run (including listings an advertiser posted again); a listing already returned is not returned as new again. The first run is free: it only remembers what is listed now. Schedule it (for example every hour) to get new listings as they appear.

## `alertOn` (type: `string`):

new = new listings only. new-and-price-drops = new listings plus remembered listings whose price is now lower, with previousPriceInr, priceDropInr and priceDropPercent. Price drops are checked on the first pages (maximum pages, 10 by default).

## `resetMonitoringState` (type: `boolean`):

Forget what this search remembered. The next monitoring run is a free first run again.

## Actor input object example

```json
{
  "searchMode": "buy",
  "city": "Mumbai",
  "localities": [
    "Andheri West"
  ],
  "availability": "any",
  "transactionType": "any",
  "tenantType": "any",
  "keywordMatch": "any",
  "sortBy": "newest",
  "maxListings": 20,
  "monitoringMode": false,
  "alertOn": "new",
  "resetMonitoringState": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per listing: Magicbricks listing id and URL, title, buy or rent, property type, BHK, bathrooms, balconies, the price as a number in INR with the site's own text (sale price or monthly rent), price per sq ft, carpet, covered and plot area in sq ft, furnishing, possession status, floor, facing, parking, ownership, maintenance, locality, city, landmark, map position, project, developer, project RERA ids, posted by (owner, agent or builder), the agency name, amenities, description, photos and the posting date. Monitoring rows say new or price-drop with the earlier price. Owners' and agents' personal names, phone numbers and ids are never returned. Unknown cities or localities, filters that matched nothing, monitoring runs with nothing new and pages that could not be read come back as their own rows and are not charged.

# 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 = {
    "city": "Mumbai",
    "localities": [
        "Andheri West"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/magicbricks-listings").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 = {
    "city": "Mumbai",
    "localities": ["Andheri West"],
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/magicbricks-listings").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 '{
  "city": "Mumbai",
  "localities": [
    "Andheri West"
  ]
}' |
apify call neverempty/magicbricks-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/magicbricks-listings"
        }
    }
}
```

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/fHa1d6wG3EHRf5jXS/builds/APtYucce2JQILZgcv/openapi.json
