# 99acres Property Scraper — Rent, Buy, PG & Commercial, India (`memo23/99acres-property-scraper`) Actor

Scrape 99acres.com property listings — rent, buy, PG & commercial. 50+ fields per result: price, BHK, carpet/super area, RERA, GPS, furnishing, amenities, images, dealer. Paste any search or property URL, or build from city + filters. Listings + new-launch projects.

- **URL**: https://apify.com/memo23/99acres-property-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate
- **Stats:** 1 total users, 0 monthly users, 33.3% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.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.

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

## 99acres Property Scraper — Rent, Buy, PG & Commercial 🏘️🇮🇳

Scrape property listings from **99acres.com**, India's largest real-estate portal, across all four sections — **rent, buy, paying-guest (PG) and commercial** — with 50+ structured fields per result including price, BHK, carpet & super area, locality, RERA ID, GPS coordinates, furnishing, amenities, images and the dealer/owner. Paste any 99acres search or property URL, or build a search from a city + filters. One flat row per result; new-launch builder projects are captured too.

![How the 99acres Property Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-99acres.png)

### Why use this 99acres scraper?

- **All four modes** — rent, buy, PG and commercial from one actor, any Indian city.
- **Three ways in** — paste search-results URLs, paste individual property URLs (`-spid-`) or project URLs (`-npxid-`), or build a search from **city + mode + filters** (BHK, price, area, property type). Mix them freely.
- **Listings *and* new-launch projects** — 99acres blends promoted builder projects into results; you get both, tagged with `resultType` so you can split them.
- **50+ fields per property** — not just a title and price: carpet/super area, RERA registration, GPS, furnishing, facing, amenities, dealer name, posting date and more.
- **Built-in India residential proxy** — no proxy setup, no captcha, no browser. Bundled at no extra cost to you.
- **Stable JSON parsing** — reads 99acres' embedded application state, not brittle page HTML, so it keeps working when the site restyles.
- **Any export** — JSON, CSV, Excel, or straight from the API. Billed per result.

### What it does

The 99acres Property Scraper turns any 99acres search or property page into clean, structured data. Point it at a city with filters, or paste the exact URLs you care about, and it returns one row per property (or project) ready for analysis, lead generation, price research, or feeding a downstream app.

### Supported inputs

| Input | What it does |
|-------|--------------|
| **Search / SRP URLs** | Any 99acres results page, e.g. `https://www.99acres.com/property-for-rent-in-bangalore-ffid`. Carries every on-site filter you applied. |
| **Property URLs** | Individual listing pages with a `-spid-` token. |
| **Project URLs** | New-launch project pages with a `-npxid-` token. |
| **City + Search mode** | `Bangalore` + `rent` / `buy` / `pg` / `commercial` → the scraper builds the search URL. |
| **Filters** | BHK, min/max price (INR), min/max area (sq ft), property types — applied by the city builder. |

### Use cases

- **Real-estate lead generation** — pull dealer/owner listings by city and locality for outreach.
- **Price & market research** — track asking prices, price-per-sqft and inventory across localities.
- **Rental market analysis** — monitor rent levels by BHK, furnishing and tenant preference.
- **New-launch tracking** — capture builder projects, possession status and price ranges.
- **PG / co-living intelligence** — scrape paying-guest inventory and pricing.
- **Property portals & apps** — seed a comparison site or CRM with normalized listing data.

### How it works

1. **Fetch** — requests route through India residential IPs with a real browser TLS fingerprint, so 99acres returns the true page instead of a 403 or a "warden" soft-shell.
2. **Parse** — the actor reads the embedded `window.__initialData__` application state (JSON), not the page DOM, and maps each listing or project to a flat row.
3. **Paginate & enrich** — search results paginate through the `-page-N` path; optionally each listing's detail page is fetched for the full amenities list, description and spec table.
4. **Emit** — one deduplicated row per result, charged once as a `result` event, exported to your dataset.

### Input configuration

| Field | Type | Description |
|-------|------|-------------|
| `startUrls` | array | 99acres search / property / project URLs, auto-classified. |
| `city` | string | City for the builder, e.g. `Bangalore`, `Mumbai`, `New Delhi`, `Pune`. |
| `searchMode` | select | `buy` · `rent` · `pg` · `commercial`. |
| `saleType` | select | **Buy mode only.** `resale` (default) — individual resale listings, deep clean pagination; `new-booking` — under-construction / new-launch; `all` — the resale + projects blend. |
| `bedrooms` | array | BHK filter, e.g. `["2","3"]`. |
| `propertyTypes` | array | `apartment`, `villa`, `plot`, `office`, … (or 99acres codes). |
| `minPrice` / `maxPrice` | integer | Price in INR (monthly rent for rent/PG; total for buy/commercial). |
| `minArea` / `maxArea` | integer | Area in sq ft. |
| `includeProjects` | boolean | Include promoted new-launch projects (default `true`). |
| `scrapeDetails` | boolean | Fetch each listing's detail page for richer fields (default `false`). |
| `maxItems` | integer | Hard cap on rows for the whole run. |
| `maxItemsPerSearch` | integer | Cap per search URL / city build. |
| `enrichEmails` | boolean | Best-effort contact email for dealer/builder listers (experimental). |

#### Example input

```json
{
  "city": "Bangalore",
  "searchMode": "rent",
  "bedrooms": ["2", "3"],
  "minPrice": 20000,
  "maxPrice": 60000,
  "includeProjects": true,
  "scrapeDetails": false,
  "maxItems": 500
}
```

### Output overview

One row per result. `resultType` is `"listing"` for an individual resale/rental listing or `"project"` for a promoted new-launch project.

#### Output sample (listing)

```json
{
  "resultType": "listing",
  "listingId": "V92545782",
  "spid": "92545782",
  "searchMode": "rent",
  "title": "2 BHK Flat for rent in Tumkur Road, Bangalore",
  "propertyType": "Residential Apartment",
  "transactionType": "Rent",
  "bedrooms": 2,
  "bathrooms": 2,
  "price": 32000,
  "priceDisplay": "32,000",
  "pricePerSqft": 26,
  "area": 1204,
  "areaUnit": "sqft",
  "areaType": "Super Built-up Area",
  "furnishing": "Semi-Furnished",
  "locality": "Tumkur Road, Bangalore",
  "city": "Bangalore West",
  "latitude": 13.044152,
  "longitude": 77.500744,
  "projectName": "Sobha Ruby",
  "reraId": "PRM/KA/RERA/1251/…",
  "listedBy": "Dealer",
  "dealerName": "Youngstar Groups",
  "amenities": ["Private Garden", "Corner Property", "Power Back-up"],
  "images": ["https://imagecdn.99acres.com/…"],
  "url": "https://www.99acres.com/…-spid-V92545782",
  "postedDate": "2026-07-09T12:29:28.000Z"
}
```

#### Key output fields

| Field | Description |
|-------|-------------|
| `resultType` | `listing` or `project` |
| `listingId` / `spid` | 99acres property id / numeric SPID |
| `title`, `propertyType`, `transactionType` | Headline, type, Sale/Rent/PG |
| `bedrooms`, `bathrooms`, `balconies` | Configuration |
| `price`, `priceMax`, `priceDisplay`, `pricePerSqft` | Price in INR + display string |
| `deposit`, `brokerage`, `bookingAmount` | Money extras |
| `area`, `areaUnit`, `areaType`, `superArea`, `carpetArea` | Areas |
| `furnishing`, `facing`, `floor`, `totalFloors`, `ageOfProperty` | Unit attributes |
| `availability`, `possessionDate` | Ready-to-move / under-construction |
| `locality`, `city`, `latitude`, `longitude` | Location + GPS |
| `projectName`, `buildingName`, `builderName` | Society / project / builder |
| `reraId`, `reraRegistered` | RERA registration |
| `listedBy`, `dealerName`, `companyName` | Owner / Dealer / Builder |
| `amenities`, `topUsps`, `tenantPreference` | Highlights |
| `images`, `imageCount`, `description` | Media + text |
| `url`, `postedDate`, `updatedDate` | Canonical URL + dates |

With `scrapeDetails: true`, listing rows also get `fullDescription`, a full readable `amenities` list, `specification` (facing, flooring, power, water…) and `advertiser` details.

### FAQ

**Does it work for every Indian city?**
Yes — pass any city name to the builder, or paste a city's 99acres search URL.

**What's the difference between a listing and a project row?**
A `listing` is a specific resale or rental unit posted by an owner/dealer. A `project` is a promoted new-launch by a builder (price range, possession status, config). Set `includeProjects: false` to get listings only.

**Do I need my own proxies?**
No. India residential proxies are built in at no extra cost. You can override with the optional `proxy` field.

**How many results per search?**
Rent, PG and commercial searches paginate deeply. For buy, the default `saleType: resale` returns only individual resale listings and paginates just as deeply (tens of thousands per city) — no project cards. Set `saleType: all` to get the 99acres blend (resale listings first, then promoted new-launch projects), or `saleType: new-booking` for under-construction inventory only.

**Is scraping 99acres legal?**
The actor collects only publicly available data. You are responsible for using the output in line with 99acres' terms and applicable laws (see Disclaimer).

### Support

Found a bug or need a field added? Open an issue on the actor's **Issues** tab and we'll take a look.

### Additional services

Need contact emails for dealers/builders? Toggle `enrichEmails` for best-effort email discovery on business listings.

### Explore more scrapers

- **MagicBricks Property Scraper** — the other big Indian property portal.
- Ask for any Indian real-estate, jobs, or business-directory site — we build fast.

### 🤖 For AI agents & LLM apps

This actor returns clean, flat JSON — ideal for RAG pipelines, real-estate agents and market-analysis tools. Each row is self-describing (`resultType`, typed price/area/geo fields), so an LLM can filter and reason over results with no post-processing. Call it via the Apify API or MCP and stream the dataset straight into your context.

### ⚠️ Disclaimer

This actor scrapes only publicly accessible information from 99acres.com. It does not bypass logins or access private data. You are solely responsible for how you use the collected data, including compliance with 99acres' Terms of Use, applicable data-protection laws (and any local real-estate regulations). This actor is not affiliated with, endorsed by, or connected to 99acres.com or Info Edge (India) Ltd.

### SEO Keywords

99acres scraper, 99acres api, 99acres data extractor, scrape 99acres, 99acres property scraper, India real estate scraper, 99acres rent scraper, 99acres buy listings, 99acres PG scraper, 99acres commercial property, property data India, real estate lead generation India, BHK price data, RERA data scraper, 99acres listings export, India property portal scraper, 99acres crawler, real estate market research India.

# Actor input Schema

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

99acres search-results URLs and/or direct property URLs, auto-classified. A search URL carries every filter you applied on the site (locality, budget, area, furnishing, posted-by, …), so paste a filtered URL for filters the builder below doesn't expose. Examples — search: `https://www.99acres.com/property-for-rent-in-bangalore-ffid`; listing: `https://www.99acres.com/...-spid-O92269270`; project: `https://www.99acres.com/...-npxid-r442002`.

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

City name, e.g. `Bangalore`, `Mumbai`, `New Delhi`, `Pune`, `Gurgaon`, `Hyderabad`. Resolved by 99acres to its internal city.

## `searchMode` (type: `string`):

Which 99acres section the city builder searches: properties to buy, to rent, paying-guest (PG) accommodation, or commercial property.

## `saleType` (type: `string`):

For Buy mode only: 99acres blends promoted new-launch builder projects into buy results. `Resale only` (default) returns individual resale listings and paginates deeply and cleanly — recommended when you want lots of resale properties. `New booking` returns under-construction / new-launch inventory. `All` returns the unfiltered blend (resale listings on page 1, then mostly projects). Ignored for Rent / PG / Commercial.

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

BHK filter for the city builder, e.g. `2`, `3`. Multiple values are OR-combined. Leave empty for all. Ignored for PG.

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

Property-type filter for the city builder. Friendly names accepted: `apartment`, `independent-house`, `villa`, `builder-floor`, `plot`, `farm-house`, `studio`, `office`, `shop`, `showroom`, `warehouse`, `commercial-land`. Leave empty for all.

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

Minimum price for the city builder, in rupees. For rent/PG this is monthly rent (e.g. 20000); for buy/commercial it is total price (e.g. 5000000 = ₹50 Lac).

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

Maximum price for the city builder, in rupees. For rent/PG this is monthly rent (e.g. 60000); for buy/commercial it is total price (e.g. 10000000 = ₹1 Cr).

## `minArea` (type: `integer`):

Minimum built-up / carpet area in square feet for the city builder.

## `maxArea` (type: `integer`):

Maximum built-up / carpet area in square feet for the city builder.

## `includeProjects` (type: `boolean`):

99acres blends promoted new-launch builder projects into buy search results. Keep on to capture them as rows (tagged `resultType: "project"` — builder name, price range, possession status, config). Turn off to return only individual resale/rental listings.

## `scrapeDetails` (type: `boolean`):

Also fetch each listing's detail page to enrich the row with the full readable amenities list, full description, furnishing, facing and a spec overview. Richer rows, but ~2× the requests (slower). Off = listing-only (already ~50 fields per property).

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

Hard cap on result rows across the entire run. Each row is one paid `result` event. Default 1000. Free-tier users are additionally capped at 100.

## `maxItemsPerSearch` (type: `integer`):

Cap per search URL / city build. 99acres paginates ~25 results per page. Default 1000.

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

Parallel HTTP requests. Keep this moderate (4–8) to stay under 99acres' rate limits. Default 5.

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

Per-request retry budget on blocks (403), 429, soft-block shells and network errors. Each retry rotates to a fresh India residential IP across two pools. Default 12.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in India residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each dealer/builder listing from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort; skipped for owner listings.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.99acres.com/property-for-rent-in-bangalore-ffid"
  ],
  "city": "Bangalore",
  "searchMode": "buy",
  "saleType": "resale",
  "bedrooms": [],
  "propertyTypes": [],
  "includeProjects": true,
  "scrapeDetails": false,
  "maxItems": 1000,
  "maxItemsPerSearch": 1000,
  "maxConcurrency": 5,
  "maxRequestRetries": 12,
  "enrichEmails": 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 = {
    "startUrls": [
        "https://www.99acres.com/property-for-rent-in-bangalore-ffid"
    ],
    "bedrooms": [],
    "propertyTypes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/99acres-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 = {
    "startUrls": ["https://www.99acres.com/property-for-rent-in-bangalore-ffid"],
    "bedrooms": [],
    "propertyTypes": [],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/99acres-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 '{
  "startUrls": [
    "https://www.99acres.com/property-for-rent-in-bangalore-ffid"
  ],
  "bedrooms": [],
  "propertyTypes": []
}' |
apify call memo23/99acres-property-scraper --silent --output-dataset

```

## MCP server setup

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