# MahaRERA Scraper - Maharashtra RERA Projects, Complaints, Sales (`nice_dev/maharera-projects-scraper`) Actor

Scrape the official MahaRERA registry: every registered project in Maharashtra with developer, address, GPS, completion dates and delays, complaints, court cases, construction progress, loans and sold apartments with prices. By RERA number, MagicBricks / 99acres URL or registry scan.

- **URL**: https://apify.com/nice\_dev/maharera-projects-scraper.md
- **Developed by:** [Nice Dev](https://apify.com/nice_dev) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.62 / 1,000 projects

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

### 🏠 What is MahaRERA Scraper?

**MahaRERA Scraper** extracts **registered real estate projects from the official [MahaRERA registry](https://maharerait.maharashtra.gov.in)** (Maharashtra Real Estate Regulatory Authority): the **project, its developer, address and GPS, completion dates and delays, complaints, court cases, construction progress, loans on the project and the apartments sold with their agreement price** — for any RERA number, any MagicBricks or 99acres listing, or the whole registry.

Paste **RERA numbers** (`P51800028936`), **MagicBricks / 99acres URLs**, or leave both empty to go through the registry with filters (district, developer, status, registration date), click **Start**, and download the projects in JSON, CSV or Excel. No login on your side, nothing to set up: **2 large projects with every option in about 15 seconds**.&#x20;

### 📋 What data can you extract from MahaRERA?

One item per project, 79 fields:

| Category | What you get |
| --- | --- |
| 🏷️ **Project** | name, RERA number, type, status, registration status (active, completed, lapsed, deregistered, in abeyance), link to the official page — `SHRADDHA VARDAAN`, `P51800028936` |
| 📍 **Location** | full address, locality, village, taluka, district, PIN code, GPS, what lies around the plot — `Mumbai Suburban`, `400078` |
| 🏗️ **Developer** | developer name and id, office address, directors, CREDAI / NAREDCO membership — `SHRADDHA LANDMARK PRIVATE LIMITED` |
| 🕒 **Dates and delays** | registration, original and revised completion date, **delay in days**, every extension with its reason — `274 days late` |
| 🚧 **Construction** | buildings and floors, % of work done per building and per task, common facilities, land area, FSI, total cost — `95.9 % done` |
| ⚖️ **Complaints and court cases** | every complaint at MahaRERA (number, date, status, order), appeals, court cases — `1 complaint, order approved` |
| 🏦 **Money** | loans on the project (lender, amount), own funds and borrowings, project bank |
| 🏠 **Apartments sold** | apartment by apartment: floor, carpet area, **agreement price, amount received**; booked and unsold ones; min / max / average price per sq ft — `A-102, 48.23 m², ₹70,00,000` |
| 👥 **Agents and professionals** | registered agents (name, MahaRERA agent number, dates), architects, engineers, chartered accountants |

Every field, with an example, is listed in the **Output** section below. The options (project details, complaints, apartments, agents, professionals) are all off by default: tick the ones you need to get their fields; each option left off leaves its fields empty and is not charged.

### ✅ Why use MahaRERA Scraper?

- 🏛️ **The official source**: the MahaRERA registry itself, not a listing portal that prints the RERA number only.
- ⏱️ **Delays at a glance**: original and revised completion dates, the delay in days and the reason of each extension. The 4-month extension MahaRERA gave to nearly every project in August 2026 (Order 66/2026) is flagged and not counted as a delay: `delayedOnly` keeps the projects whose developer really asked for more time.
- ⚖️ **Risk in one row**: complaints, appeals, court cases and loans on the project, next to the developer and the address.
- 🏠 **Real prices**: the agreement price and the amount received of every apartment sold, as declared to the regulator.
- 🔗 **From a listing to the registry**: paste a MagicBricks or 99acres URL, get the registered project behind it.
- 🔔 **Monitoring built in**: new projects only, or also the projects that changed since the last run (a new complaint, a revised date), with what changed.
- 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…) and JSON/CSV/Excel export via the Apify platform.

### 🚀 How to scrape MahaRERA

1. Create a free Apify account.
2. Open **MahaRERA Scraper** and paste one or more **RERA registration numbers** (e.g. `P51800028936`).
3. Or paste **MagicBricks / 99acres URLs** (a property, a project or a search page) into **Start URLs** — or leave both empty and set filters (district, developer, status, registration date) to go through the whole registry.
4. Set **Max projects** (100 by default, 0 = no limit), tick the options you need (**Project details**, **Complaints and appeals**, **Apartments**, **Registered agents**, **Architects, engineers, accountants**), then click **Start**.
5. Download the dataset in JSON, CSV, Excel or via API.

### 💰 How much does it cost to scrape MahaRERA?

This Actor uses **pay per event** pricing. Platform usage (compute, proxy) is included in the price.

| Event | Price |
|---|---|
| Project saved | $0.65 per 1,000 (Free plan) down to $0.62 per 1,000 (Gold plan and above) |
| Each option ticked (project details, complaints and appeals, apartments, agents, professionals) | $0.09 per 1,000 projects, per option |
| MagicBricks or 99acres page read for its RERA numbers (a page may hold several projects) | $5 per 1,000 pages (Free) down to $4.97 (Gold) |
| Project read and dropped by a filter the registry does not offer (location, keyword, dates) | $0.19 per 1,000 |
| Run start | $0.001 |

- **1,000 projects, no option, Free plan:** 1,000 × $0.00065 + $0.001 = **$0.65**.
- **1,000 projects with all 5 options, Gold plan:** 1,000 × ($0.00062 + 5 × $0.00009) + $0.001 = **$1.07**.

### ⚙️ Input

```json
{
    "registrationNumbers": ["P51800028936", "PR1260002502426"],
    "maxItems": 100
}
```

The newest projects of a district, delayed ones only, registered this year:

```json
{
    "location": "Pune",
    "delayedOnly": true,
    "postedAfter": "2026-01-01",
    "includeUnits": false,
    "maxItems": 200
}
```

Or from MagicBricks / 99acres pages, and a daily watch of what changed:

```json
{
    "startUrls": [
        { "url": "https://www.magicbricks.com/property-for-sale-in-pune-pppfs" },
        { "url": "https://www.99acres.com/new-projects-in-pune-ffid" }
    ],
    "onlyNew": true,
    "stateKey": "pune-watch",
    "maxItems": 500
}
```

| Field | Notes |
| --- | --- |
| `registrationNumbers` | RERA numbers: `P51800028936`, or `PR1260002502426` (since October 2025). Case and spaces are ignored. |
| `startUrls` | MagicBricks / 99acres pages (every RERA number printed on them is read, search pages are followed) or MahaRERA project pages. |
| `query`, `searchQueries` | Keep the projects whose name or developer contains one of these, e.g. `Lodha`. |
| `location`, `locations` | District, taluka, village, locality or PIN code of the project land: `Pune`, `Mumbai Suburban`, `411014`. Whole names only: `Wardha` does not find `Wardhaman Nagar`, and a project on the `Pune Mumbai Highway` is not in Mumbai. |
| `maxItems` | Stop after this many projects for the whole run (`0` = unlimited). |
| `maxItemsPerQuery` | Cap for EACH start URL and for the registry scan. `0` = no per-search cap. |
| `includeDetails`, `includeComplaints`, `includeUnits`, `includeAgents`, `includeProfessionals` | What to extract on top of the project (all off by default); each one ticked adds its fields and its charge. |
| `includeComplainantNames` | Add the names of the private persons who filed a complaint or an appeal, and the file names of the orders, named after them (off by default; companies are always named). |
| `projectStatuses` | Keep only `New` projects (started after RERA) or `Ongoing` ones (started before). |
| `registrationStatuses` | Keep only these registration states: `active`, `completed`, `lapsed`, `deregistered`, `abeyance`. |
| `propertyTypes` | Keep the projects whose type contains one of these words, such as `Residential` or `Commercial`. |
| `postedAfter`, `postedBefore` | Registration date range: `2026-01-01`, or a period before now (`30 days`, `6 months`). |
| `latitude`, `longitude`, `radiusKm` | Keep the projects within `radiusKm` of the point. |
| `delayedOnly`, `withComplaintsOnly` | Keep only the projects whose developer asked for an extension (the general 4-month extension of August 2026 does not count), or those with at least one complaint. |
| `excludeKeywords` | Drop the projects whose name contains one of these words (case and accents ignored). |
| `onlyNew`, `alsoChanged`, `stateKey`, `resetState` | Monitoring: only the projects never delivered under this memory key (and, with `alsoChanged`, those that changed since); `resetState` forgets the memory. |
| `projectIdFrom`, `projectIdTo` | Registry scan range (internal ids, newest first by default). |
| Advanced | `proxyConfiguration` (no proxy by default: the registry answers fastest directly; your own proxy URLs are accepted; the residential Apify proxy is not available), `maxConcurrency`, `maxRequestsPerMinute`, `minRequestIntervalMs`, `maxRequestRetries`, `debugLog`. |

### 📦 Output

A real project (shortened: the lists keep their first entry, a few fields left out):

```json
{
    "id": "33591",
    "reraId": "P51800028936",
    "url": "https://maharerait.maharashtra.gov.in/public/project/view/33591",
    "projectName": "SHRADDHA VARDAAN",
    "propertyType": "Residential / Group Housing",
    "projectStatus": "New",
    "registrationStatus": "Active",
    "registrationDate": "2021-04-15",
    "originalCompletionDate": "2027-12-31",
    "revisedCompletionDate": "2028-04-30",
    "completionDelayDays": 0,
    "address": "VILLAGE KANJUR, BHANDUP WEST, Kurla, Mumbai Suburban, 400078",
    "district": "Mumbai Suburban",
    "pinCode": "400078",
    "latitude": 19.1283227,
    "longitude": 72.9281371,
    "developer": "SHRADDHA LANDMARK PRIVATE LIMITED",
    "totalUnits": 723,
    "soldUnitsCount": 681,
    "totalCost": 2530000000,
    "currency": "INR",
    "workDonePercent": 95.9,
    "extensions": [
        { "applicationNumber": "P51800028936/War", "originalDate": "2027-12-31", "revisedDate": "2028-04-30", "reason": null, "generalOrder": true }
    ],
    "litigationCount": 1,
    "encumbrances": [{ "lender": "Aditya Birla Capital Limited", "trustee": null, "securedAmount": 850000000 }],
    "complaintCount": 1,
    "complaints": [
        {
            "number": "CC12504491",
            "date": "2025-12-16",
            "type": "Regular",
            "status": "Order Approved",
            "complainant": null,
            "respondent": "SHRADDHA LANDMARK PRIVATE LIMITED",
            "orderFileName": null,
            "orderDate": "2025-12-16"
        }
    ],
    "priceMin": 3040000,
    "priceMax": 10993750,
    "pricePerSqFt": 13890,
    "soldUnits": [
        {
            "building": "WING A",
            "wing": null,
            "floor": "Floor 1",
            "unit": "A-102",
            "carpetAreaSqm": 48.23,
            "agreementPrice": 7000000,
            "receivedAmount": 4896500,
            "balanceAmount": 2103500
        }
    ],
    "agentCount": 0,
    "searchUrl": null,
    "scrapedAt": "2026-09-26T08:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

#### All 79 fields

| Fields | What you get |
| --- | --- |
| `id`, `reraId`, `url`, `projectName`, `propertyType` | 🏷️ **Project**: registry id, RERA number, official page, name, type |
| `projectStatus`, `registrationStatus`, `isLapsed`, `isDeregistered`, `isInAbeyance`, `certificateStatus`, `isMigrated` | `New` / `Ongoing`, `Active` / `Lapsed`…, flags, registered on the old portal (2017-2025) |
| `applicationNumber`, `applicationDate`, `registrationDate`, `certificateDate` | 🕒 **Dates**: filing, registration (what the date filters read), latest certificate |
| `originalCompletionDate`, `revisedCompletionDate`, `completionDelayDays`, `extensionCount`, `extensions` | completion promised and revised, delay in days (the developer's own extensions; the general 4-month order of August 2026 is flagged `generalOrder`, not counted), each extension with its reason |
| `address`, `street`, `locality`, `village`, `taluka`, `district`, `state`, `pinCode`, `latitude`, `longitude`, `boundaries` | 📍 **Location** of the project land |
| `developer`, `developerId`, `developerContactPerson`, `developerDistrict`, `developerPinCode`, `developerType`, `developerAddress`, `developerDirectors`, `developerMemberships` | 🏗️ **Developer** |
| `totalUnits`, `soldUnitsCount`, `landAreaSqm`, `builtUpAreaSqm`, `permissibleFsiSqm`, `plotNumbers`, `planningAuthority`, `buildingCount`, `buildings` | 🚧 **Construction**: units (sold + booked in `soldUnitsCount`), land and plan, buildings with floors, units, cost and % done |
| `totalCost`, `currency`, `workDonePercent`, `constructionTasks`, `commonFacilities` | total cost (INR), % of work done, progress per task and per common facility |
| `litigationCount`, `litigations`, `hasEncumbrance`, `encumbrances`, `financing`, `projectBank`, `projectBankIfsc` | ⚖️🏦 court cases, loans on the project, means of finance, project bank |
| `complaintCount`, `complaints`, `appealCount`, `appeals` | complaints at MahaRERA and appeals at the Appellate Tribunal |
| `priceMin`, `priceMax`, `pricePerSqFt`, `soldUnits`, `bookedUnits`, `unsoldUnits` | 🏠 **Apartments**: sold and booked with agreement price and amount received, unsold with their ready-reckoner value |
| `agentCount`, `agents`, `professionals` | 👥 registered agents (name, agent number, dates), architects, engineers, accountants |
| `searchUrl`, `changeType`, `changes`, `scrapedAt` | the page of Start URLs the project was found through, `new` / `changed` with what changed (monitoring), ISO timestamp |

### 💡 Tips

#### How to get more results

Leave **RERA numbers** and **Start URLs** empty and set `maxItems` to `0`: the Actor goes through the whole registry, newest files first (a project may be registered a year after its file was opened: for the latest registrations, set `postedAfter`). Filters (`location`, `query`, statuses, dates) narrow it down; a project a filter drops costs only the filter fee.

#### How to reduce costs

The price is per project and per option: tick only the options you need (the apartments of a large project are hundreds of rows), cap the run with `maxItems`, and use `onlyNew` for recurring runs (you never pay twice for the same project).

#### From a listing to the registry

Paste the MagicBricks or 99acres page of a property, a project or a search: the Actor reads the RERA numbers printed on it and returns the registered projects. A search page is followed page after page; `maxItemsPerQuery` caps each page you paste.

#### Monitoring: only the new projects, or also the ones that changed

Tick **Only new projects** (`onlyNew`) and schedule the Actor. The first run returns everything; each later run skips the projects already delivered: they are not saved, not charged. With **Also projects that changed** (`alsoChanged`, on by default) a project already delivered comes back when a new complaint, court case or appeal was filed, its completion date was revised, its registration or certificate status changed, an agent was added or removed, or its units sold or % of work done moved — with `changeType: "changed"` and the list of `changes`, before and after. The memory lives in a named key-value store of your account (`maharera-projects-scraper-seen`, up to 150,000 projects per key) and is only updated with projects that really reached the dataset. Give each schedule its own `stateKey`, and tick `resetState` once to start over. Without `alsoChanged`, the projects you already have are skipped unread, and a registry scan without a date stops once it meets a long run of them: a project registered since whose file was opened long before (its id is then below them) is missed. To catch every new registration, add `postedAfter` (for example `30 days`): the scan then reads the whole period (see below), the projects you already have still skipped and free.

#### Filter by registration date

`postedAfter` and `postedBefore` take a date (`2026-01-01`, the whole day is included, India time) or a period before now (`30 days`, `6 months`; via the API also a full ISO date-time). The filter reads `registrationDate`; a project without one is dropped as soon as a date bound is set. The registry's order says little about dates: a project may be registered a year after its file was opened, so a registry scan with a date reads every project of the current MahaRERA portal (opened in mid-2025) and only stops at the old portal's projects when the period starts after November 2025; an earlier period reads the whole registry. A project out of the period is recognised from its registration date alone and costs the filter fee.

### 🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

### 🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the [Apify MCP server](https://mcp.apify.com), billed to their Apify account like any run. It returns one item per MahaRERA project. Actor id: `nice_dev/maharera-projects-scraper`; MCP server with this Actor only: `https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/maharera-projects-scraper`.

Smallest input, for a cheap first call:

```json
{
    "registrationNumbers": ["P51800028936"],
    "includeUnits": false,
    "includeAgents": false,
    "includeProfessionals": false,
    "maxItems": 1
}
```

Key output fields: `reraId`, `projectName`, `developer`, `district`, `registrationStatus`, `revisedCompletionDate`, `completionDelayDays`, `complaintCount`.

Cost: see the pricing section above. Cap each call with `maxItems` and, through the API, with the run option `maxTotalChargeUsd`.

### ❓ FAQ

#### Is it legal to scrape MahaRERA?

The Actor only reads what the MahaRERA public project pages show to any visitor: the registry is published by law (RERA Act, 2016) so that buyers can check a project. It needs no account of yours. The data holds names of developers, their directors, agents and professionals as the registry publishes them, protected by data protection law: do not store them without a legitimate reason. The names of private persons who filed a complaint are left out unless you ask for them. What the public pages mask (PAN, phone numbers, e-mails, bank accounts) is never returned. You are responsible for using the data in compliance with the registry's terms and applicable law. This Actor is not affiliated with MahaRERA or the Government of Maharashtra, nor with MagicBricks or 99acres.

#### Does it need a login or a proxy?

No login on your side, and no proxy needed: leave the default setting. MagicBricks / 99acres pages go through our own residential proxy, included in their price (the residential Apify proxy is not available). A request the site turns away is retried at once on a new proxy session, up to 10 times on top of the retries (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).

#### Is the data safe to open in Excel or to show on a web page?

Names, addresses and reasons are the developers' own words, copied as they are. A text can begin with `-`, `+`, `=` or `@`: Excel and Google Sheets may read such a cell of a CSV file as a formula. The Actor leaves the text as it is: when you open a CSV, import these columns as text. Every URL field holds an http(s) URL or null. On a web page, escape every field like any text written by a stranger.

#### Known limitations

- The registry has no search box: names and places are filters applied to every project read, so a filtered registry scan reads many projects to find a few (each one dropped costs the filter fee).
- Projects registered on the old portal (2017-2025) often have no apartments or agents declared: those fields are empty lists.
- Documents (certificates, orders, quarterly reports) are named with their date, not downloaded.
- A dossier still being filed (no RERA number yet) is not a registered project: it is skipped.
- Two runs sharing the same `stateKey` at the same time may both return the same new project.

**A run the platform stops without warning** (out of memory, run timeout)

- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the projects already saved are skipped: none is delivered or charged twice, and `maxItems` still counts them.
- With `onlyNew`, the memory is saved once a minute: resurrect the stopped run and the projects it had saved meanwhile join the memory; leave it stopped for good, and the next run may return up to a minute of them once more.

#### Something doesn't work?

The last line of the log counts the projects saved, filtered out and not found (a RERA number the registry does not know), and the requests that failed after every retry. Those requests and the numbers not found are listed, with the reason, in the `FAILED_REQUESTS` record of the run's key-value store. A part of a project the registry could not give after every retry (its complaints, its apartments) leaves the project saved without it — not charged for it — and is listed there too. A run that saved nothing and had failed requests fails, and its last message gives the cause.

If the registry changes its pages, you are told instead of paying for blank rows. If the first 20 projects read all lack their name, registration date, district, developer, type, status or registration status — or, with their option on, their buildings or professionals — or if one part of them fails on every call for all 20, the run saves nothing more, stops and fails, and its last message names what is missing: at most those first projects are charged. The projects a filter drops after reading them count among those 20 too (a project without a date under `postedAfter` / `postedBefore`, without a status under `projectStatuses`…). If the first 1,000 dossiers of a registry scan all come without a RERA number, the run stops and fails the same way instead of reading the whole registry for nothing.

### 🛟 Support

Open an issue in the **Issues** tab with a link to your run: the run log and the `FAILED_REQUESTS` record of the key-value store show exactly which projects failed and why.

# Actor input Schema

## `registrationNumbers` (type: `array`):

MahaRERA project numbers, one per line: `P51800028936` (P + 11 digits, until 2025) or `PR1260002502426` / `PM1170002501242` / `PC1260002602029` (P + a letter + 13 digits, since October 2025). Case and spaces are ignored. When this list or **Start URLs** is not empty, the registry is not scanned: only these projects are read. Max 10 000.

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

Pages that name a MahaRERA project: a MagicBricks or 99acres property, project or search page (every RERA number printed on it is read, pagination of a search page is followed), or a MahaRERA project page (`https://maharerait.maharashtra.gov.in/public/project/view/<id>`). Max 1 000 URLs.

## `query` (type: `string`):

Keep only the projects whose project name or developer name contains this text (case and accents ignored), e.g. `Lodha`. The registry has no search box: this filter is applied to every project read.

## `searchQueries` (type: `array`):

Several names in one run: a project is kept when it matches any of them. Added to **Name contains**.

## `location` (type: `string`):

District, taluka, village, locality or 6-digit PIN code of the project land, e.g. `Pune`, `Mumbai Suburban`, `Kharadi`, `411014` — whole names (`Wardha` does not find `Wardhaman Nagar`; the road a project is on, like `Pune Mumbai Highway`, does not count unless you type the road). Empty = all of Maharashtra (and Dadra & Nagar Haveli, Daman & Diu, also registered with MahaRERA).

## `locations` (type: `array`):

Several locations in one run: a project is kept when it is in any of them (and matches a name above, when names are given). Added to **Location**.

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

Maximum number of projects to save for the whole run (after filters). 0 = no limit (a full registry scan reads about 67 000 project files).

## `maxItemsPerQuery` (type: `integer`):

Cap for EACH start URL and for the registry scan, so that the first one cannot use up the whole **Max projects** budget. Names and locations filter the same scan: this cap is shared by all of them. 0 = no per-search cap.

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

Land and plan (area, FSI, planning authority, plot numbers), buildings (floors, units), every completion-date extension with its reason, construction progress (% of work done per building and per task), court cases, loans on the project (lender, secured amount), means of finance, project bank, developer company (office address, directors, CREDAI / NAREDCO membership). Off by default.

## `includeComplaints` (type: `boolean`):

Every complaint filed against the project at MahaRERA (number, date, type, status, order file and date) and every appeal at the Appellate Tribunal (number, date, status, parties). Off by default.

## `includeComplainantNames` (type: `boolean`):

Add the names of the private persons who filed a complaint or an appeal, and the file names of the orders (named after the parties), as shown by the registry. Off = these are left empty (companies, the developer first, are always named).

## `includeUnits` (type: `boolean`):

Apartment by apartment, as declared by the developer: building, floor, unit number, carpet area, agreement price and amount received for the sold and booked ones; ready-reckoner value for the unsold ones. Also gives the min / max / average sold price per sq ft. Large projects: several hundred rows. Off by default.

## `includeAgents` (type: `boolean`):

Real estate agents registered on the project: name, MahaRERA agent number (A5…), type (individual / company), registration and expiry dates. Off by default.

## `includeProfessionals` (type: `boolean`):

Professionals declared on the project: role, name, firm, Council of Architecture / licence / ICAI number. Off by default.

## `projectStatuses` (type: `array`):

Keep only these statuses. Empty = all.

## `registrationStatuses` (type: `array`):

Keep only projects in these registration states. Empty = all.

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

Keep only projects whose type contains one of these words, e.g. `Residential`, `Commercial`, `Mixed`, `Plotted`. Empty = all.

## `postedAfter` (type: `string`):

Only projects whose MahaRERA registration date is on or after this date: `2026-01-01`, or a period before now such as `30 days`, `6 months`. Projects not registered yet (no date) are dropped.

## `postedBefore` (type: `string`):

Only projects registered on or before this date (the whole day is included), or longer ago than a period such as `1 year`.

## `latitude` (type: `number`):

With **Around longitude** and **Radius**: keep only the projects within the radius of this point (decimal degrees, e.g. `18.5204`). Projects without GPS are dropped.

## `longitude` (type: `number`):

Decimal degrees, e.g. `73.8567`.

## `radiusKm` (type: `integer`):

Distance around the point, in km. 0 = no distance filter.

## `delayedOnly` (type: `boolean`):

Keep only the projects whose completion date the developer had pushed back (an extension it asked for). The 4-month extension MahaRERA gave to nearly every project in August 2026 (Order 66/2026) does not count as a delay.

## `withComplaintsOnly` (type: `boolean`):

Keep only the projects with at least one complaint at MahaRERA. The complaints are read for this check even when **Complaints and appeals** is off (then they are neither returned nor charged).

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

Drop the projects whose project name contains one of these words (case and accents ignored).

## `onlyNew` (type: `boolean`):

Skip the projects that a previous run (same **Memory key**) already delivered: they are not saved and not charged. First run = everything is new. A registry scan goes down from the newest files, but a file may be registered a year after it was opened: without **Also projects that changed**, set **Registered after** (e.g. `30 days`) so that the scan reads the whole period and misses no new registration.

## `alsoChanged` (type: `boolean`):

With **Only new projects**: also save a project already delivered when it changed since (new complaint, court case, appeal or extension, completion date revised, registration or certificate status, units sold, % of work done, agents). The result lists what changed, before and after.

## `stateKey` (type: `string`):

Name of the memory used by **Only new projects**. Give each schedule / task its own key (e.g. `pune-delayed`) so that they do not share their memory. Letters, digits, `-` and `_`.

## `resetState` (type: `boolean`):

Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every project again. Untick it afterwards.

## `projectIdFrom` (type: `integer`):

Registry scan only (no numbers and no start URLs given): lowest internal project id to read. Empty = 1.

## `projectIdTo` (type: `integer`):

Registry scan only: highest internal project id to read. Empty = up to the newest project (found at each run). The scan goes from the newest to the oldest.

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

Keep the default (no proxy): the MahaRERA registry is public and answers fastest directly. MagicBricks / 99acres pages always go through our own residential proxy, charged as an option. Your own proxies (custom URLs) are used for every request instead. The residential Apify proxy is not available in this Actor.

## `maxConcurrency` (type: `integer`):

Maximum number of requests processed in parallel. The registry slows down above 8-16.

## `maxRequestsPerMinute` (type: `integer`):

Most requests in any 60 seconds, all of them counted (one project with every option = about 25 requests). A budget, not an even pace: up to this many can leave at once when the minute starts (spread them with the minimum delay below). Lower it if the log shows HTTP 429 / 403.

## `minRequestIntervalMs` (type: `integer`):

Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.

## `maxRequestRetries` (type: `integer`):

Retries per request before it is marked as failed. Behind a proxy, a request the site turns away is also retried on a new proxy session up to 10 times without using up these retries.

## `debugLog` (type: `boolean`):

Include debug messages in the run log.

## Actor input object example

```json
{
  "registrationNumbers": [
    "P51800028936",
    "P51800004889"
  ],
  "startUrls": [],
  "searchQueries": [],
  "locations": [],
  "maxItems": 100,
  "maxItemsPerQuery": 0,
  "includeDetails": false,
  "includeComplaints": false,
  "includeComplainantNames": false,
  "includeUnits": false,
  "includeAgents": false,
  "includeProfessionals": false,
  "projectStatuses": [],
  "registrationStatuses": [],
  "propertyTypes": [],
  "radiusKm": 0,
  "delayedOnly": false,
  "withComplaintsOnly": false,
  "excludeKeywords": [],
  "onlyNew": false,
  "alsoChanged": true,
  "stateKey": "default",
  "resetState": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 8,
  "maxRequestsPerMinute": 600,
  "minRequestIntervalMs": 0,
  "maxRequestRetries": 5,
  "debugLog": false
}
```

# Actor output Schema

## `results` (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 = {
    "registrationNumbers": [
        "P51800028936",
        "P51800004889"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nice_dev/maharera-projects-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 = {
    "registrationNumbers": [
        "P51800028936",
        "P51800004889",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("nice_dev/maharera-projects-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 '{
  "registrationNumbers": [
    "P51800028936",
    "P51800004889"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call nice_dev/maharera-projects-scraper --silent --output-dataset

```

## MCP server setup

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