# 99acres Scraper \[Only $1.5/1k💰] | Rent, Buy, PG & Commercial (`ahmed_jasarevic/99acres-scraper`) Actor

Scrape sale and rental property listings from 99acres.com — India's largest real estate portal. Get price in INR lakh/crore, BHK, area, locality + GPS coordinates, amenities, RERA ID, builder/agent contact, photos and verification status for market research and price monitoring.

- **URL**: https://apify.com/ahmed\_jasarevic/99acres-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.47 / 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/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

## 99acres Scraper — Indian Property Listings, Prices & RERA Data

Scrape **sale and rental property listings from [99acres.com](https://www.99acres.com)** — India's largest real estate portal — for **Indian property price monitoring, real estate market research and investment analysis**: INR price (lakh/crore), BHK, area, locality + GPS coordinates, amenities, RERA ID, builder/agent category, photos and verification status, at **$1.5 per 1,000 results**.

### Main Use Cases

- **Indian property price monitoring** — track sale and rental prices (INR lakh/crore and price per sqft) by city and locality over time for dashboards and reports.
- **Real estate market research** — analyze inventory, pricing, furnishing and project distributions across Mumbai, Bengaluru, Delhi NCR, Pune, Hyderabad and Chennai.
- **Real estate investment research** — pull GPS coordinates, RERA registration status and builder details for compliance and valuation workflows.
- **RERA-registered property data** — extract RERA IDs and verification flags where published, for due-diligence and pre-launch research.
- **Competitor & portal tracking** — compare 99acres inventory and pricing against MagicBricks, Housing.com and NoBroker listings.
- **PropTech & lead databases** — build structured property datasets with builder/agent listing categories for outreach and product feeds.

### How It Works

A **CheerioCrawler** (plain HTTP, no browser) reads the structured data that 99acres embeds directly in its served HTML — **JSON-LD blocks** (property type, name, address, geo coordinates, floor size, rooms) plus an **embedded page-state JSON blob** (price in words, min/max price, bedroom/bathroom counts, latitude/longitude, RERA ID, furnishing label, project name, locality, verification flag). Both are merged into one record per listing — fast, cheap on compute units, and resilient to layout changes. Because 99acres is protected by Akamai and blocks datacenter IPs, the crawler routes through the **Apify residential proxy (India)**, which the actor enables by default.

### Track Property Prices in India Without an Official API

99acres has no public developer API for listings. This actor fills that gap with a per-result API: enter **Indian cities** (or paste full 99acres search URLs to preserve the portal's own filters — locality, BHK, budget, furnishing), choose **`sale` or `rent`**, and get a structured dataset back — downloadable as JSON, CSV, Excel or HTML, or pulled programmatically through the **Apify API**. For price monitoring, schedule **daily or weekly runs** and diff `price`, `pricePerSqft` and `postedAt` over time; push new listings to your pipeline via **webhooks, Zapier or Make**.

### Input

| Field | Type | Required | Default | Notes |
|-------|------|----------|---------|-------|
| `searchUrls` | array<string> | No | `[]` | Complete 99acres search-result URLs. Overrides city/transaction fields and preserves the portal's locality/BHK/type/furnishing/budget filters. |
| `cities` | array<string> | No | `["Mumbai"]` | Indian city names to search when no URLs are given (e.g. Mumbai, Bengaluru, Pune, Delhi, Chennai, Hyderabad, Kolkata, Ahmedabad). |
| `transactionType` | string | No | `sale` | `sale` or `rent`. |
| `maxItems` | integer | No | `100` | Maximum listings to save. Free users are capped at 10 per run. |
| `maxConcurrency` | integer | No | `15` | Search pages fetched in parallel. Lower it if you see blocks or rate limiting. |
| `proxyConfiguration` | object | No | `{ "useApifyProxy": true }` | Keep the Apify proxy ON and prefer the Residential group — 99acres blocks datacenter IPs. |
| `proxyCountry` | string | No | `IN` | Proxy country hint. `IN` is recommended so pages are served with the Indian locale. |

### Output

Each dataset item is one property listing. Example:

```json
{
  "source": "99acres",
  "transactionType": "sale",
  "cityQuery": "Mumbai",
  "propertyId": "H91004828",
  "title": "3 BHK Flat in Sewri, Mumbai",
  "propertyType": "Apartment",
  "bhk": 3,
  "price": 63200000,
  "priceDisplay": "INR 6.32 Crore",
  "pricePerSqft": 31041,
  "area": 2036,
  "areaUnit": "sqft",
  "areaType": "Super Built-up Area",
  "bedrooms": 3,
  "bathrooms": 3,
  "furnishing": "Unfurnished",
  "status": "Under construction",
  "floor": "16",
  "projectName": "Lodha Aureus, Sewri",
  "locality": "Sewri, Mumbai",
  "city": "Mumbai South",
  "address": "Lodha Aureus, Sewri, Sewri, Mumbai, Mumbai South, India",
  "latitude": 19.000645,
  "longitude": 72.854859,
  "listedBy": "Builder",
  "verified": true,
  "featured": false,
  "postedAt": "2026-04-21",
  "reraId": "P51800012345",
  "amenities": ["Lift", "Security", "Power Backup"],
  "imageUrl": "https://imagecdn.99acres.com/media1/...jpg",
  "imageUrls": ["https://imagecdn.99acres.com/media1/...jpg"],
  "imagesCount": 1,
  "propertyUrl": "https://www.99acres.com/3-bhk-bedroom-apartment-flat-for-sale-in-sewri-south-mumbai-2036-sqft-spid-H91004828",
  "searchUrl": "https://www.99acres.com/property-in-mumbai-ffid",
  "resultPosition": 1,
  "description": "Spacious 3 BHK ...",
  "scrapedAt": "2026-06-12T19:55:25.019Z"
}
```

#### Field reference

| Field | Description |
|-------|-------------|
| `price` / `priceDisplay` | Numeric INR price and display text (lakh/crore). |
| `pricePerSqft` | Normalized price per square foot. |
| `bhk` / `bedrooms` / `bathrooms` | Configuration and room counts. |
| `area` / `areaUnit` / `areaType` | Size and area type (carpet / built-up / super built-up). |
| `locality` / `city` / `address` | Location hierarchy. |
| `latitude` / `longitude` | GPS coordinates when published. |
| `amenities` | Detected amenities (lift, security, power backup, etc.). |
| `reraId` | RERA registration ID when published. |
| `listedBy` | `Owner` / `Agent` / `Builder` — the listing category (no phone numbers, by design). |
| `verified` / `featured` | Verification and featured markers. |
| `status` / `furnishing` / `floor` / `totalFloors` / `facing` / `parking` | Unit-level details when published. |
| `imageUrl` / `imageUrls` / `imagesCount` | Photo gallery. |
| `propertyUrl` | Direct link to the listing. |

### Example Input

```json
{
  "cities": ["Mumbai", "Bengaluru", "Pune"],
  "transactionType": "sale",
  "maxItems": 300
}
```

To preserve the portal's own filters, paste full search URLs instead:

```json
{
  "searchUrls": [
    "https://www.99acres.com/property-in-mumbai-ffid",
    "https://www.99acres.com/3-bhk-flats-in-bangalore-ffid"
  ],
  "maxItems": 100
}
```

### Integrations & Automation

- **Apify API** — run the actor and pull datasets programmatically; the cheapest per-result data feed for 99acres listings.
- **Webhooks / Zapier / Make** — route new listings to your CRM, dashboard or Slack.
- **Scheduling** — schedule daily price-monitoring runs and weekly rental tracking; recurring use also improves Apify Store recommendations for this actor.

### Related Actors

- [99acres Property Search Scraper (stealth\_mode)](https://apify.com/stealth_mode/99acres-property-search-scraper) — the most-used 99acres scraper on the Store (250 users).
- [99acres Scraper — Fast & Reliable (fatihtahta)](https://apify.com/fatihtahta/99acres-scraper-ppe) — the other high-traffic 99acres scraper (245 users).
- [99acres Property Scraper — Rent, Buy, PG & Commercial (memo23)](https://apify.com/memo23/99acres-property-scraper) — listings plus new-launch projects, $2.5/1K.
- [99acres Scraper (gauzy\_penguin)](https://apify.com/gauzy_penguin/99acres-scraper) — production-grade 99acres listings.
- [99acres Data Scraper (datablow)](https://apify.com/datablow/99acres-data-scraper) — locality reviews and historical price trends.
- Related property portals: [MagicBricks scraper](https://apify.com/search-actors?keywords=magicbricks), [Housing.com scraper](https://apify.com/search-actors?keywords=housing.com), [NoBroker scraper](https://apify.com/search-actors?keywords=nobroker).

### FAQ

#### Why use this actor instead of an official 99acres API?

99acres does not offer a public developer API for listing data. This actor reads the **publicly served listing pages** via the residential proxy and returns the same structured fields — price, BHK, area, GPS, RERA ID, amenities — as a per-result API, with no per-listing browser overhead.

#### What are alternatives to this actor?

- Other 99acres scrapers on Apify (see Related Actors — note their typical rates: $2.5–$3.5 per 1,000 results vs **$1.5 per 1,000 here**).
- Third-party "99acres API" resellers (subscription-based, charge per call).
- For other Indian portals: MagicBricks, Housing.com, NoBroker scrapers (see Related Actors).

#### How can I monitor property prices in Mumbai over time?

Run the actor with `cities: ["Mumbai"]`, `transactionType: "sale"`, and schedule a daily or weekly task. Compare `price` and `pricePerSqft` across result positions and dates; `postedAt` tells you when each listing appeared.

#### Does this actor extract RERA IDs and verified listings?

Yes — `reraId` and `verified` are returned whenever 99acres publishes them for a listing (some listings don't publish them — those come back `null`/`false`, which is not an error).

#### Why does 99acres need the residential proxy?

99acres is protected by Akamai and rejects datacenter IPs. The actor enables `useApifyProxy` with country `IN` by default — keep it ON or runs will fail.

#### How much does it cost to scrape 99acres?

The actor runs at 256 MB on plain HTTP, so compute is minimal; the main driver is the residential proxy. Result pricing is **$1.5 per 1,000 results** on the free tier (less on higher tiers). Free-plan users get a capped preview of 10 listings per run.

#### Is this affiliated with 99acres?

No. This is an independent tool for lawful collection of publicly available property data. Phone numbers are not extracted (only the seller category / builder name). You are responsible for complying with 99acres' terms, robots.txt and applicable laws including India's DPDP Act.

### Competitive Positioning

| Capability | Other 99acres scrapers | This actor |
|---|---|---|
| Price per 1,000 results | $2.50–$3.50 (stealth\_mode $2.5, memo23 $2.5, fatihtahta $3.49, gauzy\_penguin $3.5) | **$1.50** (free tier) |
| Extraction method | Browser/production crawlers vary | Plain-HTTP JSON-LD + page-state parsing (no browser) |
| City/transaction quick-start | Requires portal URLs or complex filters on several actors | `cities` + `transactionType` (`sale`/`rent`) in one call |
| RERA ID + verification flag | Only some actors (e.g. memo23) | Included: `reraId`, `verified`, `featured` |

### SEO Keywords

99acres scraper, 99acres api alternative, indian property data, indian real estate listings, property prices india, property price monitoring india, rental price monitoring india, mumbai property listings, mumbai flats for sale, bengaluru property listings, delhi ncr property listings, pune real estate data, hyderabad property data, chennai property listings, rera registered properties, rera id data, property price per sqft, bhk flats for sale india, commercial property listings india, real estate market analysis india, real estate investment research india, proptech data provider

### For AI Agents & LLM Apps

**Purpose:** Returns one JSON record per property listing from 99acres for given Indian cities (or search URLs) and transaction type, with price (INR), BHK, area, GPS, RERA ID, amenities and verification.

**Minimal input:**

```json
{ "cities": ["Mumbai"], "transactionType": "sale", "maxItems": 10 }
```

**Variant input (search URLs override city/transaction):**

```json
{ "searchUrls": ["https://www.99acres.com/property-in-mumbai-ffid"], "maxItems": 10 }
```

**Output fields (main):** `title`, `propertyType`, `bhk`, `bedrooms`, `bathrooms`, `price`, `priceDisplay`, `pricePerSqft`, `area`, `areaUnit`, `areaType`, `furnishing`, `status`, `locality`, `city`, `address`, `latitude`, `longitude`, `listedBy`, `verified`, `featured`, `reraId`, `amenities`, `postedAt`, `imageUrls`, `imagesCount`, `propertyUrl`, `searchUrl`, `propertyId`, `resultPosition`, `description`, `scrapedAt`, `source`, `transactionType`, `cityQuery`.

**Behaviors an agent should know:**

- `searchUrls`, when provided, **overrides** `cities` and `transactionType` entirely.
- `maxItems` caps billed results and is required to bound cost; free runs are capped at 10 listings.
- Keep `proxyConfiguration.useApifyProxy: true` (default) — without the residential proxy, 99acres blocks requests and the run fails.
- `listedBy` is `Owner`/`Agent`/`Builder` — **no phone numbers** are returned by design.
- `reraId`, `latitude`/`longitude`, `verified` etc. are `null` when 99acres doesn't publish them for a listing.
- Billing is pay-per-result: **$1.5 per 1,000 results** (free tier).

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by 99acres.com / Info Edge (India) Ltd**. It accesses only publicly available 99acres listing pages via a residential proxy — it does not bypass login walls, solve CAPTCHAs, or access non-public data, and it intentionally does not extract contact phone numbers. Users are responsible for complying with 99acres' Terms of Service, robots.txt and applicable law, including India's Digital Personal Data Protection (DPDP) Act, and for how they use the property data obtained. This summary is not legal advice.

# Actor input Schema

## `searchUrls` (type: `array`):

Optional. Paste complete 99acres search-result URLs to preserve the portal's locality, BHK, property type, furnishing, budget, and posted-by filters. When supplied, these override the city/transaction fields.

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

City names to search when no search URLs are provided. Examples: Mumbai, Bengaluru, Pune, Delhi, Chennai, Hyderabad.

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

Choose sale listings or rental listings.

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

Maximum number of property listings to save. Free users are capped at 10.

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

Number of search pages to fetch in parallel. Higher values scrape faster by hiding per-request latency, but may increase the chance of being rate-limited or blocked by 99acres. Lower it if you see blocks.

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

Select proxies to be used by the crawler. 99acres blocks datacenter IPs, so keep the Apify proxy enabled and prefer the Residential group.

## `proxyCountry` (type: `string`):

Country code used as a hint for the Apify proxy. India (IN) is recommended for 99acres because many listings and pages are served based on the Indian locale.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.99acres.com/property-in-mumbai-ffid"
  ],
  "cities": [
    "Mumbai",
    "Bengaluru",
    "Pune"
  ],
  "transactionType": "sale",
  "maxItems": 100,
  "maxConcurrency": 15,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "proxyCountry": "IN"
}
```

# 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 = {
    "searchUrls": [],
    "cities": [
        "Mumbai"
    ],
    "transactionType": "sale",
    "maxItems": 100,
    "maxConcurrency": 15,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "proxyCountry": "IN"
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/99acres-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 = {
    "searchUrls": [],
    "cities": ["Mumbai"],
    "transactionType": "sale",
    "maxItems": 100,
    "maxConcurrency": 15,
    "proxyConfiguration": { "useApifyProxy": True },
    "proxyCountry": "IN",
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/99acres-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 '{
  "searchUrls": [],
  "cities": [
    "Mumbai"
  ],
  "transactionType": "sale",
  "maxItems": 100,
  "maxConcurrency": 15,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "proxyCountry": "IN"
}' |
apify call ahmed_jasarevic/99acres-scraper --silent --output-dataset

```

## MCP server setup

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