99acres.com Property Scraper (India)
Pricing
from $0.60 / 1,000 listings
99acres.com Property Scraper (India)
Collect public property listings from 99acres.com by Indian city, for sale or rent. Each record has the listing URL, asking price in INR, area, bedrooms, locality, city, images and the time collected. Choose your cities, buy or rent, and a result limit — every run returns fresh listings.
Pricing
from $0.60 / 1,000 listings
Rating
0.0
(0)
Developer
Philip Kirkbride
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 hours ago
Last modified
Categories
Features
Share
Collect property listings and new-project developments from 99acres.com, one of India's largest property portals, for Bangalore, Mumbai, Delhi, Pune, Hyderabad, Chennai or any other city you name. Every record has one normalized shape: URL, price in INR, area in sq.ft., bedrooms (BHK), locality, city, sale or rent, and photos. Built for property investors, brokers, proptech teams and market analysts.
What you can do with it
- Track asking prices by city and locality. Re-run the same cities every week and follow asking prices and price per sq.ft. over time.
- Compare buying and renting. Run a
buysearch and arentsearch for the same city to estimate rental yields by locality. - Follow new-project launches. Project rows carry the developer's BHK configurations with their own area and price ranges.
- Build lead lists and shortlists. Filter the dataset by price, BHK and locality in your own tool and open the listing URLs you want.
- Feed a valuation model. Prices in crore and lakh are converted to plain INR numbers, ready for a spreadsheet or database.
Quick start
- Open the Actor in Apify Console. The form is prefilled with Bangalore and 20 results.
- Change the city or add more, and choose
buyorrent. - Click Start, then download the dataset as JSON, CSV or Excel.
{"cities":["Bangalore"],"operation":"buy","maxResults":50}
An empty input ({}) returns a small sample: up to 10 Bangalore sale
listings, and the status message says it was a sample. Name your cities in
cities (or a single city) to run your own search; without a maxResults
it stops at 50 results. maxPages and maxResults are limits, not promised
counts; narrow the city list before raising them.
Input
| Input | Type | Default | Meaning |
|---|---|---|---|
cities | array | — | Indian cities to search, for example ["Bangalore","Mumbai","Delhi","Pune","Hyderabad","Chennai"]. Free-text city names are accepted. A single city value is added to the list. With no city, the run is the 10-listing Bangalore sample. |
operation | string | buy | buy for sale listings or rent for rental listings. |
maxPages | integer | 5 | Maximum result pages per city, 1–10. A city stops early once maxResults is reached or a page returns no results. |
maxResults | integer | 50 | Maximum listings across all cities, 1–200. The no-city sample stops at 10. |
requestDelaySecs | number | 1.0 | Pause between page requests, 0.5–10 s. |
proxyUrl, proxyUsername, proxyPassword | string | empty | Optional custom proxy. Leave empty to use the actor's default connection. |
What it returns
Each run returns one record per search result. A result is either an individual property or a project development, identified by resultType.
Common fields: listing_key (stable join key), url (canonical listing URL), resultType (property or project), title, locality, city, listing_type (buy/rent), images, source and scraped_at.
Property rows keep the flat fields:
| Field | Meaning |
|---|---|
price_inr | Absolute asking price in INR. For a price range this is the lower bound; null when the listing says "price on request" or shows only a per-area rate. |
priceMinInr, priceMaxInr | Both ends of a source price range; equal to price_inr for a single price. |
price_per_sqft_inr | Asking rate in INR per sq.ft., when the source gives one. A per-square-yard or per-square-metre rate is converted to per sq.ft. so the number matches the field name. |
price_text | The price exactly as shown, for example ₹ 2 Cr or ₹ 8,982 /sq.ft.. |
area_sqft | Area normalized to sq.ft. |
areaMinSqft, areaMaxSqft | Both ends of an area range; equal to area_sqft for a single value. |
bedrooms, bedroomsMin, bedroomsMax | Bedrooms (BHK) as a single value or as range bounds. |
configurations | null for a property row. |
Project development rows describe a development instead of one flat: projectUnitId, priceMinInr/priceMaxInr, areaMinSqft/areaMaxSqft, bedroomsMin/bedroomsMax, and configurations (one entry per BHK card with its own area and price range). The single-value price_inr, area_sqft and bedrooms are null because a development is not one unit.
Only real listing or project photos are returned; interface images such as arrows, icons and placeholders are dropped.
Output example
Illustrative property and project rows (JSON Lines):
{"listing_key":"99acres.com:Z72955163","url":"https://www.99acres.com/residential-land-plot-for-sale-in-banashankari-stage-6-block-3-bangalore-south-133-sqyd-r5-spid-Z72955163","resultType":"property","title":"Residential land / Plot in Banashankari 6th Stage 3rd Block","projectUnitId":null,"price_inr":20000000,"priceMinInr":20000000,"priceMaxInr":20000000,"price_per_sqft_inr":null,"price_text":"₹ 2 Cr","area_sqft":1200.0,"areaMinSqft":1200.0,"areaMaxSqft":1200.0,"bedrooms":null,"bedroomsMin":null,"bedroomsMax":null,"configurations":null,"locality":"Banashankari 6th Stage 3rd Block, Banashankari Stage 6","city":"Bangalore","listing_type":"buy","images":["https://imagecdn.99acres.com/media1/23274/17/465497998M-1768900002221.jpg"],"source":"99acres.com","scraped_at":"2026-10-18T12:00:00+00:00"}{"listing_key":"99acres.com:r443829","url":"https://www.99acres.com/reviva-by-ssi-chandapura-bangalore-south-npxid-r443829","resultType":"project","title":"Reviva By SSI","projectUnitId":"443829","price_inr":null,"priceMinInr":7942000,"priceMaxInr":11324000,"price_per_sqft_inr":null,"price_text":null,"area_sqft":null,"areaMinSqft":1045.0,"areaMaxSqft":1490.0,"bedrooms":null,"bedroomsMin":2,"bedroomsMax":3,"configurations":[{"label":"2 BHK","areaMinSqft":1045.0,"areaMaxSqft":1085.0,"priceMinInr":7942000,"priceMaxInr":8246000,"bedrooms":2},{"label":"3 BHK","areaMinSqft":1315.0,"areaMaxSqft":1490.0,"priceMinInr":9994000,"priceMaxInr":11324000,"bedrooms":3}],"locality":"Chandapura","city":"Bangalore","listing_type":"buy","images":["https://newprojects.99acres.com/projects/sri_sai_infra_bangalore/reviva_by_ssi/images/rp2cv6d_1747209613_595772169_med.jpg"],"source":"99acres.com","scraped_at":"2026-10-18T12:00:00+00:00"}
Limits and caveats
- Asking prices, areas and availability can change; verify a listing before making a decision.
- A price that is not an absolute INR is returned as
nullrather than guessed. A per-area rate is stored inprice_per_sqft_inr, not inprice_inr. - Coverage is limited to the requested cities and to the page and result limits: up to 10 pages per city and 200 results per run.
- Results are collected during the run and are not a publication date or proof of a price change.
- Unavailable fields are
null, not invented values. - Listings are saved page by page. A run with saved listings succeeds even if another city could not be read; the status names those cities. This is partial coverage, not a complete search of every requested city.
- Collection stops before the run timeout, with the status
Stopped before the run timeout; saved N listings. Increase the timeout to collect more. - A run with no saved listings fails with a plain status message instead of returning a silent empty dataset. An empty search page is checked a second time before it is accepted.
FAQ
How fresh is the data? Listings are read from 99acres.com live during each run. Nothing is cached between runs.
Which cities are supported? Any city 99acres.com covers. Bangalore, Mumbai, Delhi, Pune, Hyderabad and Chennai are mapped; other names are converted to the site's city format, so use the name as 99acres.com writes it.
Can I collect rentals? Yes. Set operation to rent.
Why is a price null? The listing either states "price on request" or
shows only a per-area rate. In the second case the rate is available in
price_per_sqft_inr.
How many pages does a run fetch? Five per city by default. Lower
maxPages to 1 to fetch only the first page of each city, or raise it up to
10.
Can I run it on a schedule? Yes. Save your input as a task and add a
schedule. Each run returns the listings online at that moment; compare
listing_key values between runs to find new and removed listings.
Which export formats are available? JSON, CSV, Excel, XML and the other dataset formats Apify offers, or read the dataset from your own code with the Apify API.
Price
$0.0006 per listing delivered, plus $0.00005 per run start. The run-start event is charged per GB of memory; the default 1024 MB run is one start event. The start is charged even if the run saves no results. Platform usage is included in these prices.
Worked costs: a 50-listing run is about $0.03; a 200-listing run (the per-run maximum) is about $0.12; 1,000 listings over five runs cost about $0.60.
For help, contact Apify Support and include the run URL.