99acres City & BHK Property Listing Scraper
Search 99acres by city, BHK size, property type, locality, and price range to get structured buy and rent listings across 25 major Indian cities, with price, area, location, and poster details.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Search properties for sale or for rent. |
city | string | required | Indian city to search in. |
propertyType | string | optional | Residential property type to search for. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Search properties for sale or for rent. |
city | string | required | Indian city to search in. |
propertyType | string | optional | Residential property type to search for. |
bedrooms | string | optional | Number of bedrooms. Choose '5+' for five or more. |
locality | string | optional | Optional locality or sector name within the city, e.g. 'Sector 43'. The actor looks up the 99acres locality ID. |
localities | array | optional | Optional list of locality names; each is resolved to a 99acres locality ID. |
priceMin | integer | optional | Minimum price in Indian Rupees. Applied while scanning pages because 99acres ignores price query parameters. |
priceMax | integer | optional | Maximum price in Indian Rupees. Applied while scanning pages because 99acres ignores price query parameters. |
furnishing | string | optional | Filter by furnishing status. |
sortBy | string | optional | Result order. 'Newest' is 99acres' recently-updated order (updatedAt), not the original posting date (postedAt). |
includeProjects | boolean | optional | Include new-launch project cards alongside individual listings. Project rows have recordType 'project'. |
includeDetails | boolean | optional | Fetch each property's detail page for RERA numbers, amenity labels, carpet area, floor, furnishing details, and coordinates. Off by default because it adds one residential request per property. |
searchUrls | array | optional | Optional 99acres search URLs: /property-in-<city>-ffid?... or /<n>-bhk-flats-in-<city>-ffid?... When provided, city and filter fields are ignored. |
maxItems | integer | optional | Maximum number of property and project records to return. |
Download the published input schema
View complete JSON
{
"description": "Search 99acres sale and rent listings by city, BHK, property type, locality, and price.",
"properties": {
"bedrooms": {
"default": "",
"description": "Number of bedrooms. Choose '5+' for five or more.",
"editor": "select",
"enum": [
"",
"1",
"2",
"3",
"4",
"5+"
],
"enumTitles": [
"Any",
"1 BHK",
"2 BHK",
"3 BHK",
"4 BHK",
"5+ BHK"
],
"prefill": "2",
"title": "Bedrooms (BHK)",
"type": "string"
},
"city": {
"default": "Delhi",
"description": "Indian city to search in.",
"editor": "select",
"enum": [
"Delhi",
"Mumbai",
"Bangalore",
"Hyderabad",
"Chennai",
"Kolkata",
"Pune",
"Ahmedabad",
"Jaipur",
"Noida",
"Gurugram",
"Navi Mumbai",
"Thane",
"Ghaziabad",
"Faridabad",
"Lucknow",
"Surat",
"Indore",
"Bhopal",
"Nagpur",
"Vadodara",
"Chandigarh",
"Coimbatore",
"Kochi",
"Visakhapatnam"
],
"enumTitles": [
"Delhi",
"Mumbai",
"Bangalore",
"Hyderabad",
"Chennai",
"Kolkata",
"Pune",
"Ahmedabad",
"Jaipur",
"Noida",
"Gurugram",
"Navi Mumbai",
"Thane",
"Ghaziabad",
"Faridabad",
"Lucknow",
"Surat",
"Indore",
"Bhopal",
"Nagpur",
"Vadodara",
"Chandigarh",
"Coimbatore",
"Kochi",
"Visakhapatnam"
],
"prefill": "Noida",
"title": "City",
"type": "string"
},
"furnishing": {
"default": "",
"description": "Filter by furnishing status.",
"editor": "select",
"enum": [
"",
"Furnished",
"Unfurnished",
"Semi-furnished"
],
"enumTitles": [
"Any",
"Furnished",
"Unfurnished",
"Semi-furnished"
],
"prefill": "",
"title": "Furnishing",
"type": "string"
},
"includeDetails": {
"default": false,
"description": "Fetch each property's detail page for RERA numbers, amenity labels, carpet area, floor, furnishing details, and coordinates. Off by default because it adds one residential request per property.",
"prefill": false,
"title": "Include detail-page enrichment",
"type": "boolean"
},
"includeProjects": {
"default": true,
"description": "Include new-launch project cards alongside individual listings. Project rows have recordType 'project'.",
"prefill": false,
"title": "Include new-launch projects",
"type": "boolean"
},
"localities": {
"description": "Optional list of locality names; each is resolved to a 99acres locality ID.",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Localities (multiple)",
"type": "array"
},
"locality": {
"description": "Optional locality or sector name within the city, e.g. 'Sector 43'. The actor looks up the 99acres locality ID.",
"editor": "textfield",
"title": "Locality",
"type": "string"
},
"maxItems": {
"default": 50,
"description": "Maximum number of property and project records to return.",
"maximum": 1000,
"minimum": 1,
"prefill": 3,
"title": "Max items",
"type": "integer"
},
"mode": {
"default": "searchForSale",
"description": "Search properties for sale or for rent.",
"editor": "select",
"enumSuggestedValues": [
"searchForSale",
"searchForRent"
],
"enumTitles": [
"For sale",
"For rent"
],
"prefill": "searchForRent",
"title": "Listing type",
"type": "string"
},
"priceMax": {
"description": "Maximum price in Indian Rupees. Applied while scanning pages because 99acres ignores price query parameters.",
"maximum": 999999999,
"minimum": 0,
"title": "Max price (INR)",
"type": "integer"
},
"priceMin": {
"description": "Minimum price in Indian Rupees. Applied while scanning pages because 99acres ignores price query parameters.",
"maximum": 999999999,
"minimum": 0,
"title": "Min price (INR)",
"type": "integer"
},
"propertyType": {
"default": "Residential Apartment",
"description": "Residential property type to search for.",
"editor": "select",
"enumSuggestedValues": [
"Residential Apartment",
"Independent House",
"Villa",
"Residential Plot",
"Independent Floor",
"Studio Apartment",
"Farm House"
],
"enumTitles": [
"Residential apartment",
"Independent house",
"Villa",
"Residential plot / land",
"Independent / builder floor",
"Studio apartment",
"Farm house"
],
"prefill": "Residential Apartment",
"title": "Property type",
"type": "string"
},
"searchUrls": {
"description": "Optional 99acres search URLs: /property-in-<city>-ffid?... or /<n>-bhk-flats-in-<city>-ffid?... When provided, city and filter fields are ignored.",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Search URLs",
"type": "array"
},
"sortBy": {
"default": "relevance",
"description": "Result order. 'Newest' is 99acres' recently-updated order (updatedAt), not the original posting date (postedAt).",
"editor": "select",
"enum": [
"relevance",
"newest"
],
"enumTitles": [
"Relevance",
"Newest first"
],
"prefill": "relevance",
"title": "Sort by",
"type": "string"
}
},
"required": [
"mode",
"city"
],
"schemaVersion": 1,
"title": "99acres Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
properties | string | optional | Dataset containing all scraped 99acres property and project records. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One record per 99acres property listing or new-launch project, with price, area, BHK, locality, seller, images, amenities, floor, furnishing, coordinates, and URL.",
"properties": {
"properties": {
"description": "Dataset containing all scraped 99acres property and project records.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "99acres property listings",
"type": "string"
}
},
"title": "99acres City & BHK Property Listing Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Property Listings",
"transformation": {
"fields": [
"title",
"price",
"priceValue",
"area",
"areaSqft",
"bedrooms",
"propertyType",
"city",
"locality",
"sellerType",
"postedAt",
"latitude",
"longitude",
"recordType",
"propertyUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
99acres City & BHK Property Listing Scraper
Pull live 99acres sale and rent listings for a city, BHK size, property type, locality, and price band. Every row is a structured property record with the asking price, area, seller details, photos, amenity IDs, floor, furnishing, and map coordinates — plus optional new-launch project cards.
What this actor does
- Searches 99acres for sale or rent across 25 Indian cities, from Delhi and Mumbai to Noida, Pune, Bangalore, Gurugram, and Kochi.
- Filters by BHK, residential property type, locality, furnishing, and price. Localities are resolved to 99acres' own location IDs, so names like
Sector 43work instead of silently returning the whole city. - Returns one row per listing with title, price text and numeric INR value, area in square feet and square metres, BHK, bathrooms, property type, locality, city, project/society, seller name and type, posted date, images, video, amenity IDs, floor, furnishing, availability, coordinates, and RERA registration flags.
- Adds new-launch project cards when
includeProjectsis on; each project row has its builder, price range, configurations, construction status where the card shows it, possession, photos, and project URL. Listings are collected first; project cards are appended only up to 20% ofmaxItems, so they never crowd out individual listings. - Accepts pasted 99acres search URLs for filters configured on the site, and supports 99acres' date-descending (recently updated) sort.
- Omits fields 99acres does not show for a listing instead of writing
nullor a placeholder.
Output per property
propertyId,propId— 99acres listing identifierstitle,propertyType,bedrooms,bathrooms,balconiesprice(as displayed),priceValue,priceMaxValue,pricePerSqftarea(as displayed),areaSqft,areaSqm,areaTypecity,locality,projectNamepostedBy,sellerName,sellerCompany,sellerTypepostedAt,updatedAt,availability,statusTagsfurnishing,floor,totalFloors,facingdescription,images[],imageCount,videoUrlamenityIds[]latitude,longitudereraRegistered,reraDealerRegisteredtransactionType,dealTypepropertyUrl,sourceUrlrecordType: "property",scrapedAt
With includeDetails: true, property rows also include: reraNumber, dealerReraNumber, amenities[] (labels), carpetAreaSqft, superBuiltupAreaSqft, floorLabel, furnishingDetails, flooring, ownership, ageLabel, deposit, priceNegotiable, powerBackup, waterSource, petFriendly, brokerage, availabilityText, availabilityDate, detailsEnriched.
Output per project (includeProjects: true)
recordType: "project", projectId, title, subtitle, builder, priceMin, priceMax, priceLabel, pricePerSqft, areaType, configurations[] (bhk, area, price), constructionStatus (when shown), possession, locality, city, latitude, longitude, images[], imageCount, tags[], description, projectUrl, isNewLaunch, reraTag, scrapedAt.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | searchForSale |
searchForSale or searchForRent |
city |
string | Delhi |
One of the 25 supported Indian cities |
propertyType |
string | Residential Apartment |
Residential apartment, independent house, villa, plot, independent floor, studio, or farm house |
bedrooms |
string | any | 1–4 or 5+ BHK |
locality |
string | – | One locality name within the city |
localities |
array | – | Multiple locality names |
priceMin |
integer | – | Minimum price in INR |
priceMax |
integer | – | Maximum price in INR |
furnishing |
string | any | Furnished, unfurnished, or semi-furnished |
sortBy |
string | relevance |
relevance or newest |
includeProjects |
boolean | true |
Add new-launch project cards (they count toward maxItems; set false for listings only) |
searchUrls |
array | – | Full 99acres /property-in-<city>-ffid?... search URLs |
maxItems |
integer | 50 |
Record cap, 1–1,000 |
Example: 2 BHK rentals in Noida
{
"mode": "searchForRent",
"city": "Noida",
"propertyType": "Residential Apartment",
"bedrooms": "2",
"maxItems": 30
}
Example: family homes in a locality
{
"mode": "searchForSale",
"city": "Bangalore",
"propertyType": "Independent House",
"bedrooms": "3",
"localities": ["HSR Layout", "Koramangala"],
"priceMin": 10000000,
"priceMax": 30000000,
"maxItems": 50
}
Example: newest furnished rentals
{
"mode": "searchForRent",
"city": "Pune",
"bedrooms": "2",
"furnishing": "Semi-furnished",
"sortBy": "newest",
"includeProjects": false,
"maxItems": 40
}
Example: enrich property details
{
"mode": "searchForRent",
"city": "Noida",
"bedrooms": "2",
"includeProjects": false,
"includeDetails": true,
"maxItems": 5
}
Example: reuse a search URL
{
"searchUrls": [
"https://www.99acres.com/property-in-mumbai-ffid?preference=R&res_com=R&bedroom_num=2&page=1"
],
"maxItems": 25
}
Use cases
- Market research — compare asking prices and inventory across cities, BHK sizes, and localities.
- Investment screening — build a shortlist by price band, property type, and furnishing.
- Rental tracking — refresh a neighbourhood feed with current rents and new listings.
- Lead sourcing — collect public seller names, seller types, and active listing URLs.
- PropTech feeds — populate dashboards, comparison pages, or CRMs with clean listing records.
- New-launch monitoring — track project price ranges and possession dates alongside resale inventory.
FAQ
Do I need a 99acres login or cookies? No. The actor reads public search results and needs no account, cookie, or API key.
Do I need to configure a proxy? No. The actor chooses a working connection to 99acres automatically. Just fill in the input and run it.
Why are some fields missing from a record?
99acres does not show every field for every listing. Missing values are omitted rather than sent as null or a placeholder.
What does includeDetails add, and what does it cost?
It fetches the individual property page for RERA numbers, amenity labels, carpet area, floor and furnishing details, and coordinates. Each property needs one extra residential request, so keep maxItems small when it is on.
Why does a price filter sometimes take longer? 99acres ignores price query parameters, so the actor applies your price range while it scans result pages. A narrow band may need more pages than a broad one.
What is the difference between a property row and a project row?
recordType: "property" is an individual resale or rental listing. recordType: "project" is a new-launch project card with a builder, price range, and unit configurations. Set includeProjects to false for listings only.
Why do some localities return no rows? The actor resolves locality names from the city's own locality list, not from the filtered result page. A name can resolve correctly and still return no rows if that BHK, property type, furnishing, or price band has no listings there. The actor says so instead of returning the whole city.
Why doesn't "Newest first" match the posted date?
99acres' date sort is a recently updated order. Use updatedAt when you need to compare the sort order; postedAt is the original listing date.
Does the actor support commercial property? This revision covers residential sale and rent. Commercial property types are not exposed yet.
Is this actor affiliated with 99acres? No. This is an independent, third-party actor that reads 99acres' public search pages and is not operated by or affiliated with 99acres.com.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build GfLPEtbM3CuOX9T6U. Documentation is regenerated from the default published build; private drafts are not included.