# MahaRERA Projects Scraper – Maharashtra RERA (`publicrows/maharera-projects`) Actor

Projects registered with MahaRERA (Maharashtra RERA) as clean rows: registration number, project, promoter, taluka, district, pincode, last modified, certificate links, plus status flags from the official lapsed, QPR-default, abeyance, NCLT and deregistered lists. Newest first.

- **URL**: https://apify.com/publicrows/maharera-projects.md
- **Developed by:** [PublicRows](https://apify.com/publicrows) (community)
- **Categories:** Real estate, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 95.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 project 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

## MahaRERA Projects Scraper – Maharashtra RERA

Projects registered with MahaRERA (Maharashtra RERA) as clean rows: registration number, project, promoter, taluka, district, pincode, last modified, certificate links, plus status flags from the official lapsed, QPR-default, abeyance, NCLT and deregistered lists. Newest first.

### Who this is for

Proptech teams, lenders, brokers, analysts and buyers' advisors who need Maharashtra's RERA registry as rows instead of pages: pull every new registration in a district each week, check a list of registration numbers against the lapsed, QPR-default, abeyance, NCLT and deregistered lists, or feed promoter and project names into a CRM.

### Sample output

```json
{
  "registration_number": "PR1260002602339",
  "registration_series": "PR",
  "project_name": "Wakad New Project- Tower 4",
  "promoter_name": "Lodha Developers Limited",
  "promoter_kind": "organisation",
  "location": "Mulshi",
  "district": "Pune",
  "state": "MAHARASHTRA",
  "pincode": "411057",
  "last_modified": "2026-10-15",
  "certificate_available": true,
  "extension_certificate": false,
  "internal_project_id": 67924,
  "detail_url": "https://maharerait.maharashtra.gov.in/public/project/view/67924",
  "original_application_url": "https://maharerait.maharashtra.gov.in/public/project/view/67924?isOriginal=true",
  "source_url": "https://www.maharera.maharashtra.gov.in/projects-search-result",
  "is_lapsed": false,
  "is_qpr_defaulter": false,
  "qpr_default_period": null,
  "is_abeyance_common_bank_account": false,
  "is_abeyance_authority_order": false,
  "is_nclt": false,
  "nclt_proposed_completion": null,
  "nclt_status": null,
  "is_deregistered": false,
  "deregistration_planning_authority": null,
  "status_flags": null
}
```

### What you get

One row per project. Every row also carries `_source` (attribution) and the recipe version.

| Field | Type |
| --- | --- |
| `registration_number` | string, always present |
| `registration_series` | string |
| `project_name` | string, always present |
| `promoter_name` | string, always present |
| `promoter_kind` | string |
| `location` | string |
| `district` | string, always present |
| `state` | string |
| `pincode` | string |
| `last_modified` | string |
| `certificate_available` | string |
| `extension_certificate` | string |
| `internal_project_id` | number |
| `detail_url` | url |
| `original_application_url` | url |
| `source_url` | string |
| `is_lapsed` | boolean (joined from the status lists; null when `includeStatusFlags` is off) |
| `is_qpr_defaulter` | boolean (joined from the status lists; null when `includeStatusFlags` is off) |
| `qpr_default_period` | string (joined from the status lists; null when `includeStatusFlags` is off) |
| `is_abeyance_common_bank_account` | boolean (joined from the status lists; null when `includeStatusFlags` is off) |
| `is_abeyance_authority_order` | boolean (joined from the status lists; null when `includeStatusFlags` is off) |
| `is_nclt` | boolean (joined from the status lists; null when `includeStatusFlags` is off) |
| `nclt_proposed_completion` | string (joined from the status lists; null when `includeStatusFlags` is off) |
| `nclt_status` | string (joined from the status lists; null when `includeStatusFlags` is off) |
| `is_deregistered` | boolean (joined from the status lists; null when `includeStatusFlags` is off) |
| `deregistration_planning_authority` | string (joined from the status lists; null when `includeStatusFlags` is off) |
| `status_flags` | string (joined from the status lists; null when `includeStatusFlags` is off) |

Rows come from the public registry index on maharera.maharashtra.gov.in, newest registrations first (the registry lists projects oldest first, 10 per page; the actor reads the last page first). `registration_series` tells the two numbering schemes apart: `P` for projects registered on the 2017–2026 portal, `PR`, `PM`, `PC` and `PP` for the MahaCRITI platform in use since 2025.

`promoter_name` is the registrant of record as MahaRERA publishes it; `promoter_kind` marks names that read as a firm (`organisation`) and leaves the rest `unclassified`. Real-estate agents and complaint parties are never collected. A few cards carry no promoter line at all; `promoter_name` is then null.

Status flags are joined by registration number from MahaRERA's own lists: `is_lapsed` (completion date lapsed), `is_qpr_defaulter` with `qpr_default_period` (quarterly progress report not filed), `is_abeyance_common_bank_account` (projects sharing a bank account), `is_abeyance_authority_order`, `is_nclt` with `nclt_proposed_completion` and `nclt_status`, and `is_deregistered` with `deregistration_planning_authority`. `status_flags` lists the names that apply. A flag is `null` when its list could not be read in that run.

What is left out on purpose: the per-project detail pages on the MahaCRITI platform (completion dates, units, costs, buildings, complaints, bank and litigation details, coordinates) sit behind a captcha and are never requested. `detail_url` and `original_application_url` point you there for a manual look.

Measured on 17 Oct 2026: a 50-row run with status flags takes two to three minutes and moves 0.56 MB through the Indian residential proxy. The registry serves blank result pages in streaks of up to a minute; the actor waits them out with a bounded backoff (about 2.5 minutes per run at most), logs a WARNING for any page that stayed blank, and a run that cannot read the registry at all fails instead of returning an empty dataset.

### Pricing

Pay per project: $0.0005 each ($0.50 per 1,000). The first 20 rows of every run are free, so a test costs nothing.

### How to run

1. Keep the defaults for the standard sample, or set the inputs (listed last, below).
2. Run. Results land in the dataset as JSON, CSV or Excel.
3. From code or an agent: call it through the API, or as an MCP tool via mcp.apify.com.

### Source and fair use

Data comes from Maharashtra Real Estate Regulatory Authority (MahaRERA), maharera.maharashtra.gov.in. The actor fetches public pages only, honours robots.txt, keeps a low request rate with an identified user agent, and returns structured facts, never copied text, images or reviews. No personal data of individuals is included.

### FAQ

**How fresh is the data?** Each run fetches live from the source.
**Can I get more fields?** Open an issue naming the field and where it appears at the source.
**Something broke?** Open an issue. Issues are answered within 12 hours.
**Found it useful?** A short review on this page helps other people find it, and tells us what to improve.

### Inputs

- `projectName`: Only projects whose name contains this text (the registry's own name filter, applied server-side). Empty = all.
- `location`: Only projects whose taluka or city on the registry card contains this text (comma-separated for several, e.g. "Kalyan, Panvel"), matched while reading newest first. Empty = all.
- `district`: Only projects in these districts (comma-separated, e.g. "Pune, Thane"), matched on each row's district while reading newest first. The registry has no working district filter of its own, so a narrow district needs more pages for the same number of rows.
- `registrationNumber`: One or more MahaRERA registration numbers (comma-separated, e.g. P51700000002, PM1272022500305) to look up. Empty = browse.
- `projectType`: Registered projects (the live registry) or projects whose registration was revoked.
- `modifiedSince`: Skip projects whose registry record was last modified before this date (YYYY-MM-DD). Empty = no date filter.
- `includeStatusFlags`: Join MahaRERA's public status lists (lapsed, quarterly-report defaulters, common bank account abeyance, abeyance by authority order, NCLT, deregistered) onto every row. Off = the index columns only, six requests fewer.
- `maxItems`: Stop after this many rows.

# Actor input Schema

## `projectName` (type: `string`):

Only projects whose name contains this text (the registry's own name filter, applied server-side). Empty = all.

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

Only projects whose taluka or city on the registry card contains this text (comma-separated for several, e.g. "Kalyan, Panvel"), matched while reading newest first. Empty = all.

## `district` (type: `string`):

Only projects in these districts (comma-separated, e.g. "Pune, Thane"), matched on each row's district while reading newest first. The registry has no working district filter of its own, so a narrow district needs more pages for the same number of rows.

## `registrationNumber` (type: `string`):

One or more MahaRERA registration numbers (comma-separated, e.g. P51700000002, PM1272022500305) to look up. Empty = browse.

## `projectType` (type: `string`):

Registered projects (the live registry) or projects whose registration was revoked.

## `modifiedSince` (type: `string`):

Skip projects whose registry record was last modified before this date (YYYY-MM-DD). Empty = no date filter.

## `includeStatusFlags` (type: `boolean`):

Join MahaRERA's public status lists (lapsed, quarterly-report defaulters, common bank account abeyance, abeyance by authority order, NCLT, deregistered) onto every row. Off = the index columns only, six requests fewer.

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

Stop after this many rows.

## Actor input object example

```json
{
  "projectName": "",
  "location": "",
  "district": "",
  "registrationNumber": "",
  "projectType": "0",
  "modifiedSince": "",
  "includeStatusFlags": true,
  "maxItems": 20
}
```

# Actor output Schema

## `rows` (type: `string`):

Dataset items, one per project (registration_number, registration_series, project_name, promoter_name, promoter_kind, location, district, state, pincode, last_modified, certificate_available, extension_certificate, internal_project_id, detail_url, original_application_url, source_url, is_lapsed, is_qpr_defaulter, qpr_default_period, is_abeyance_common_bank_account, is_abeyance_authority_order, is_nclt, nclt_proposed_completion, nclt_status, is_deregistered, deregistration_planning_authority, status_flags). Append ?format=csv or ?format=xlsx for other formats.

## `runSummary` (type: `string`):

Pages fetched, response classes, cost estimate and the quality-gate checks for this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("publicrows/maharera-projects").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("publicrows/maharera-projects").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 '{}' |
apify call publicrows/maharera-projects --silent --output-dataset

```

## MCP server setup

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

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/MQWSLwC8x0OOMkxh9/builds/saWp0jYpn9r0pnCFA/openapi.json
