# 99acres Property Scraper (`solidcode/99acres-scraper`) Actor

\[💰 $1.8 / 1K] Extract property listings from 99acres.com — India's largest real estate portal. Search by city, transaction type, BHK, and budget, or paste search URLs directly. Returns prices, locations, specifications, photos, and RERA details for residential and commercial properties.

- **URL**: https://apify.com/solidcode/99acres-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

Pull property listings from 99acres.com — India's largest real estate portal — at scale. Capture residential and commercial listings, new-launch developer projects, prices in INR, lakh / crore breakdowns, BHK configurations, map coordinates, RERA registration IDs, builder names, agent contacts, and full photo galleries in one structured dataset. Built for real-estate analysts, property investors, builder-developer intel teams, listing aggregators, and PropTech apps that need fresh 99acres data without wrestling with India-specific price strings, locality slugs, and dual card formats.

### Why This Scraper?

- **Dual-card normalizer in one feed** — regular property listings AND sponsored new-launch project cards arrive in the same dataset, every row tagged with `cardType: "property"` or `"project"` so you can split them downstream with a single filter.
- **43 cities across 8 metro regions** — verified ID coverage for Delhi NCR (Delhi, Noida, Gurgaon, Ghaziabad, Faridabad), Mumbai (incl. Western and Central Suburbs, Navi Mumbai, Thane), Bangalore, Pune, Kolkata, Chennai, Hyderabad, and Ahmedabad, plus their satellite towns.
- **6 transaction types in one schema** — Buy (Residential), Rent (Residential), Paying Guest / Co-living, New Launches, Buy (Commercial), and Rent (Commercial), normalized to a single flat row format.
- **10 property types** — Apartment / Flat, Independent House, Villa, Builder Floor, Studio Apartment, Plot / Land, Farmhouse, Office Space, Retail Shop / Showroom, and Warehouse / Industrial.
- **Lat / lng on every listing** — map coordinates extracted from the listing's `MAP_DETAILS` block, ready for spatial joins, heat maps, or distance-to-metro analytics.
- **Price normalization built in** — heterogeneous Indian price strings ("1.15 Cr", "₹50 Lakh", "₹15,000", "2.5L") parsed into integer rupees in `priceInr`, plus a separate `pricePerSqftInr` rate and `priceMinInr` / `priceMaxInr` range for project cards.
- **Builder, RERA, and possession metadata for new launches** — `builderName`, `reraId`, `isNewLaunch`, `possessionStatus`, plus the full `configSummary` array (per-BHK area + price breakdown) and `keyHighlights` bullets.
- **Locality autocomplete by name** — paste neighborhood names like "Bandra West", "Whitefield", or "Koramangala" directly. The actor resolves them to 99acres' internal IDs via the same dropdown the website uses.
- **Search-URL passthrough** — paste any 99acres search URL with the filters already applied (BHK, budget, RERA, ready-to-move, property type) and the actor honors them as-is. No filter mapping required.
- **Smooth pagination across all pages** — approximately 25 listings per page across pagination (page 1 ships 27, follow-on pages 24-26), with deterministic stop-on-empty so a 200-row run pages until satisfied without overshoot.

### Use Cases

**Market Research & Pricing Intelligence**
- Track ask-price-per-sqft across Mumbai's Western Suburbs, week over week
- Map the supply curve of 2-3 BHK apartments in Bangalore IT corridors
- Build a city-level price heat map from `latitude` + `longitude` + `pricePerSqftInr`

**Investment Analysis**
- Surface verified resale apartments under ₹1 Cr in target localities
- Compare new-launch project pricing (`cardType: "project"`) against resale comps
- Filter for `verified: true` listings to focus on agent-validated inventory

**Lead Generation & CRM Enrichment**
- Pull contactable agent names, companies, and city for outbound real-estate sales
- Identify owner-direct postings (`agentType: "Owner"`) for direct-deal pipelines
- Enrich CRM records with society / project name and full address

**Builder & Developer Intelligence**
- Track which builders are launching the most projects in a given quarter
- Monitor possession status and RERA filings by developer
- Capture `configSummary` to compare 2/3/4 BHK price tiers across launches

**Real-Estate Tech & Aggregator Apps**
- Power a property comparison feed with photos, amenities, and floor counts
- Feed a mortgage calculator or affordability tool with live `priceInr` data
- Build a hyperlocal listings widget keyed on `locality` + `bedrooms`

**PG / Co-Living & Rental Operators**
- Benchmark rent prices across PG and shared-accommodation listings
- Track 1 BHK and 2 BHK rental supply by furnishing status
- Surface furnished, ready-to-move flats matching corporate housing briefs

### Getting Started

#### Simple — One City, Buy Listings

```json
{
  "city": "Mumbai",
  "transactionType": "buy",
  "maxResults": 200
}
````

#### Filtered — Bangalore 2+ BHK Rentals in Specific Localities

```json
{
  "city": "Bangalore",
  "transactionType": "rent",
  "propertyType": "apartment",
  "bedroomsMin": 2,
  "localities": ["Koramangala", "HSR Layout", "Indiranagar"],
  "maxResults": 100
}
```

#### Advanced — Search-URL Passthrough

For maximum filter precision, paste 99acres search URLs straight from your browser (any combination of filters you can apply on the site):

```json
{
  "searchUrls": [
    "https://www.99acres.com/search/property/buy/mumbai?city=12&res_com=R&preference=S",
    "https://www.99acres.com/search/property/rent/bangalore?city=20&res_com=R&preference=R&bedroom_num=2,3"
  ],
  "maxResults": 500
}
```

#### New Launches — Developer Projects Only

```json
{
  "city": "Pune",
  "transactionType": "new-launches",
  "maxResults": 100
}
```

### Input Reference

#### Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | `[]` | Paste one or more 99acres search-result URLs. When provided, the structured filters below are ignored. |
| `city` | string | `"Mumbai"` | City to search in (e.g. "Mumbai", "Bangalore", "Delhi", "Pune", "Hyderabad"). Common aliases are recognised — "Bengaluru" maps to Bangalore, "Bombay" to Mumbai, "Calcutta" to Kolkata, "Madras" to Chennai, "Gurugram" to Gurgaon. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `transactionType` | enum | `"buy"` | One of: Buy (Residential), Rent (Residential), Paying Guest / Co-living, New Launches, Buy (Commercial), Rent (Commercial). |
| `propertyType` | enum | `null` | Apartment / Flat, Independent House, Villa, Builder Floor, Studio Apartment, Plot / Land, Farmhouse, Office Space, Retail Shop / Showroom, or Warehouse / Industrial. Leave blank for all. |
| `bedroomsMin` | integer | `null` | Minimum BHK. Setting `2` includes 2 BHK, 3 BHK, 4 BHK, and 5+ BHK listings. Ignored for Plot, Commercial, and PG searches. |
| `priceMinInr` | integer | `null` | Target minimum price in rupees (e.g. `5000000` for ₹50 lakh). See Tips for current behavior. |
| `priceMaxInr` | integer | `null` | Target maximum price in rupees (e.g. `30000000` for ₹3 Cr). See Tips for current behavior. |
| `localities` | array | `[]` | Locality names to narrow within the city (e.g. "Bandra West", "Whitefield", "Gurgaon Sector 49"). Resolved to 99acres' internal IDs automatically. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `200` | Maximum listings to collect across all searches. Set to `0` for no cap (an internal upper limit of 50,000 still applies). The actor stops requesting new pages once this number is reached but keeps the full final page even if it slightly overshoots. |

### Output

Output is one flat row per listing, with `cardType` discriminating regular property listings from sponsored new-launch project cards. The two card types share the same column set — fields irrelevant to a given card type land as `null` so downstream pipelines stay schema-stable.

#### Example — Property Card (`cardType: "property"`)

```json
{
  "cardType": "property",
  "spid": "R12345678",
  "propertyUrl": "https://www.99acres.com/3-bhk-bedroom-apartment-flat-for-sale-in-bandra-west-mumbai-spid-R12345678",
  "transactionType": "buy",
  "propertyType": "Apartment",
  "title": "3 BHK in Bandra West",
  "bedrooms": 3,
  "bedroomsLabel": "3 BHK",
  "bathrooms": 3,
  "areaSqft": 1450.0,
  "areaSqm": 134.71,
  "areaType": "Carpet Area",
  "priceInr": 47500000,
  "priceLabel": "4.75 Cr",
  "pricePerSqftInr": 32758.62,
  "negotiable": true,
  "city": "Mumbai",
  "locality": "Bandra West",
  "society": "Sea Breeze Heights",
  "address": "Bandra West, Mumbai",
  "latitude": 19.0606,
  "longitude": 72.8362,
  "furnishing": "Semi-Furnished",
  "propertyAge": "5-10 years",
  "floor": "12 of 22",
  "facing": "North-East",
  "availability": "Ready to Move",
  "verified": true,
  "reraId": "P51800012345",
  "postedAt": "2026-04-21T08:14:00+00:00",
  "agentName": "Priya Mehta",
  "agentCompany": "Mumbai Realty Co.",
  "agentType": "Broker",
  "agentVerified": true,
  "propertyImages": ["https://img.99acres.com/...jpg"],
  "amenities": ["Lift", "Reserved Parking", "Power Backup", "Gymnasium"],
  "tags": ["Verified", "Negotiable"],
  "description": "Spacious 3 BHK in a premium tower...",
  "scrapedAt": "2026-05-08T10:00:00+00:00"
}
```

#### Example — Project Card (`cardType: "project"`)

```json
{
  "cardType": "project",
  "spid": "12345",
  "propertyUrl": "https://www.99acres.com/lodha-park-worli-mumbai-npxid-r12345",
  "transactionType": "new-launches",
  "propertyType": "Apartment / Project",
  "title": "Lodha Park",
  "bedrooms": 2,
  "bedroomsLabel": "2, 3 BHK",
  "areaSqft": 985.0,
  "areaSqm": 91.51,
  "priceInr": 35000000,
  "priceLabel": "3.5 - 6.2 Cr",
  "priceMinInr": 35000000,
  "priceMaxInr": 62000000,
  "city": "Mumbai",
  "locality": "Worli",
  "society": "Lodha Park",
  "latitude": 19.0176,
  "longitude": 72.8175,
  "builderName": "Lodha Group",
  "possessionStatus": "Ready to Move",
  "isNewLaunch": false,
  "reraId": "P51900012345",
  "configSummary": [
    {"bhk": "2 BHK", "areaSqft": 985.0, "priceLabel": "3.5 Cr", "priceMinInr": 35000000, "priceMaxInr": 38000000},
    {"bhk": "3 BHK", "areaSqft": 1480.0, "priceLabel": "5.2 - 6.2 Cr", "priceMinInr": 52000000, "priceMaxInr": 62000000}
  ],
  "keyHighlights": ["Riverside views", "Clubhouse with infinity pool", "RERA approved"],
  "propertyImages": ["https://img.99acres.com/...jpg"],
  "tags": ["RERA Approved", "Ready to Move"],
  "scrapedAt": "2026-05-08T10:00:00+00:00"
}
```

#### Core Identity

| Field | Type | Description |
|-------|------|-------------|
| `cardType` | string | `"property"` (regular listing) or `"project"` (new-launch developer card). |
| `spid` | string | 99acres listing or project unit ID. |
| `propertyUrl` | string | Canonical detail page URL on 99acres.com. |
| `transactionType` | string | `buy`, `rent`, `pg`, `new-launches`, `commercial-buy`, or `commercial-rent`. |
| `title` | string | Listing or project headline. |
| `description` | string | Long-form description, when present. |
| `searchUrl` | string | The 99acres search URL this row was collected from. |
| `scrapedAt` | string (ISO) | When the row was captured. |
| `postedAt` | string (ISO) | When the listing was posted. |
| `updatedAt` | string (ISO) | When the listing was last updated. |

#### Pricing

| Field | Type | Description |
|-------|------|-------------|
| `priceLabel` | string | Original 99acres price string ("1.15 Cr", "₹15,000/mo"). |
| `priceInr` | integer | Numeric price in rupees, parsed from `priceLabel` or the raw `MIN_PRICE` field. |
| `priceMinInr` | integer | Project cards only: lowest unit price in the range. |
| `priceMaxInr` | integer | Project cards only: highest unit price in the range. |
| `pricePerSqftInr` | float | Rate per sqft in rupees. |
| `negotiable` | boolean | Whether the seller marked the listing as negotiable. |

#### Property Details

| Field | Type | Description |
|-------|------|-------------|
| `propertyType` | string | Decoded property type (Apartment, Villa, Plot, Office, etc.). |
| `bedrooms` | integer | BHK count (smallest, for project cards with multiple configs). |
| `bedroomsLabel` | string | "3 BHK" for property cards; "2, 3 BHK" for multi-config projects. |
| `bathrooms` | integer | Bathroom count. |
| `areaSqft` | float | Area in square feet. |
| `areaSqm` | float | Area in square meters (auto-converted). |
| `areaType` | string | Carpet, Built-up, or Super Built-up. |
| `furnishing` | string | Furnished, Semi-Furnished, or Unfurnished. |
| `propertyAge` | string | Age band ("5-10 years", "New", etc.). |
| `floor` | string | Floor number / total floors ("12 of 22"). |
| `facing` | string | Compass direction. |
| `availability` | string | "Ready to Move", "Under Construction", etc. |
| `availableFrom` | string (ISO) | Earliest move-in date, when available. |
| `verified` | boolean | Whether 99acres has verified the listing. |
| `reraId` | string | RERA registration ID, when present. |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| `city` | string | City name. |
| `locality` | string | Neighborhood / locality. |
| `society` | string | Society or project name. |
| `address` | string | Full address, when available. |
| `latitude` | float | Map latitude. |
| `longitude` | float | Map longitude. |
| `landmarkDetails` | array | Nearby landmarks with name, distance, and category. |

#### Agent / Builder

| Field | Type | Description |
|-------|------|-------------|
| `agentName` | string | Listed-by name (agent, owner, or builder). |
| `agentCompany` | string | Brokerage or company name. |
| `agentType` | string | Decoded type — "Agent", "Owner", or "Builder". |
| `agentCity` | string | Agent's listed city. |
| `agentVerified` | boolean | Whether the agent is verified by 99acres. |
| `builderName` | string | Project cards: developer name. |

#### New Launch / Project

| Field | Type | Description |
|-------|------|-------------|
| `possessionStatus` | string | "Ready to Move", "Under Construction", or possession date. |
| `isNewLaunch` | boolean | Whether the project is flagged as new launch. |
| `configSummary` | array | Per-BHK breakdown — array of `{bhk, areaSqft, priceLabel, priceMinInr, priceMaxInr}`. |
| `keyHighlights` | array | Project highlight bullets ("Riverside views", "Clubhouse", etc.). |

#### Media & Tags

| Field | Type | Description |
|-------|------|-------------|
| `propertyImages` | array | Listing photo URLs. |
| `propertyVideos` | array | Listing video URLs, when present. |
| `amenities` | array | Decoded amenity names ("Lift", "Power Backup", "Swimming Pool"). |
| `features` | array | Decoded extra-feature names. |
| `tags` | array | Listing badges ("Verified", "Negotiable", "RERA Approved"). |

### Tips for Best Results

- **Use the URL passthrough mode** for the most precise control. Apply every filter on 99acres.com (BHK, budget, RERA, ready-to-move, amenities), copy the URL, and paste it into `searchUrls` — every filter is honored as-is.
- **Setting `bedroomsMin: 2` is inclusive** — it returns 2 BHK, 3 BHK, 4 BHK, and 5+ BHK listings, matching how 99acres' multi-select BHK filter works on the site.
- **Sponsored new-launch project cards appear alongside regular listings.** Filter on `cardType` after the run if you want only one or the other — projects expose `builderName`, `configSummary`, and `priceMinInr` / `priceMaxInr`, while properties carry agent contacts and exact unit specs.
- **Price filters are applied locally after fetching.** 99acres' server-side budget params behave inconsistently, so the actor enforces `priceMinInr` / `priceMaxInr` against `priceInr` on each row. To compensate, it over-fetches up to 3× your `maxResults` and trims afterward — so a `maxResults: 100` run with a tight price band may scan 300 raw listings to deliver 100 in-range rows. Rows priced "On Request" pass through unfiltered (you can drop them downstream by filtering `priceInr is null`).
- **Add multiple localities at once** — `localities` accepts an array of neighborhood names. The actor calls 99acres' locality autocomplete to resolve names to internal IDs, so you can paste the human-readable names directly. If a name doesn't match (typos, unfamiliar spelling), that single locality is skipped with a warning. If none of the names resolve, the search widens to the whole city and the final status message flags the fallback.
- **Set `maxResults: 0` for unbounded runs** with an internal 50,000-row safety cap. Note that 99acres caps each search at roughly 60 result pages (~1,500 listings) — narrow your filters with `localities` or `bedroomsMin` if you hit the wall.
- **For "On Request" prices** (common on premium listings), `priceInr` is `null` while `priceLabel` retains the original "Price on Request" string. Use this combination to filter out non-priced listings.

### Pricing

**$1.80 per 1,000 results** — pay only for what you collect. 10% cheaper than the closest 99acres scraper on the Apify Store.

| Results | Estimated Cost |
|---------|----------------|
| 100 listings | $0.18 |
| 1,000 listings | $1.80 |
| 10,000 listings | $18.00 |
| 100,000 listings | $180.00 |

No compute charges — you only pay per result returned. Each property row counts as one result, regardless of how many photos, amenities, or landmarks it carries. Apify platform fees may apply on top, depending on your subscription plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

Use the dataset directly in your CRM, BI tool, or analytics warehouse via REST API or scheduled exports.

### Legal & Ethical Use

This actor collects publicly available property listings from 99acres.com. You are responsible for using the data in compliance with 99acres' Terms of Service, applicable Indian data-protection law (including the DPDP Act), and any local regulations governing the use of personal information. Treat agent and owner contact details as personal data — store them securely, honor opt-outs, and avoid bulk outreach without consent. This actor must not be used to harvest personal data for unlawful purposes, to bypass paywalls, or to overload the source site.

# Actor input Schema

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

Paste one or more 99acres search-result URLs (e.g. https://www.99acres.com/property-in-mumbai-ffid). Filters in the URL are honored as-is. When provided, the structured filters below are ignored.

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

City to search in (e.g. "Mumbai", "Bangalore", "Delhi", "Pune", "Hyderabad"). Ignored when Search URLs are provided.

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

What kind of listings to collect.

## `propertyType` (type: `string`):

Type of property to look for. Leave blank to include all property types.

## `bedroomsMin` (type: `integer`):

Only include properties with at least this many bedrooms. Leave empty for any. Ignored for Plot, Commercial, and PG searches.

## `priceMinInr` (type: `integer`):

Target minimum price in Indian rupees (e.g. 5000000 for ₹50 lakh, 10000000 for ₹1 crore). Best-effort filter applied locally — 99acres' server-side budget params are unreliable. To reach your target maxResults, the actor over-fetches up to 3× and trims afterward. Rows without parsable INR price (e.g. "On Request", "Call for price") pass through unfiltered. Leave empty for no minimum.

## `priceMaxInr` (type: `integer`):

Target maximum price in Indian rupees. Best-effort filter applied locally — 99acres' server-side budget params are unreliable. To reach your target maxResults, the actor over-fetches up to 3× and trims afterward. Rows without parsable INR price pass through unfiltered. Leave empty for no maximum.

## `localities` (type: `array`):

Optional locality names to narrow within the city (e.g. "Bandra West", "Whitefield", "Gurgaon Sector 49"). Leave empty to search the whole city.

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

Maximum number of property rows to collect across all searches. Default 200 — increase for bigger runs, or set to 0 for no cap (an internal upper limit of 50,000 still applies). The actor stops requesting new pages once this number is reached but keeps the full final page even if it slightly overshoots.

## Actor input object example

```json
{
  "searchUrls": [],
  "city": "Mumbai",
  "transactionType": "buy",
  "localities": [],
  "maxResults": 200
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of properties with key fields like type, BHK, price, locality, society, and agent.

## `details` (type: `string`):

Full per-property detail rows including amenities, photos, geo coordinates, agent contacts, and RERA.

# 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": [],
    "city": "Mumbai",
    "transactionType": "buy",
    "localities": [],
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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": [],
    "city": "Mumbai",
    "transactionType": "buy",
    "localities": [],
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/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 '{
  "searchUrls": [],
  "city": "Mumbai",
  "transactionType": "buy",
  "localities": [],
  "maxResults": 200
}' |
apify call solidcode/99acres-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "99acres Property Scraper",
        "description": "[💰 $1.8 / 1K] Extract property listings from 99acres.com — India's largest real estate portal. Search by city, transaction type, BHK, and budget, or paste search URLs directly. Returns prices, locations, specifications, photos, and RERA details for residential and commercial properties.",
        "version": "1.0",
        "x-build-id": "clesBeYhcXSWOH2Xc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~99acres-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-99acres-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~99acres-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-99acres-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~99acres-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-99acres-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchUrls": {
                        "title": "99acres Search URLs",
                        "type": "array",
                        "description": "Paste one or more 99acres search-result URLs (e.g. https://www.99acres.com/property-in-mumbai-ffid). Filters in the URL are honored as-is. When provided, the structured filters below are ignored.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "City to search in (e.g. \"Mumbai\", \"Bangalore\", \"Delhi\", \"Pune\", \"Hyderabad\"). Ignored when Search URLs are provided.",
                        "default": "Mumbai"
                    },
                    "transactionType": {
                        "title": "Transaction Type",
                        "enum": [
                            "buy",
                            "rent",
                            "pg",
                            "new-launches",
                            "commercial-buy",
                            "commercial-rent"
                        ],
                        "type": "string",
                        "description": "What kind of listings to collect.",
                        "default": "buy"
                    },
                    "propertyType": {
                        "title": "Property Type",
                        "enum": [
                            "apartment",
                            "independent-house",
                            "villa",
                            "builder-floor",
                            "studio-apartment",
                            "plot",
                            "farmhouse",
                            "office",
                            "retail-shop",
                            "warehouse"
                        ],
                        "type": "string",
                        "description": "Type of property to look for. Leave blank to include all property types."
                    },
                    "bedroomsMin": {
                        "title": "Minimum Bedrooms (BHK)",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Only include properties with at least this many bedrooms. Leave empty for any. Ignored for Plot, Commercial, and PG searches."
                    },
                    "priceMinInr": {
                        "title": "Minimum Price (₹)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Target minimum price in Indian rupees (e.g. 5000000 for ₹50 lakh, 10000000 for ₹1 crore). Best-effort filter applied locally — 99acres' server-side budget params are unreliable. To reach your target maxResults, the actor over-fetches up to 3× and trims afterward. Rows without parsable INR price (e.g. \"On Request\", \"Call for price\") pass through unfiltered. Leave empty for no minimum."
                    },
                    "priceMaxInr": {
                        "title": "Maximum Price (₹)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Target maximum price in Indian rupees. Best-effort filter applied locally — 99acres' server-side budget params are unreliable. To reach your target maxResults, the actor over-fetches up to 3× and trims afterward. Rows without parsable INR price pass through unfiltered. Leave empty for no maximum."
                    },
                    "localities": {
                        "title": "Localities",
                        "type": "array",
                        "description": "Optional locality names to narrow within the city (e.g. \"Bandra West\", \"Whitefield\", \"Gurgaon Sector 49\"). Leave empty to search the whole city.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of property rows to collect across all searches. Default 200 — increase for bigger runs, or set to 0 for no cap (an internal upper limit of 50,000 still applies). The actor stops requesting new pages once this number is reached but keeps the full final page even if it slightly overshoots.",
                        "default": 200
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
