# 99acres & MagicBricks India Property Scraper - No Login (`cliqtomedia/india-property-listings`) Actor

Get rent and sale listings from MagicBricks and 99acres in one table: price, price per sq ft, area, BHK, locality, project, builder, amenities as names, all photos and who listed it. Filter by city, type, BHK and budget. No login.

- **URL**: https://apify.com/cliqtomedia/india-property-listings.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 3 total users, 2 monthly users, 90.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 saved 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/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

India Property Listings Scraper reads public rent and sale listings from [MagicBricks](https://www.magicbricks.com/) and [99acres](https://www.99acres.com/) for one Indian city and returns one row per listing with price, area, BHK, locality, project, builder, amenities, photos and who listed it.

It is for brokers, property investors, rental analysts and proptech teams who compare prices in a city. The smallest run is one city: `Bangalore` + `rent` + 20 listings finishes in about 10–25 seconds.

![99acres and MagicBricks property scraper: search a city by rent or buy, BHK and budget, get listings from both portals in one table with price, area, BHK and amenities, export JSON or CSV](https://api.apify.com/v2/key-value-stores/c0UlhqpoL086mewlk/records/HERO-20261014.png)

### Table of contents

- [What it does](#what-it-does)
- [Quick start](#quick-start)
- [Input](#input)
- [Output](#output)
- [Pricing and limits](#pricing-and-limits)
- [Use cases](#use-cases)
- [API and integrations](#api-and-integrations)
- [Use with AI agents (MCP)](#use-with-ai-agents-mcp)
- [Limits and partial results](#limits-and-partial-results)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Support](#support)

### What it does

The Actor opens the search results of MagicBricks, 99acres or both for the city you choose, page by page, and saves each listing to a Dataset. You choose:

- **City** (`city`): for example Bangalore, Mumbai, Pune, New Delhi, Gurgaon, Noida, Hyderabad, Chennai, Kolkata or Ahmedabad. Bengaluru and Gurugram work too.
- **Rent or buy** (`listingType`): rental listings (price per month) or homes for sale (full price).
- **Portal** (`site`): both portals (default), only MagicBricks or only 99acres.
- **Filters**: property type, BHK and budget in INR.

Both portals use the same output fields, so you get one table. Each row has the price and the price per sq ft, carpet, built-up and super built-up area, BHK, bathrooms, furnishing, floor, locality, coordinates, project and builder, amenities as names (for example `Lift`, `Swimming Pool`), all photo URLs from the search result, and who listed it: `owner`, `agent` or `builder`.

#### Good fit

- Compare rents or sale prices in one city across MagicBricks and 99acres.
- Build a list of 2–3 BHK flats under a budget with area, locality and amenities.
- Track new projects and builders in a city with RERA numbers and price per sq ft.

#### Not a fit / limits

- Residential homes only: apartments, builder floors, houses, villas, penthouses and studios. No plots, offices, shops or PG.
- No phone numbers, e-mails or names of private owners. The Actor does not log in and does not open single listing pages.
- One city per run and at most 1,000 listings per run. For more, run the Actor again with another city, BHK or budget.
- Other portals (Housing.com, NoBroker, Square Yards) are not supported.

### Quick start

1. Open the **Input** tab.
2. Keep **City** = `Bangalore` (prefill) or type your city.
3. Keep **Rent or buy** = `rent` and **Max listings** = `20` (prefill) for a first test.
4. Click **Start**.
5. Open the **Output** tab → **Listings** and check `title`, `price`, `areaSqft` and `locality`.

Expected result: 20 listings, 10 from MagicBricks and 10 from 99acres, in about 10–25 seconds.

### Input

#### Input fields

| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `city` | City | string | yes | prefill `Bangalore` | 2–40 letters, spaces or hyphens, in English | City to search on the portals. | `Pune` | Use the English name. `Bengaluru` and `Gurugram` are accepted. |
| `listingType` | Rent or buy | string | no | default `rent` | `rent`, `buy` | Rental listings or homes for sale. | `buy` | For `rent`, all prices are per month. |
| `site` | Portal | string | no | default `both` | `both`, `magicbricks`, `99acres` | Which portal to read. | `99acres` | Keep `both` to compare portals in one table. |
| `maxItems` | Max listings | integer | no | default `100`, prefill `20` | 1–1000 | Total listings to save across both portals. | `200` | You pay per listing and per page, so set what you need. |
| `propertyType` | Property type | array of strings | no | empty = all homes | `apartment`, `builderFloor`, `house`, `villa`, `penthouse`, `studio` | Keeps only these types. | `["apartment", "builderFloor"]` | 99acres has no separate penthouse type. |
| `bhk` | Bedrooms (BHK) | array of strings | no | empty = any | `1`, `2`, `3`, `4`, `5` (`5` = 5 or more) | Keeps only these BHK numbers. | `["2", "3"]` | Listings without a BHK number (some studios) are left out when set. |
| `budgetMin` | Min price (INR) | integer | no | empty | 0 – 10,000,000,000 | Lowest price in rupees. | `20000` | For buy, use the full price: `5000000` = 50 lakh. |
| `budgetMax` | Max price (INR) | integer | no | empty | 1 – 10,000,000,000 | Highest price in rupees. | `60000` | Listings without a price are left out when a budget is set. |

Empty input: `city` is required. Without it, or with a city in another script (for example `बेंगलुरु`), the run fails at once with an input error and only the start event is charged. A listing that appears twice in the results is saved and charged once.

#### Interacting settings

| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
| --- | --- | --- | --- | --- | --- |
| Both portals | `site: both` | `maxItems` | The limit is split between portals (MagicBricks gets the odd one). If one portal runs out, the other fills the rest. | `maxItems: 20` | 10 + 10 rows. |
| Penthouse only on 99acres | `propertyType: ["penthouse"]` | `site: 99acres` | 99acres has no penthouse filter, so nothing is searched. | | Run ends `no_results`, only the start event. |
| Budget set | `budgetMin` / `budgetMax` | `listingType` | Rent budget is per month; buy budget is the full price. | `rent`, `budgetMax: 60000` | Fewer rows per page, so more pages per listing. |
| `budgetMin` > `budgetMax` | `budgetMin` | `budgetMax` | Input error, the run stops before any request. | `90000` / `10000` | Only the start event. |
| Very narrow filter | `bhk`, `budget*` | `maxItems` | A portal stops after 5 pages in a row with no matching listing. | `budgetMax: 500` | No rows; about 11 pages charged. |

#### Input examples

##### Rent: 2–3 BHK flats under ₹90,000 in Bangalore

```json
{
  "city": "Bangalore",
  "listingType": "rent",
  "propertyType": ["apartment"],
  "bhk": ["2", "3"],
  "budgetMax": 90000,
  "maxItems": 100
}
```

Expected behavior: both portals are searched, 50 listings each.
Expected output: flats with `price`, `areaSqft`, `bhk`, `locality`, `furnishing`, `deposit`.
Limit or cost note: you pay for each saved listing and each page read.

##### Buy: homes for sale in Mumbai on MagicBricks only

```json
{
  "city": "Mumbai",
  "listingType": "buy",
  "site": "magicbricks",
  "maxItems": 200
}
```

Expected behavior: MagicBricks sale listings in the portal's own order.
Expected output: listings with `price`, `priceText` (for example `1.25 Cr`), `carpetAreaSqft`, `projectName`, `builderName`, `reraId`.
Limit or cost note: one MagicBricks page gives about 30 listings, so 200 rows need about 7 pages.

### Output

Each row is one listing from one portal. The default view **Listings** shows the main columns; the view **All fields** shows every field, including area types, floor, amenities and dates. Export the Dataset as JSON, CSV, Excel or other Apify formats.

#### Output example

A real row from the prefill run (`Bangalore`, `rent`, 20 listings), trimmed: only one photo is shown and the description is shortened.

```json
{
  "id": "99acres:93377100",
  "site": "99acres",
  "listingId": "93377100",
  "url": "https://www.99acres.com/2-bhk-bedroom-apartment-flat-for-rent-in-eden-park-at-the-prestige-city-sarjapur-bangalore-east-979-sqft-spid-B93377100",
  "title": "2 BHK Flat for rent in Sarjapur, Bangalore",
  "listingType": "rent",
  "price": 40000,
  "priceText": "40,000",
  "pricePerSqft": 40,
  "areaSqft": 979,
  "areaType": "Super Built-up Area",
  "carpetAreaSqft": 645,
  "builtUpAreaSqft": null,
  "superAreaSqft": 979,
  "bhk": 2,
  "bathrooms": 2,
  "balconies": 1,
  "propertyType": "Residential Apartment",
  "furnishing": "Semi-Furnished",
  "floor": "10",
  "totalFloors": 28,
  "facing": "East",
  "locality": "Sarjapur",
  "city": "Bangalore",
  "latitude": 12.877670671473693,
  "longitude": 77.7737927936145,
  "projectName": "Eden Park at The Prestige City",
  "builderName": null,
  "amenities": ["Corner Property", "Power Backup", "Gated Society", "Gas Pipeline", "CCTV Surveillance", "Pet Friendly"],
  "images": ["https://imagecdn.99acres.com/media1/40671/14/813434867M-1786265241016.jpg"],
  "listedBy": "agent",
  "agencyName": "G R Enterprises",
  "availability": "2026-08-09",
  "tenantPreference": "Single Women, Single Men, Family",
  "deposit": 150000,
  "maintenance": null,
  "maintenancePeriod": null,
  "reraId": null,
  "description": "Additionally, this property is in vicinity to important points of interest and is close to school, close to hospital…",
  "postedAt": "2026-08-09T08:40:01.000Z",
  "updatedAt": "2026-08-09T09:34:23.000Z",
  "position": 1,
  "searchUrl": "https://www.99acres.com/search/property/rent/residential/bangalore?city=20&preference=R&area_unit=1&res_com=R&property_type=1,2,4,90",
  "fetchedAt": "2026-10-14T15:01:56.707Z"
}
```

`null` means the portal did not show this value on the search result. It never means zero. The Actor does not compute missing values itself: for example, `pricePerSqft` stays null when the portal does not give it.

#### Output fields

| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
| --- | --- | --- | --- | --- | --- |
| `id` | Unique row ID: portal + listing ID | string | no | `99acres:93377100` | Actor |
| `site` | Portal of the row | string | no | `magicbricks`, `99acres` | Actor |
| `listingId` | Portal's own listing ID | string | no | `93377100` | portal |
| `url` | Listing page on the portal | string | no | | portal |
| `title` | Listing headline | string | yes | `2 BHK Flat for rent in Sarjapur, Bangalore` | portal |
| `listingType` | Rent or buy | string | no | `rent`, `buy` | input |
| `price` | Price in INR; for rent, per month | number | yes: "Price on request" | `40000` | portal |
| `priceText` | Price as the portal writes it | string | yes | `40,000`, `1.25 Cr` | portal |
| `pricePerSqft` | INR per sq ft | number | yes | `40` | portal, not computed |
| `areaSqft`, `areaType` | Area shown on the card and which area it is | number, string | yes | `979`, `Super Built-up Area` | portal; on MagicBricks `areaType` is set only when the card has only the carpet area |
| `carpetAreaSqft`, `builtUpAreaSqft`, `superAreaSqft` | Area types in sq ft | number | yes | `645`, `null`, `979` | portal |
| `bhk` | Bedrooms | integer | yes: some studios | `2` | portal |
| `bathrooms`, `balconies` | Counts | integer | yes | `2`, `1` | portal |
| `propertyType` | Type as the portal names it | string | yes | `Apartment`, `Independent House` | portal |
| `furnishing` | Furnishing | string | yes | `Furnished`, `Semi-Furnished`, `Unfurnished` | portal |
| `floor`, `totalFloors` | Floor of the unit, floors in the building | string, integer | yes | `10`, `28`; `Ground` | portal |
| `facing` | Direction | string | yes | `East` | portal |
| `locality`, `city` | Neighbourhood and city | string | yes | `Sarjapur`, `Bangalore` | portal |
| `latitude`, `longitude` | Point of the listing | number | yes | `12.8776`, `77.7737` | portal |
| `projectName` | Housing project or society | string | yes | `Eden Park at The Prestige City` | portal |
| `builderName` | Builder or developer | string | yes | `SOBHA Limited` | MagicBricks only |
| `amenities` | Amenity names | array | no, can be `[]` | `["Lift", "Swimming Pool"]` | portal codes turned into names |
| `images` | Photo URLs | array | no, can be `[]` | | portal CDN |
| `listedBy` | Who posted it | string | yes | `owner`, `agent`, `builder` | portal |
| `agencyName` | Agency or builder company | string | yes: null for owners and for names that look like a person | `G R Enterprises` | privacy rule |
| `availability` | Possession or availability | string | yes | `Ready to Move`, `Immediately`, `2026-08-09` | portal |
| `tenantPreference` | Rent only: preferred tenants | string | yes | `Family` | portal |
| `deposit` | Rent only: security deposit, INR | number | yes | `150000` | portal |
| `maintenance`, `maintenancePeriod` | Maintenance charge and period | number, string | yes | `3500`, `Monthly` | MagicBricks only |
| `reraId` | RERA registration number | string | yes | `PRM/KA/RERA/1251/446/PR/210219/003939` | portal |
| `description` | Listing text, up to 2,000 characters | string | yes | | phone numbers and e-mails hidden |
| `postedAt`, `updatedAt` | Posted and last updated (ISO 8601) | string | yes | `2026-08-09T08:40:01.000Z` | portal |
| `position` | Order in the portal results in this run | integer | no | `1` | Actor |
| `searchUrl` | Portal search page the row came from | string | no | | Actor |
| `fetchedAt` | When the row was collected (UTC) | string | no | `2026-10-14T15:01:56.707Z` | Actor |

#### Output entities and surfaces

| Situation | Where | Result shape | User action |
| --- | --- | --- | --- |
| Normal listing | Dataset, views **Listings** and **All fields** | one row per listing | open, export or use by API |
| Filters match nothing | Dataset is empty; `RUN_SUMMARY.status` = `no_results` | run `SUCCEEDED` | widen BHK or budget |
| Unknown city | `RUN_SUMMARY.status` = `not_found` | run `SUCCEEDED`, no rows | check the spelling, for example `New Delhi`, `Gurgaon` |
| Stopped early (cost limit, time limit) | Dataset has the saved rows; `RUN_SUMMARY.status` = `partial`, `reason` = `CHARGE_LIMIT` or `TIME_LIMIT` | run `SUCCEEDED` | raise the limit and run again |
| One portal blocked, the other worked | rows from the working portal; `status` = `partial`, `reason` = `SITE_ERROR` | run `SUCCEEDED` | run again later for the missing portal |
| Portal error with no rows | `status` = `error`, `reason` = `SOURCE_ERROR` | run `FAILED` | run again later |
| Input error | `status` = `invalid_input` | run `FAILED`, no requests | fix the input |

`RUN_SUMMARY` (in the run's key-value store) has the run `status`, `reason`, `message`, counts (`items`, `pages`, `bySite`) and one entry per portal with `status` (`complete`, `partial`, `no_results`, `not_found`, `skipped`, `error`), `items`, `totalOnSite`, `pagesFetched`, `filteredOut`, `searchUrl` and `error`.

### Pricing and limits

#### Pricing unit

This Actor uses pay-per-event pricing. You pay for:

| Event | Price | When |
| --- | --- | --- |
| Actor start | $0.001 | once per run |
| Page read | $0.005 | for each portal page the Actor reads: a search results page or the 99acres city page |
| Saved listing | $0.0018 (Free plan), $0.0017 (Bronze), $0.0015 (Silver), $0.0012 (Gold and higher) | for each listing saved to the Dataset |

One results page gives about 25–30 listings, so on the Free plan 1,000 listings cost about $2.00 all in, and on Gold about $1.40. Residential proxy and platform usage are included; you do not pay them separately.

- A run with no listings still pays for the pages it read: an unknown city is about 2 pages ($0.011), a filter with no match stops after 5 empty pages per portal (about $0.056).
- An input error costs only the start event: $0.001.
- Listings that are filtered out or repeated are not charged. Retries after a portal block are not charged as pages.
- If you set a maximum cost for the run, the Actor stops before a page or a listing that does not fit. The run still ends `SUCCEEDED`, with `RUN_SUMMARY.status` = `partial` and `reason` = `CHARGE_LIMIT`. Saved listings stay.

#### Cost examples

Free plan prices. Pages and times are from real test runs.

| Scenario | Input scope | Listings | Pages | Total (Free) | Time |
| --- | --- | ---: | ---: | ---: | --- |
| First test | Bangalore, rent, `maxItems: 20` | 20 | 3 | $0.052 | 9–18 s |
| One listing | Kolkata, rent, studio, `maxItems: 1` | 1 | 1 | $0.008 | ~6 s |
| City overview | Chennai, buy, `maxItems: 200` | 200 | 9 | $0.41 | ~40 s |
| Large | Hyderabad, rent, `maxItems: 500` | 500 | 20 | $1.00 | ~84 s |
| Maximum | Mumbai, rent, `maxItems: 1000` | 1,000 | 38 | $1.99 | ~142 s |
| Filter with no match | `budgetMax: 500` | 0 | 11 | $0.056 | ~30 s |
| Unknown city | `Atlantis` | 0 | 2 | $0.011 | ~5 s |

### Use cases

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Rent price check by locality | `city`, `listingType: rent`, `bhk` | listing | `price`, `locality`, `areaSqft`, `furnishing` | Google Sheets or CSV |
| Sale price per sq ft in a city | `listingType: buy` | listing | `price`, `pricePerSqft`, `carpetAreaSqft`, `locality` | BI tool via API |
| New projects and builders | `listingType: buy`, `site: magicbricks` | listing | `projectName`, `builderName`, `reraId`, `availability` | CRM or spreadsheet |
| Compare portals | `site: both` | listing | `site`, `price`, `locality`, `listedBy` | Dataset export |
| Owner vs agent listings | any | listing | `listedBy`, `agencyName`, `deposit` | filter in a spreadsheet |

### API and integrations

- **API:** start the Actor with the same JSON input as in the examples, then read the Dataset items. Use `?view=overview` for the **Listings** columns.
- **Export:** JSON, CSV, Excel, XML and other formats from the Dataset.
- **Scheduling:** create an Apify schedule to collect the same city every day or week.
- **Webhooks / no-code:** use Apify integrations (Make, Zapier, Google Sheets, Slack) to send rows when the run finishes.

### Use with AI agents (MCP)

- MCP server URL with only this Actor: `https://mcp.apify.com?tools=cliqtomedia/india-property-listings`
- Smallest useful input:

```json
{ "city": "Bangalore", "listingType": "rent", "maxItems": 20 }
```

- Key output fields: `price` (INR; per month for rent; `null` = price on request), `areaSqft` (area on the card, `areaType` says which), `bhk` (bedrooms), `locality` (neighbourhood), `site` and `url` (portal and listing page).
- A run with 20 listings takes about 10–25 seconds and costs $0.052 on the Free plan. One city per run, at most 1,000 listings.

### Limits and partial results

- At most 1,000 listings per run and 60 pages per portal. The test run with 1,000 listings finished in 142 s.
- The default timeout is 300 s. Before the timeout the Actor stops new requests and keeps saved rows (`partial`, `TIME_LIMIT`). For 1,000 listings with narrow filters or with `site: 99acres` only (about 40 pages at a slower pace), give the run more time, for example 600 s.
- With very narrow filters, a portal stops after 5 pages in a row with no matching listing, so a small number of matches can be missed deep in the results.
- Values come from the search result cards. Fields that appear only on the listing page (full description, phone numbers) are not collected.
- 99acres sometimes shows a check page to fast visitors. The Actor slows down and retries through another Indian IP; if a portal still does not answer, its status is `error` and the other portal's rows stay.

### Troubleshooting

#### The run returns 0 listings

Symptom: the Dataset is empty, `RUN_SUMMARY.status` = `no_results`.
Likely reason: the BHK, type or budget filters match nothing, or a budget is set for the wrong mode (rent is per month, buy is the full price).
Check: open the `searchUrl` from `RUN_SUMMARY.sites` in a browser.
Action: widen the budget or remove a filter.

#### Status `not_found`

Symptom: the run message says the city was not found.
Likely reason: the city name is misspelled or not in English.
Action: use the English name, for example `New Delhi`, `Gurgaon`, `Bangalore`.

#### Run is `partial` with reason `SITE_ERROR`

Symptom: rows only from one portal.
Likely reason: the other portal blocked or did not answer this time. This is not an empty result.
Action: run again later, or run only the missing portal with `site`.

#### Run is `partial` with reason `CHARGE_LIMIT` or `TIME_LIMIT`

Symptom: fewer rows than `maxItems`.
Action: raise the maximum cost or the timeout in run options, or lower `maxItems`.

### FAQ

#### Do I need a MagicBricks or 99acres account?

No. The Actor reads public search results without login. Indian residential proxy is included in the price.

#### Why are some fields null?

The portal did not show this value on the search result. For example, MagicBricks often gives only the carpet area, and 99acres does not give the builder name. The Actor does not guess missing values.

#### Does it collect phone numbers or owner names?

No. Phone numbers and e-mails in descriptions are hidden, `agencyName` is always null for owners, and also null when the portal shows a person's name instead of a company. Only agency and builder company names are kept.

#### Are the results complete and fresh?

Each row is what the portal showed at `fetchedAt`. The portals order and limit their own results; `RUN_SUMMARY.sites[].totalOnSite` shows how many listings the portal reported. Each listing is saved once per run.

#### Can I search several cities in one run?

No, one city per run. Start one run per city, or call the Actor from a schedule or the API for each city.

### Support

For a bug, question or feature request, open an issue on the **Issues** tab of this Actor. Include the run ID, the input (city, rent or buy, portal, filters) and the status message. Never send tokens or account data.

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/india-property-listings/changelog.md

# Actor input Schema

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

City to search, e.g. Bangalore, Mumbai, Pune, New Delhi, Gurgaon, Noida, Hyderabad, Chennai, Kolkata or Ahmedabad. Bengaluru and Gurugram work too.

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

Rental listings (price per month) or properties for sale (full price).

## `site` (type: `string`):

Which portal to read. With both, the listings limit is split between them, and one portal fills in what the other lacks.

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

Maximum listings to save in total (across both portals). Each listing and each portal page read is charged.

## `propertyType` (type: `array`):

Leave empty for all homes. 99acres has no separate penthouse type: penthouses there come with apartments.

## `bhk` (type: `array`):

Leave empty for any. 5 means 5 BHK or more. Listings without a BHK number (some studios) are left out when this is set.

## `budgetMin` (type: `integer`):

Lowest price in rupees. For rent: per month (e.g. 20000). For buy: full price (e.g. 5000000 = 50 lakh). Listings without a price are left out when a budget is set.

## `budgetMax` (type: `integer`):

Highest price in rupees. For rent: per month (e.g. 60000). For buy: full price (e.g. 15000000 = 1.5 crore).

## Actor input object example

```json
{
  "city": "Bangalore",
  "listingType": "rent",
  "site": "both",
  "maxItems": 20
}
```

# Actor output Schema

## `listings` (type: `string`):

One row per listing: site, title, price, price per sq ft, area, BHK, type, locality and link.

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

Project, builder, amenities, photos, furnishing, floor, deposit, RERA ID, description and dates.

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

Status, reason, counts and status per portal, warnings and request statistics.

# 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",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/india-property-listings").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",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/india-property-listings").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 '{
  "city": "Bangalore",
  "listingType": "rent",
  "maxItems": 20
}' |
apify call cliqtomedia/india-property-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/india-property-listings"
        }
    }
}
```

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/DheyjPJFJGh8Hdgu0/builds/OpZfVd7AosVaeRh5N/openapi.json
