# MagicBricks Scraper — India Property Listings & Agents (`logiover/magicbricks-india-property-scraper`) Actor

Scrape MagicBricks property listings across Indian cities. Extract price, carpet area, BHK configuration, locality, GPS, possession status, RERA number, project, developer and the posting agent. No API key, no login.

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

## Pricing

from $3.50 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## MagicBricks Scraper — India Property Listings, Prices & Agents

Pull structured property data out of India's largest real-estate portal: price, carpet area, BHK configuration, locality, GPS, RERA registration and the agent behind every listing.

### What does the MagicBricks Scraper do?

This Actor collects live listings from **MagicBricks**, the portal where a large share of India's property supply is advertised. It talks to the same search service the site's own result page calls, so each request returns thirty complete listings as structured JSON — no browser, no CSS selectors that break on the next redesign.

Choose a city, whether you want sale or rent, and a property category, and the Actor pages through the results and writes one flat row per property. Each row carries the asking price both as a number and in the "10.13 Cr" form Indian buyers read, carpet area with its unit, bedrooms, bathrooms and balconies, furnishing, possession status, locality, full address, latitude and longitude, nearby landmarks, the project and developer for new builds, the RERA registration number, and the agent or agency that posted it. No API key, no login.

### Who is it for?

- **Proptech teams and property portals** building or benchmarking an inventory dataset for Indian cities.
- **Real-estate investors and analysts** tracking price per square foot across localities and over time.
- **Brokers and agencies** monitoring competing listings and identifying active agents in their patch.
- **Lead-generation teams** assembling agent and agency lists with track-record signals.
- **Banks, valuers and researchers** who need comparable-sale evidence with GPS and RERA identifiers.

### Use cases

- Compare asking price per carpet-area square foot across Mumbai localities, month over month.
- Build a rental yield model by running the same city twice — once for sale, once for rent.
- Track how much new-build supply a specific developer has live, and at what price band.
- Extract every RERA-registered listing in a city for compliance or due-diligence work.
- Rank agencies in a city by live-listing count, rating and years in business.

### Why use this MagicBricks Scraper?

- **Keyless and login-free** — no account, no API key, no cookies to maintain.
- **43 fields per property**, including GPS, landmarks, RERA numbers and agent details that card-scrapers usually miss.
- **20 major cities in a dropdown** plus a free-text city code for anywhere else on the portal.
- **Sale and rent, residential and commercial** — four combinations from one Actor.
- **Bulk by design** — 30 listings per request, tens of thousands live per metro city.
- **Export anywhere** — JSON, CSV, Excel, Google Sheets — and pay per result.

### What data can you extract?

One row per property. Anything the advertiser left blank comes back as `null`, so a missing bathroom count never looks like zero bathrooms.

| Field | Type | Description |
|---|---|---|
| `listingId` | string | MagicBricks property id |
| `title` | string | Listing headline, e.g. "4BHK Multistorey Apartment…" |
| `url` | string | Direct link to the property page |
| `description` | string | Full listing description |
| `price` | number | Asking price in INR |
| `priceText` | string | Price as displayed, e.g. "10.13 Cr" |
| `currency` | string | `INR` when a price is quoted |
| `listingType` | string | `Sale` or `Rent` |
| `transactionType` | string | New Property or Resale |
| `propertyType` | string | Apartment, Independent House, Plot, Villa… |
| `bedrooms` | number | BHK configuration |
| `bathrooms` | number | Bathroom count |
| `balconies` | number | Balcony count |
| `furnishing` | string | Unfurnished, Semi-Furnished, Furnished |
| `carpetArea` | number | Carpet area |
| `areaUnit` | string | Unit the area is quoted in, usually Sq ft |
| `possessionStatus` | string | Ready to move, or possession month for under-construction |
| `tenantsPreference` | string | Preferred tenant type on rentals |
| `isLuxury` | boolean | Portal's luxury flag |
| `isPrimeLocation` | boolean | Portal's prime-location flag |
| `city` | string | City |
| `locality` | string | Locality |
| `address` | string | Full posted address |
| `latitude` / `longitude` | number | GPS coordinates |
| `landmarks` | string | Nearby landmarks, pipe-separated |
| `projectName` | string | Project or society name |
| `developerName` | string | Developer for new builds |
| `reraNumber` | string | RERA registration number(s) |
| `postedBy` | string | Agent, Owner or Builder |
| `agentName` | string | Name of the posting agent |
| `agencyName` | string | Agency name |
| `agencyRating` | number | Agency star rating |
| `agencyTrackRecord` | string | Track-record label, e.g. "5500+ Buyers Served" |
| `agencyOperatingSince` | number | Year the agency started |
| `agentReraNumber` | string | Agent's own RERA registration |
| `isReraRegisteredAgent` | boolean | Whether the agent is RERA registered |
| `postedAt` | string | ISO 8601 posting timestamp |
| `postedText` | string | Posting date as displayed |
| `expiresAt` | string | When the listing expires |
| `imageUrl` | string | Main photo |
| `imageCount` | number | Number of photos |
| `scrapedAt` | string | ISO 8601 collection timestamp |

#### Sample output

```json
{
  "listingId": "85485987",
  "title": "4BHK Multistorey Apartment for New Property in Parinee Elenora Juhu Mumbai",
  "url": "https://www.magicbricks.com/propertyDetails-4-BHK-1655-Sqft-Flat-FOR-Sale-Juhu-Mumbai",
  "price": 101311000,
  "priceText": "10.13 Cr",
  "currency": "INR",
  "listingType": "Sale",
  "transactionType": "New Property",
  "propertyType": "Apartment",
  "bedrooms": 4,
  "bathrooms": 4,
  "balconies": 2,
  "furnishing": "Unfurnished",
  "carpetArea": 1655,
  "areaUnit": "Sq ft",
  "possessionStatus": "Sep '26",
  "city": "Mumbai",
  "locality": "Juhu",
  "address": "Plot No. 5, N. S. Road No. 10, Juhu, Vile Parle West, Mumbai",
  "latitude": 19.1142783,
  "longitude": 72.8301489,
  "landmarks": "Juhu Beach Bus Stop | Navrang Theatre | Podar World College",
  "projectName": "Parinee Elenora",
  "developerName": "Parinee Developers",
  "reraNumber": "P51800046382",
  "postedBy": "Agent",
  "agentName": "Desai Rakesh",
  "agencyName": "Tejasvi Realty Pvt. Ltd.",
  "agencyRating": 4,
  "agencyTrackRecord": "5500+ Buyers Served",
  "agencyOperatingSince": 1993,
  "postedAt": "2026-08-07T17:37:12.000Z",
  "imageCount": 32,
  "scrapedAt": "2026-08-13T17:27:30.894Z"
}
```

### How to use the MagicBricks Scraper

#### Option A — a city from the dropdown

The common case: pick one of twenty major cities, choose sale or rent, and run.

```json
{
  "city": "4320",
  "listingType": "sale",
  "propertyTypes": "residential",
  "maxResults": 1000,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "IN" }
}
```

1. Choose a **City** — Mumbai, Delhi NCR, Bangalore, Hyderabad and so on.
2. Set **Sale or rent**.
3. Choose a **Property type** — residential covers flats, builder floors, houses, villas, plots and studios; commercial covers offices, shops, showrooms and warehouses.
4. Set **Max results** and run.

#### Option B — any city by code

MagicBricks covers far more cities than fit in a dropdown. Open the portal's own search for the city you want and read the `city=` parameter out of the URL (or the `data-citycode` attribute in the page source), then pass it as **City code**. It overrides the dropdown.

```json
{
  "cityCode": "3808",
  "listingType": "rent",
  "propertyTypes": "apartments",
  "maxResults": 500,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "IN" }
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `city` | string | `4320` (Mumbai) | City to crawl, chosen from 20 major markets. |
| `cityCode` | string | — | Raw MagicBricks city code; overrides the dropdown. |
| `listingType` | string | `sale` | `sale` or `rent`. |
| `propertyTypes` | string | `residential` | `residential`, `apartments`, `houses`, `plots` or `commercial`. |
| `maxResults` | integer | `500` | How many properties to collect. |
| `proxyConfiguration` | object | Residential / IN | MagicBricks answers reliably from Indian IPs. |

### Tips for best results

- **One city per run.** MagicBricks indexes each city separately; running Mumbai and Bangalore as two runs is both faster and cleaner than trying to combine them.
- **Carpet area, not built-up area.** The portal's search feed publishes carpet area — the number that matters for a price-per-square-foot comparison. Compare like with like across your dataset.
- **Sale and rent need separate runs** if you want a yield model; the prices are not comparable in one column.
- **Use `reraNumber` as a quality filter.** RERA-registered listings are regulated inventory and tend to carry more reliable project data.
- **`postedBy` separates owners from agents.** Owner listings are the ones brokers usually want; agent listings are the ones lead-gen teams want.
- **Keep the India proxy country.** The search service is tuned for Indian traffic and non-local exits are throttled harder.
- **Add a short schedule rather than one enormous run.** A daily run captures new supply and price revisions with far less duplication.
- **Deduplicate on `listingId`** across runs; the same property can reappear with a refreshed posting date.
- **Zero rows?** Check the city-code and listing-type combination first — a small city may have no commercial rentals at all.

### Integrations

- **Google Sheets** — send each run's dataset to a sheet your acquisitions team already uses.
- **Slack** — notify a channel when new listings appear in a target locality.
- **Zapier / Make** — push rows into a CRM as leads.
- **Webhooks** — receive the dataset id as soon as a run finishes.
- **Schedules** — daily or weekly runs build a price history no portal exposes directly.

### API usage

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~magicbricks-india-property-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"city":"4320","listingType":"sale","maxResults":200}'
```

**Node.js**

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('logiover/magicbricks-india-property-scraper').call({
    city: '3327',
    listingType: 'rent',
    propertyTypes: 'apartments',
    maxResults: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'properties');
```

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")

run = client.actor("logiover/magicbricks-india-property-scraper").call(run_input={
    "city": "4320",
    "listingType": "sale",
    "propertyTypes": "residential",
    "maxResults": 500,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["locality"], item["priceText"], item["carpetArea"])
```

### Use with AI agents (MCP)

Expose this Actor through Apify's MCP server (`https://mcp.apify.com`) and an AI assistant can query the Indian property market live rather than from stale training data.

> *"Use the MagicBricks scraper to collect 300 apartments for sale in Bangalore, then show me median price per square foot by locality and flag anything RERA-registered under ₹1 Cr."*

### FAQ

#### Do I need a MagicBricks account or API key?

No. The Actor reads publicly visible listings through the portal's own public search service. Nothing to register, nothing to store.

#### Which cities are supported?

Twenty major markets are in the dropdown: Mumbai, Delhi NCR, Bangalore, Hyderabad, Pune, Chennai, Kolkata, Ahmedabad, Noida, Gurgaon, Thane, Navi Mumbai, Jaipur, Lucknow, Chandigarh, Indore, Coimbatore, Kochi, Bhopal and Nagpur. Any other city works through the **City code** field.

#### How many listings can one run return?

A metro city carries tens of thousands of live listings. Set `maxResults` to what you need; the Actor pages until it reaches that number or the city runs out.

#### Why did my run return zero rows?

Usually an impossible filter combination — commercial rentals in a small city, for instance. Switch back to residential and sale to confirm the city code works, then narrow again.

#### Why are some fields null?

Because the advertiser left them blank. Balconies, agent RERA numbers and agency ratings are optional on MagicBricks. A `null` means "not published", never "zero".

#### Does it include the agent's phone number?

No. MagicBricks keeps contact numbers behind a login and an OTP, so they are not part of the public listing data and this Actor does not attempt to reach them. You do get the agent's name, agency, rating, track record and RERA registration.

#### What is the RERA number for?

RERA is India's real-estate regulator. A registration number means the project or agent is registered with the state authority, which is a strong quality and compliance signal when filtering listings.

#### Can I export to CSV or Excel?

Yes — JSON, CSV, Excel, XML and RSS from the run's Storage tab or through the API.

#### How fresh is the data?

Every run fetches live search pages, sorted by the portal's recency-weighted default. `postedAt` on each row tells you exactly how old a listing is.

#### Is scraping MagicBricks legal?

The Actor collects only publicly visible listing information. See the legal note below before large-scale or commercial use.

#### How often is the Actor updated?

It is monitored and maintained. Reading a structured JSON service rather than page markup means it survives the portal's frequent visual redesigns.

### Is it legal to scrape MagicBricks?

This Actor collects publicly available information only — property listings MagicBricks publishes openly to every visitor, without a login or paywall. Collecting public data is broadly lawful in most jurisdictions, but how you use it is your responsibility.

Read MagicBricks' Terms of Service before large-scale or commercial collection. Agent names and agency details may constitute personal data under India's DPDP Act, the GDPR or similar laws — make sure you have a lawful basis before storing or processing them, especially for marketing. This is not legal advice.

### Related scrapers

- **[Chợ Tốt Scraper](https://apify.com/logiover/chotot-vn-marketplace-scraper)** — Vietnam's largest classifieds marketplace.
- **[Zameen Property Scraper](https://apify.com/logiover/zameen-property-scraper)** — Pakistan's largest property marketplace with agent contacts.
- **[Lamudi Scraper](https://apify.com/logiover/lamudi-philippines-property-scraper)** — Philippine property listings.
- **[Rumah123 Scraper](https://apify.com/logiover/rumah123-scraper)** — Indonesian property listings and agent contacts.

# Actor input Schema

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

Which Indian city to crawl. MagicBricks indexes each city separately, so one run covers one city.

## `cityCode` (type: `string`):

Overrides the dropdown with any MagicBricks city code, for cities not listed above. Read it from the site's own search URL (the `city=` parameter, or `data-citycode` in the page source).

## `listingType` (type: `string`):

Properties offered for sale, or properties offered to rent.

## `propertyTypes` (type: `string`):

Which property kinds to include. Residential covers flats, builder floors, houses, villas, plots and studios.

## `maxResults` (type: `integer`):

How many properties to collect. A big city such as Mumbai or Bangalore carries tens of thousands of live listings.

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

MagicBricks answers reliably from Indian IPs, so residential proxies pinned to India are used by default.

## Actor input object example

```json
{
  "city": "4320",
  "listingType": "sale",
  "propertyTypes": "residential",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}
```

# Actor output Schema

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

Every record collected in this run. Open the Dataset tab to browse, filter or export as JSON, CSV or Excel.

# 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": "4320",
    "listingType": "sale",
    "propertyTypes": "residential",
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/magicbricks-india-property-scraper").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": "4320",
    "listingType": "sale",
    "propertyTypes": "residential",
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/magicbricks-india-property-scraper").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": "4320",
  "listingType": "sale",
  "propertyTypes": "residential",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}' |
apify call logiover/magicbricks-india-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/sSvsZKyi7TguZqUtI/builds/fD9GafkQQbzOYHAvU/openapi.json
