# 99acres Scraper: India Property Price Monitor (`themineworks/99acres-scraper`) Actor

Scrape 99acres.com property listings across any Indian city. Extract price, BHK, area, locality, furnishing, RERA ID, coordinates & listing URL for rent, buy, PG & commercial. No login, no API key. Filter by BHK and price range.

- **URL**: https://apify.com/themineworks/99acres-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Real estate, Lead generation, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 99acres listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

# README

## 99acres Scraper: India Rent, Buy, PG & Commercial Property Listings

### Overview

99acres Scraper turns any Indian city into a clean, structured feed of property listings from 99acres.com. Give it a city like `Bangalore`, pick a listing type (rent, buy, PG, or commercial), and it returns ready-to-use records: title, BHK, price, area, locality, furnishing, RERA ID, map coordinates, and the direct listing URL. No login, no 99acres account, no API key.

It is a pay-as-you-go alternative to manual copy-paste research and expensive real-estate data feeds. You pay only for the listings you actually keep.

No login required. No API key. Pay only for listings returned. MCP ready for AI agents.

Reliability: blocked, empty, or failed searches are never charged. You only pay for listings actually delivered to your dataset.

### Features

Any city, any type. Rent, buy, PG or guest house, and commercial listings across every 99acres city.
Structured JSON out. Price, BHK, bathrooms, area in sqft, locality, furnishing, RERA ID, and coordinates as clean fields.
BHK and price filtering. Pull only the configurations and budgets you care about.
Map ready. Latitude and longitude on every listing that has them, for plotting or geo analysis.
RERA transparency. The RERA registration ID is captured wherever the listing carries one.
No seat license. No subscription, no monthly minimum, no broker account.

### How it works

99acres serves fully server-rendered search pages with the entire results payload embedded in the HTML as a JSON blob. This scraper fetches that page over plain HTTP through an Indian residential proxy and reads the structured data straight from the source. There is no browser automation and no third-party unblocker, which keeps runs fast and cheap.

For each city and listing type it walks the paginated search results, normalizes every raw record into a consistent shape, and applies your BHK and price filters. Pagination stops automatically when 99acres returns an empty page, so you never need to know the last page number in advance. Only fields genuinely present on the listing are included, so records stay clean and null-free.

### Input configuration

```json
{
  "city": "Bangalore",
  "listingType": "rent",
  "bhk": "2,3",
  "minPrice": 20000,
  "maxPrice": 60000,
  "maxResults": 50
}
```

| Field | Type | Description |
| --- | --- | --- |
| `city` | string | Indian city to search (e.g. `Bangalore`, `Hyderabad`, `Mumbai`, `Pune`, `Gurgaon`, `Delhi`). Required. |
| `listingType` | enum | `rent`, `buy`, `pg`, or `commercial`. Defaults to `rent`. |
| `bhk` | string | Optional BHK filter. Comma separate for multiple, e.g. `2` or `2,3`. |
| `minPrice` | integer | Optional minimum price (monthly rent for rent/PG, total for buy/commercial). |
| `maxPrice` | integer | Optional maximum price. |
| `maxResults` | integer | Max listings to return. Defaults to 50. |

### Output format

```json
{
  "spid": "92187302",
  "title": "1 BHK Flat for rent in Sarjapur, Bangalore",
  "listing_type": "rent",
  "property_type": "Residential Apartment",
  "bhk": 1,
  "bathrooms": 1,
  "price": 28000,
  "price_label": "28,000",
  "price_unit": "per month",
  "area_sqft": 666,
  "area_type": "SUPERBUILTUP_AREA",
  "locality": "Sarjapur, Bangalore",
  "city": "Bangalore East",
  "society": "Eden Park at The Prestige City",
  "furnishing": "Semifurnished",
  "tenant_type": "FOR SINGLE MEN, FOR SINGLE WOMEN",
  "amenities": ["18th out of 28 Floors", "East Facing", "Full Power Backup", "Newly Constructed"],
  "latitude": 12.8782876,
  "longitude": 77.7740932,
  "rera_id": "prm/ka/rera/1265/343/ag/230105/003811",
  "floor": "18",
  "total_floors": "28",
  "age_years": "6",
  "posted_on": "02nd Jul, 2026",
  "verified": true,
  "photo_url": "https://imagecdn.99acres.com/media1/39293/0/785860604T-1782816773567.jpg",
  "listing_url": "https://www.99acres.com/1-bhk-bedroom-apartment-flat-for-rent-in-eden-park-at-the-prestige-city-sarjapur-bangalore-east-666-sqft-spid-Q92187302",
  "scraped_at": "2026-07-14T10:32:00.000Z"
}
```

Every listing record can contain these fields (null or absent fields are omitted):

| Field | Description |
| --- | --- |
| `spid` | 99acres property ID |
| `title` | Listing heading |
| `listing_type` | rent, buy, pg, or commercial |
| `property_type` | Residential Apartment, Independent House/Villa, Builder Floor, etc. |
| `bhk` | Number of bedrooms |
| `bathrooms` | Number of bathrooms |
| `price` | Price in INR (monthly for rent/PG, total for buy/commercial) |
| `price_label` | Formatted price string |
| `price_unit` | `per month` or `total` |
| `area_sqft` | Area in square feet |
| `area_type` | Which measure the area refers to (super built-up, carpet, etc.) |
| `locality` | Locality or neighbourhood |
| `city` | City or city zone as labelled by 99acres |
| `society` | Society or project name |
| `furnishing` | Furnished, Semifurnished, or Unfurnished |
| `tenant_type` | Preferred tenant tags |
| `amenities` | Readable highlight bullets (facing, floor, power backup, etc.) |
| `latitude` | Latitude |
| `longitude` | Longitude |
| `rera_id` | RERA registration ID where present |
| `floor` | Floor the unit is on |
| `total_floors` | Total floors in the building |
| `age_years` | Age of the property in years |
| `posted_on` | Listing posted or registered date |
| `verified` | Whether 99acres marks the listing verified |
| `photo_url` | Primary listing photo URL |
| `listing_url` | Full 99acres listing URL |
| `scraped_at` | ISO timestamp of capture |

### Common use cases

**Real estate market research**
Track asking rents and sale prices by locality across a whole city.
Build a price per sqft dataset for any Indian market you cover.

**Lead generation for agents and brokers**
Pull fresh listings in your operating localities every morning and act on the newest ones first.
Map inventory by society and BHK to spot where supply is thin.

**Proptech and analytics**
Feed a rental yield or affordability model with live, structured supply data.
Geo plot inventory using the latitude and longitude on every record.

**Relocation and tenant tools**
Filter by BHK and budget to build a shortlist for a client or an internal relocation desk.
Compare furnishing and tenant preferences across neighbourhoods.

### Getting started

1. Enter the `city` you want to search, for example `Bangalore` or `Hyderabad`.
2. Choose the `listingType`: rent, buy, PG, or commercial.
3. Optionally set a `bhk` filter and a `minPrice` / `maxPrice` band.
4. Set `maxResults` to control volume and cost.
5. Click Start, then download the dataset as JSON, CSV, or Excel, or pull it via API or MCP.

### FAQ

**Which cities does it support?**
Any city 99acres covers. Just pass the city name. Common aliases such as `Bengaluru`, `Gurugram`, `Bombay`, and `New Delhi` are mapped to the correct 99acres city automatically.

**Does it scrape rent, buy, PG, and commercial?**
Yes. Set `listingType` to `rent`, `buy`, `pg`, or `commercial`. Rent and PG prices are monthly; buy and commercial prices are the total asking price. The `price_unit` field tells you which applies.

**How are BHK and price filters applied?**
They are applied to the real bedroom and price values on each listing after fetching, so the results match your criteria precisely regardless of how 99acres handles URL filters.

**How much does it cost?**
Pay per event: $0.002 per listing returned. You are charged only for listings actually delivered, never for empty or blocked runs. No subscription and no monthly minimum.

**Does it need a login or API key?**
No. It reads only public 99acres search pages. It never logs in, never uses cookies, and never touches any account.

### Use in Claude, ChatGPT & any MCP agent

```
https://mcp.apify.com/?tools=themineworks/99acres-scraper
```

Or call it programmatically with the Apify client:

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

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

const run = await client.actor('themineworks/99acres-scraper').call({
  city: 'Bangalore',
  listingType: 'rent',
  bhk: '2,3',
  maxResults: 50,
});

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

### 🛠️ Related real estate actors

Pair this with the rest of the themineworks real estate wedge and the India lineup:

- **[Zillow Search Scraper](https://apify.com/themineworks/zillow-search-scraper)**: US for-sale listings by location.
- **[Zillow Property Details](https://apify.com/themineworks/zillow-property-details)**: full US property detail by URL or ZPID.
- **[Zillow Recently Sold](https://apify.com/themineworks/zillow-recently-sold)**: US sold comps for CMA.
- **[Zillow Rental Listings](https://apify.com/themineworks/zillow-rental-listings)**: US for-rent listings.
- **[Redfin Scraper](https://apify.com/themineworks/redfin-scraper)**: US Redfin for-sale and sold listings.
- **[Realtor.com Scraper](https://apify.com/themineworks/realtor-scraper)**: US Realtor.com listings with agent data.
- **[IndiaMART Supplier Scraper](https://apify.com/themineworks/indiamart-suppliers)**: pull B2B suppliers, GST, and phone numbers with no login.
- **[JustDial Business Scraper](https://apify.com/themineworks/justdial-business)**: extract local business listings and contacts across India.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page or reach out through the Apify profile.

# Actor input Schema

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

Indian city to search (e.g. 'Bangalore', 'Hyderabad', 'Mumbai', 'Pune', 'Gurgaon', 'Delhi'). Required.

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

What kind of listings to scrape.

## `bhk` (type: `string`):

Only return listings with these bedroom counts. Comma-separate for multiple (e.g. '2' or '2,3'). Leave blank for all.

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

Minimum price. Monthly rent for rent/PG, total price for buy/commercial. Leave blank for no minimum.

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

Maximum price. Monthly rent for rent/PG, total price for buy/commercial. Leave blank for no maximum.

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

Maximum number of listings to return. Each listing costs $0.002 after the first 10 free (lifetime).

## Actor input object example

```json
{
  "city": "Bangalore",
  "listingType": "rent",
  "maxResults": 10
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "city": "Bangalore",
    "listingType": "rent",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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 = {
    "city": "Bangalore",
    "listingType": "rent",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/99acres-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "city": "Bangalore",
  "listingType": "rent",
  "maxResults": 10
}' |
apify call themineworks/99acres-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=themineworks/99acres-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/Uj9YuKx5FQHp1khqF/builds/docVaLsIbjs2Kccv7/openapi.json
