# Magicbricks Property Listings Scraper (India) (`superslowsloth/magicbricks-listings`) Actor

Magicbricks property scraper for India: newest flats, houses and plots for sale in any city, one row per listing with price in INR, price per sq ft, area, BHK, bathrooms, locality, project, furnishing, posted date and owner/agent/builder type. Built for new-listing alerts.

- **URL**: https://apify.com/superslowsloth/magicbricks-listings.md
- **Developed by:** [Superslow Sloth](https://apify.com/superslowsloth) (community)
- **Categories:** Real estate, Automation
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 76.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.42 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper - India, Newest Flats, Houses and Plots for Sale

Indian property-for-sale listings from [Magicbricks](https://www.magicbricks.com),
one flat, typed dataset row per listing: price in INR, price per sq ft, built-up,
carpet and plot area, BHK, bathrooms, property type, resale or new, furnishing,
possession, floor, locality, project and developer, RERA id, posted date and
whether an owner, agent or builder posted it. Any city, newest first - so a daily
run is a **new-listing alert** for Mumbai, Bangalore, Pune, Delhi, Hyderabad or
any other city Magicbricks covers.

### What you are paying for, honestly

The data comes from the JSON that magicbricks.com's own search results page
pages with (`/mbsrp/propertySearch.html`). It needs no login or API key. What this
actor adds:

- **Getting past Akamai.** Magicbricks sits behind Akamai. A plain HTTP client gets
  "Access Denied"; this actor presents a real Chrome TLS fingerprint and runs on
  residential proxies by default. Measured from the Apify platform on 2026-10-27:
  residential exits passed 8 of 10 and 7 of 10 sampled fetches, datacenter 4 of 10.
  A refused request is retried from a fresh address, up to five attempts.
- **You type a city, not a code.** Magicbricks searches by numeric city code
  (4320 is Mumbai). This actor resolves a name (`Mumbai`, `Bengaluru`), a slug
  (`new-delhi`) or a pasted search URL
  (`https://www.magicbricks.com/property-for-sale-in-pune-pppfs`) with Magicbricks'
  own search box and logs which city each line became. A city code is used as given.
- **Price as a number.** `price_inr` is Magicbricks' own numeric field in rupees,
  not a parse of "₹2.65 Cr"; the display text is kept beside it.
- **A real "newest" sort.** The search page's own "recent" form value does not sort
  at all (measured: same rows as no sort). This actor uses the "Most Recent" order,
  which was strictly newest-first by posted time on every page checked.
- **Several cities, one run, deduplicated.** A listing that appears twice in a walk
  (new posts shift the pages while it runs) is returned and charged once.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `cities` | array | `mumbai`, `bangalore` | City name, slug, search URL or city code, one per line. Required. |
| `propertyTypes` | array | all | Any of `flat`, `house_villa`, `plot`. |
| `sort` | string | `newest` | `newest`, `price_asc`, `price_desc`, `relevance`. |
| `postedWithinDays` | integer | - | Keep only listings posted in the last N days and stop each city at the first page with none. Needs `newest`. |
| `minPrice`, `maxPrice` | integer | - | Budget in rupees (5000000 = 50 lakh, 10000000 = 1 crore). |
| `bedrooms` | array | any | BHK counts, `1` to `6`. |
| `postedBy` | array | all | Any of `owner`, `agent`, `builder`. |
| `maxItems` | integer | `100` | Most listings **per city**. Each listing is billed, so this is a spending cap. |
| `proxyConfiguration` | proxy | Apify residential | See the pass rates above. |

Property types are grouped the way Magicbricks groups them on its own server: asking
for any one apartment code returns every apartment-like listing, so `flat` covers
multistorey and builder-floor apartments, penthouses, studio and service apartments;
`house_villa` covers independent houses and villas; `plot` residential plots.

### Limits measured

- **3,000 listings per city search.** Magicbricks serves 30 listings a page and at
  most 100 pages; page 101 answers page 1 again. Mumbai reports over 61,000 listings
  for sale, but one search reads the first 3,000 - in newest order that was about the
  last three days of postings. The log says when a city hit this. Narrow by property
  type, budget or bedrooms to read further back.
- **Busy cities post thousands a day.** For an alert, schedule the run at least daily
  and set `maxItems` high enough to cover a day, or use `postedWithinDays: 1`.
- `posted_at` is when the listing was posted or last re-posted - that is the date
  Magicbricks sorts "Most Recent" by. A refreshed old listing comes back as new; key
  your alert on `listing_id` to tell.
- **For sale only.** Rentals, commercial property and PG listings are not covered.

### Output

One row per listing. Example (abridged):

```json
{
  "search_city": "mumbai",
  "listing_id": "86695471",
  "url": "https://www.magicbricks.com/propertyDetails/2-BHK-991-Sq-ft-Multistorey-Apartment-FOR-Sale-Goregaon-West-in-Mumbai&id=4d423836363935343731",
  "title": "2BHK Multistorey Apartment for New Property in Kalpataru Radiance at Goregaon West",
  "price_inr": 33141000,
  "price_display": "3.31 Cr",
  "price_per_sqft_inr": 33442,
  "covered_area": 991.0,
  "covered_area_unit": "sqft",
  "covered_area_sqft": 991.0,
  "carpet_area": 881.0,
  "bedrooms": 2,
  "bathrooms": 2,
  "property_type": "Apartment",
  "transaction": "New Property",
  "furnishing": "Unfurnished",
  "possession_status": "Ready to Move",
  "locality": "Goregaon West",
  "city": "Mumbai",
  "project_name": "Kalpataru Radiance",
  "developer": "Kalpataru Ltd.",
  "posted_at": "2026-10-26T17:36:57.000Z",
  "advertiser_type": "Agent",
  "advertiser_name": "Hitesh Estate Consultancy"
}
```

| Field | What it is |
|---|---|
| `search_city` | The city line this row came from, as you typed it. |
| `listing_id`, `enc_id` | Magicbricks' numeric listing id (stable; use it to dedupe alerts) and its encrypted id. |
| `url`, `title` | The listing page and its title. |
| `price_inr`, `price_display` | Asking price in rupees, and Magicbricks' own text ("2.65 Cr", "85 Lac"). |
| `price_min_inr`, `price_max_inr` | A new project's price band for the unit type, when given. |
| `price_per_sqft_inr` | Magicbricks' rate per sq ft. |
| `covered_area`, `covered_area_unit`, `covered_area_sqft` | Built-up / super area as listed, its unit (`sqft`, `sqyd`, `sqm`, ...) and Magicbricks' conversion to sq ft. |
| `carpet_area`, `carpet_area_unit` | Carpet area, when the advertiser gave it. |
| `plot_area`, `plot_area_unit` | Land area: plots and some houses. |
| `bedrooms`, `bathrooms`, `balconies` | Counts. |
| `property_type`, `transaction` | "Apartment", "Villa", "Residential Plot", ...; "Resale" or "New Property". |
| `furnishing`, `possession_status`, `ownership`, `facing`, `property_age` | As listed ("Semi-Furnished", "Ready to Move" or a month like "Mar '27", "Freehold", "East", "5 to 10 years"). |
| `floor`, `total_floors`, `floor_raw` | Floor number (ground = 0), the building's floors, and the text as listed. |
| `locality`, `city`, `city_code` | Where. |
| `project_name`, `project_id`, `developer`, `rera_id` | The project or society, its developer and RERA registration, when given. |
| `latitude`, `longitude` | The listing's map pin. |
| `posted_at` | Posted (or re-posted) time, ISO 8601 UTC. |
| `advertiser_type`, `advertiser_name` | "Owner", "Agent" or "Builder", and the agency or builder name. |
| `photo_url`, `photo_count`, `description` | Card photo, number of photos, the advertiser's description. |

#### Why null and not 0

A field Magicbricks does not send for a listing is `null`. Plots have no bedrooms,
bathrooms or built-up area; most resale flats give no carpet area; about one listing
in twenty has no price per sq ft; a basement floor has no floor number; and about one
listing in six has its map pin at 0,0, which is "no pin", not a place in the ocean
off Africa. A 0 in any of those would read as a measurement.

`advertiser_name` is always `null` on owner listings: there it is a private person's
name, which this actor does not collect. Agency and builder names are business names
and are kept.

### Use it for

- A daily new-listing alert per city, BHK and budget, sent to Sheets, Slack or a
  webhook through Apify integrations.
- Asking-price and price-per-sq-ft tracking by locality or project.
- Owner-posted listings only (`postedBy: owner`), for buyers avoiding brokerage.

Magicbricks is a trademark of its owner; this actor is not affiliated with it. It reads
only public search listings, and you are responsible for using the data lawfully.

# Actor input Schema

## `cities` (type: `array`):

One or more Indian cities to search for property for sale. Type the city as Magicbricks spells it (Mumbai, New Delhi, Bangalore, Bengaluru, Pune, Hyderabad, Gurgaon, Navi Mumbai, Thane), its URL slug (new-delhi), a Magicbricks search URL (https://www.magicbricks.com/property-for-sale-in-pune-pppfs) or a numeric Magicbricks city code (4320 = Mumbai). Each city is resolved through Magicbricks' own search box; a name it does not know is reported in the log and skipped.

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

Which residential property types to include. Leave empty for all of them, as Magicbricks' own residential search does. Magicbricks groups its types server-side: flat covers multistorey and builder-floor apartments, penthouses, studio and service apartments; house_villa covers independent houses and villas; plot covers residential plots.

## `sort` (type: `string`):

How Magicbricks orders each city's results before this actor pages through them. Newest first is Magicbricks' "Most Recent" order by posted date, and is what a new-listing alert should run on.

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

Keep only listings posted in the last N days, and stop reading a city at the first page that has none. Needs sort 'Newest first'. Leave empty for no date limit. Busy cities post thousands of listings a day (Mumbai: about 1,500 in two days), so pair a short window with a Max rows per city that covers it.

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

Lowest asking price in rupees, e.g. 5000000 for 50 lakh. Passed to Magicbricks' own budget filter. Leave empty for no lower bound.

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

Highest asking price in rupees, e.g. 20000000 for 2 crore. Passed to Magicbricks' own budget filter. Leave empty for no upper bound.

## `bedrooms` (type: `array`):

Only listings with one of these bedroom counts. Leave empty for any. Magicbricks' filter goes from 1 to 6 BHK; plots have no bedroom count and are excluded by any bedroom filter.

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

Only listings posted by these kinds of advertiser. Leave empty for all.

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

Stop each city after this many listings. Magicbricks serves at most 100 pages of 30 per search, so 3,000 is the most one city search can return whatever its total; narrow by property type, budget or bedrooms to read past that.

## `proxyConfiguration` (type: `object`):

Residential proxy is the default and recommended. Magicbricks sits behind Akamai: measured 2026-10-27 from the Apify platform, its search answered 8 of 10 fetches through residential exits and 4 of 10 through datacenter ones (the rest an Akamai "Access Denied" 403). Refused requests are retried on a fresh address automatically.

## Actor input object example

```json
{
  "cities": [
    "mumbai",
    "bangalore"
  ],
  "sort": "newest",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# 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 = {
    "cities": [
        "mumbai",
        "bangalore"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("superslowsloth/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 = {
    "cities": [
        "mumbai",
        "bangalore",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("superslowsloth/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 '{
  "cities": [
    "mumbai",
    "bangalore"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call superslowsloth/magicbricks-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,superslowsloth/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/k41ORQ6J6jP1hLR3C/builds/GjEDFEvCIRl5CtNug/openapi.json
