99acres Scraper avatar

99acres Scraper

Pricing

from $1.20 / 1,000 dataset items

Go to Apify Store
99acres Scraper

99acres Scraper

Scrape property listings from 99acres.com using search queries or start URLs. Extract prices, amenities, seller/agent details, and optional listing-page extras.

Pricing

from $1.20 / 1,000 dataset items

Rating

0.0

(0)

Developer

Farhan Ali

Farhan Ali

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

99acres Scraper creates a structured dataset of property listings collected from 99acres.com. Each listing item is one buy or rent card and can include price in Indian rupees, area, BHK, locality, city, amenities, and the seller on the card. Agent extraction also writes separate dealer, owner, and builder rows. Query with a location such as Delhi or a 99acres search or listing URL, and set category, segment, property type, BHK, and price bounds. Control the listing limit with maxItems. Retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, XML, or another supported format.

99acres Scraper — input to structured data

Dataset at a glance

PropertyValue
Source99acres.com
Record unitOne property listing, or one agent row when agent extraction is on
Input methodsLocation search query or a 99acres search or listing URL
Main identifierslistingId on listings; agentId on agent rows
DeliveryApify Dataset and API
Export formatsJSON, CSV, Excel, XML, and other Apify dataset exports
Update modelFresh records per Actor run
PricingPay per event: dataset-item and optional listing-details and agent-details at $0.001 each

Coverage and available records

The Actor collects public 99acres buy and rent inventory for residential or commercial searches.

  • searchQueries takes a location such as Delhi, Whitefield Bangalore, or Bandra Mumbai. The first city or locality match is used.
  • startUrls accepts a search URL or a listing page whose path contains -spid- or -npxid-.
  • At least one query or start URL is required. The Actor raises an error when both are empty.
  • category is buy or rent. A value of sale is treated as buy. Filters apply to query searches and to start URLs that do not already encode a category.
  • segment is residential or commercial.
  • Property types cover apartment, builder floor, house, villa, plot, studio, farmhouse, serviced apartment, office, shop, and warehouse. An empty list does not restrict type.
  • BHK accepts 1 through 5, where 5 means 5 or more. Furnishing accepts furnished, semi-furnished, and unfurnished.
  • postedBy restricts results to owner, dealer, or builder. possession accepts ready to move or under construction.
  • minPrice and maxPrice are Indian rupees.
  • maxItems caps listing rows. 0 means no listing cap. Agent rows do not count toward this cap.
  • extractListingDetails opens listing pages for description extras, photos, reviews, and page amenities. listing-details is charged only when those extras are attached. Search-card fields are always returned. In the stored sample, detailsFetched is true while description is still null, so a detail fetch does not guarantee a description.
  • extractAgentDetails writes one dataset row per unique dealer, owner, or builder from listing posters and featured-dealer widgets. Each of those rows is charged as agent-details. Seller fields on the listing card are still included.
  • The stored sample is a Delhi residential buy search. It includes builder-floor listings and project cards. It does not demonstrate every property type or city.

The Actor does not keep historical snapshots. Pagination follows the search until the result set ends or maxItems listing rows are saved.

Data dictionary

Listing records

Types and examples come from stored listing rows. Nullable is Yes when any stored listing omitted the key or set it to null.

FieldTypeNullableDescriptionExample
recordTypestringNoRecord kind. listing for a property row; agent for a dealer, owner, or builder row.listing
listingTypestringNoSource listing kind. Observed value on property rows: property.property
listingIdstringNo99acres listing id, such as H93752656. Best key for a property row.E4506387
urlstringNoAbsolute listing URL. Null on some agent rows.https://www.99acres.com/4-bhk-bedroom-independent-builder-floor-for-s...
titlestringNoListing title from the search card.4 BHK Builder Floor in Jasola, Delhi
subtitlestringYesSubtitle. Null in the stored listing sample.1, 2, 3, 4 BHK Builder Floor in Chattarpur, South Delhi
propertyTypestringNoDisplay type, such as Independent/Builder Floor or Project.Independent/Builder Floor
categorystringNobuy or rent, from the Actor input and search.buy
segmentstringNoresidential or commercial.residential
preferencestringNoSource preference code. Observed sale value: S.S
priceintegerNoPrice in Indian rupees as an integer. Project rows can use the lower bound.49500000
priceMaxintegerNoUpper price in INR when the source sends a range. Otherwise the same as price.49500000
priceDisplaystringNoFormatted price text from the source, such as 13 Cr.4.95 Cr
pricePerSqftnumberYesPrice per square foot as a number. Null when the source omits it.152307.0
bedroomsintegerYesBedroom count. Null on project cards that do not state a single BHK.4
bathroomsintegerYesBathroom count. Null when omitted.3
balconiesintegerYesBalcony count. Null when omitted.3
areaValuenumberYesArea number. The stored sample uses square feet in areaDisplay.325.0
areaUnitstringYesArea unit code. Null in the stored sample; use areaDisplay for the labeled area.sq.yards
areaDisplaystringYesFormatted area, such as 5200 sqft.2925 sqft
carpetAreanumberYesCarpet area number. Null when omitted.5200.0
builtUpAreanullYesBuilt-up area number. Null in the stored sample.null
floorstringYesFloor label. The stored builder-floor row uses B.1
totalFloorsintegerYesTotal floors as an integer. Null when omitted.4
furnishingstringYesFurnishing text, such as Semifurnished.Semifurnished
addressstringNoAddress or locality line.Jasola, Delhi
localitystringNoLocality text.Jasola, Delhi
citystringNoCity or district label, such as South Delhi.South Delhi
projectNamestringYesProject name. Null when the card is not a named project.Jasola Vihar PKT 1 & 2
builderNamestringYesBuilder name. Null when omitted.Ambe Estate
latitudenumberNoLatitude in decimal degrees.28.5475733
longitudenumberNoLongitude in decimal degrees.77.2951057
postedDatestringYesSource posted time, ISO-8601.2026-08-22T10:33:31+00:00
updatedAtstringYesSource updated time, ISO-8601.2026-08-03T12:04:39+00:00
possessionStatusstringYesPossession text. Null in the stored sample.Ready To Move
isVerifiedbooleanYesTrue when the card is marked verified.false
isPremiumbooleanNoTrue when the card is marked premium.false
descriptionstringYesDescription text. Null in the stored sample even on a row with detailsFetched true.Buy a home of your own in Ambe Homes which offers 1,2 BHK Independent...
imageUrlstringNoPrimary image URL.https://imagecdn.99acres.com/media1/17843/14/356874146T-1755231182605...
imageUrlsarrayNoImage URL list.https://imagecdn.99acres.com/media1/17843/14/356874146T-1755231182605.jpg, https://imagecdn.99acres.com/media1/17843/14/356874146M-1755231183052.jpg, https://imagecdn.99acres.com/media1/17843/14/356874232M-1755228976177.jpg (+4)
tagsarrayNoTag strings from the card.FEATURED, READY TO MOVE, RESALE
amenitiesarrayNoAmenity strings from the card or detail page.21, 48, 50 (+20)
sellerobjectNoSeller object from the card. See the seller table.object
postedBystringNoWho posted the listing, such as Dealer or Builder.Dealer
sourceQuerystringNoSearch query that produced the row, such as Delhi.Delhi
sourceUrlstringNoSearch or start URL that produced the row.https://www.99acres.com/search/property/buy/delhi?city=1075722&prefer...
detailsFetchedbooleanNoTrue when the Actor attached listing-page extras on this row.true
agentDetailsFetchedbooleanNoTrue when agent extraction ran for the search that produced this listing.true
scrapedAtstringNoUTC timestamp written by the Actor, ISO-8601.2026-09-08T16:14:08.143185+00:00

Seller object

seller is present on stored listing rows.

FieldTypeNullableDescriptionExample
namestringNoSeller or firm name on the card.krish chugh
firmNamestringNoFirm name.Krishna Associates And Builders
postedBystringNoPoster role, such as Dealer.Dealer
photoUrlstringYesSeller photo URL.https://imagecdn.99acres.com/media1/12454/7/249087249O-1600331996585....
reraRegisteredbooleanYesTrue when the card marks the seller as RERA registered.false

Agent records

These rows are written only when extractAgentDetails is true. The example is a stored builder row from the Delhi search. Several contact fields are null in that sample.

FieldTypeNullableDescriptionExample
recordTypestringNoAlways agent on these rows.agent
agentIdstringNoDeduplication key. Falls back to firm or name when the source has no id. The stored sample uses the firm name.Krishna Associates And Builders
namestringNoAgent, dealer, owner, or builder name.krish chugh
firmNamestringNoFirm name. May equal name.Krishna Associates And Builders
postedBystringNoRole label, such as Builder.Dealer
urlnullYesProfile URL. Null when the source has none.null
imageUrlstringYesPhoto URL. Null when omitted.https://imagecdn.99acres.com/media1/12454/7/249087249O-1600331996585....
phonePartialnullYesPhone text exposed by the source. Null in the stored sample.null
reraRegisteredbooleanYesRERA flag. Null when the source does not send a boolean.false
citystringNoCity label carried from the listing or widget.South Delhi
totalListingsnullYesListing count. Null when omitted.null
sourcestringNoWhere the agent was found. Observed value: listing.listing
sourceQuerystringNoSearch query that produced the agent.Delhi
scrapedAtstringNoUTC timestamp written by the Actor, ISO-8601.2026-09-08T16:14:12.324805+00:00

Deduplicate listing rows on listingId. Deduplicate agent rows on agentId. When the source has no agent id, the Actor uses the firm or name, so two different people with the same firm label can collapse to one row.

Example dataset record

Listing row from searchQueries: ["Delhi"], category buy, segment residential, with listing details and agent extraction enabled. The search URL is the sourceUrl on the record.

{
"recordType": "listing",
"listingType": "property",
"listingId": "H93752656",
"url": "https://www.99acres.com/4-bhk-bedroom-independent-builder-floor-for-sale-in-green-park-extension-delhi-south-5200-sqft-spid-H93752656",
"title": "4 BHK Triplex Builder Floor in Green Park Extension, Delhi",
"subtitle": null,
"propertyType": "Independent/Builder Floor",
"category": "buy",
"segment": "residential",
"preference": "S",
"price": 130000000,
"priceMax": 130000000,
"priceDisplay": "13 Cr",
"pricePerSqft": 25000.0,
"bedrooms": 4,
"bathrooms": 5,
"balconies": 4,
"areaValue": 5200.0,
"areaUnit": null,
"areaDisplay": "5200 sqft",
"carpetArea": 5200.0,
"builtUpArea": null,
"floor": "B",
"totalFloors": 4,
"furnishing": "Semifurnished",
"address": "Green Park Extension, Delhi",
"locality": "Green Park Extension, Delhi",
"city": "South Delhi",
"projectName": null,
"builderName": null,
"latitude": 28.561444444444444,
"longitude": 77.20130833333333,
"postedDate": "2026-08-22T10:33:31+00:00",
"updatedAt": "2026-08-24T09:38:36+00:00",
"possessionStatus": null,
"isVerified": true,
"isPremium": false,
"description": null,
"imageUrl": "https://imagecdn.99acres.com/media1/41208/1/824161101T-1787395135113.jpg",
"imageUrls": [
"https://imagecdn.99acres.com/media1/41208/1/824161101T-1787395135113.jpg",
"https://imagecdn.99acres.com/media1/41208/1/824161101M-1787395135336.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160449M-1787395138849.jpg",
"https://imagecdn.99acres.com/media1/41207/19/824159927M-1787395126088.jpg",
"https://imagecdn.99acres.com/media1/41207/19/824159961M-1787395125049.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160011M-1787395128310.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160025M-1787395129719.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160441M-1787395136995.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160483M-1787395136835.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160541M-1787395135724.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160577M-1787395130576.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160751M-1787395125998.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160437M-1787395132541.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160439M-1787395133961.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160545M-1787395140534.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160657M-1787395130939.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160075M-1787395134449.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160091M-1787395130756.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160119M-1787395136042.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160169M-1787395126236.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160219M-1787395118370.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160239M-1787395121365.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160397M-1787395129335.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160043M-1787395133042.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160099M-1787395132515.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160109M-1787395131312.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160203M-1787395126552.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160253M-1787395123185.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160329M-1787395128943.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160347M-1787395130677.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160379M-1787395130449.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160693M-1787395122385.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160187M-1787395133308.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160299M-1787395125793.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160313M-1787395132957.jpg",
"https://imagecdn.99acres.com/media1/41208/0/824160601M-1787395138188.jpg",
"https://imagecdn.99acres.com/media1/41208/1/824161009M-1787395137514.jpg",
"https://imagecdn.99acres.com/media1/41208/1/824161073M-1787395133539.jpg"
],
"tags": [
"FEATURED",
"READY TO MOVE",
"RESALE",
"Verified"
],
"amenities": [
"21",
"50",
"51",
"52",
"5",
"10",
"2",
"17",
"9",
"19",
"36",
"44",
"46",
"45",
"29",
"3",
"12",
"103"
],
"seller": {
"name": "GLOBAL PROPERTY",
"firmName": "GLOBAL PROPERTY",
"postedBy": "Dealer",
"photoUrl": "https://imagecdn.99acres.com/media1/21051/9/421029512O-1683101489785.jpg",
"reraRegistered": false
},
"postedBy": "Dealer",
"sourceQuery": "Delhi",
"sourceUrl": "https://www.99acres.com/search/property/buy/delhi?city=1075722&preference=S&res_com=R",
"detailsFetched": true,
"agentDetailsFetched": true,
"scrapedAt": "2026-09-08T16:14:08.142635+00:00"
}

Agent row from the same run:

{
"recordType": "agent",
"agentId": "Ambe Estate",
"name": "Ambe Estate",
"firmName": "Ambe Estate",
"postedBy": "Builder",
"url": null,
"imageUrl": null,
"phonePartial": null,
"reraRegistered": null,
"city": "South Delhi",
"totalListings": null,
"source": "listing",
"sourceQuery": "Delhi",
"scrapedAt": "2026-09-08T16:15:19.493664+00:00"
}

Query and input reference

InputTypeRequiredDefaultAccepted valuesDescription
searchQueriesarray of stringsNo—Location textPrimary input. At least one query or start URL is required at run time.
startUrlsarrayNo—99acres search or listing URLsSearch URL or a listing page with -spid- or -npxid-.
categorystringNobuybuy, rentSale is accepted and treated as buy.
segmentstringNoresidentialresidential, commercialHomes or commercial inventory.
propertyTypesarray of stringsNo—apartment, builder_floor, house, villa, plot, studio, farmhouse, serviced_apartment, office, shop, warehouseEmpty means all types.
bedroomsarray of stringsNo—1, 2, 3, 4, 55 means 5 or more BHK.
furnishTypesarray of stringsNo—furnished, semi_furnished, unfurnishedFurnishing filter.
postedBystringNoemptyempty, owner, dealer, builderPoster restriction. Empty means anyone.
possessionstringNoemptyempty, ready_to_move, under_constructionPossession filter.
minPriceintegerNo—0 or greater, INRMinimum price in rupees.
maxPriceintegerNo—0 or greater, INRMaximum price in rupees.
extractListingDetailsbooleanNofalsetrue, falseOpen listing pages. Charges listing-details only when extras are attached.
extractAgentDetailsbooleanNofalsetrue, falseWrite unique agent rows charged as agent-details.
maxConcurrencyintegerNo51 to 10Parallel listing-detail workers.
maxItemsintegerNo00 or greaterMaximum listing rows. Agent rows are not counted. 0 means no cap.
proxyConfigurationobjectNoApify residentialApify proxy inputConnection used for 99acres requests. Residential is the input default.

Minimal request:

{
"searchQueries": ["Delhi"],
"category": "buy",
"maxItems": 20
}

Request with details, agents, and a price bound:

{
"searchQueries": ["Whitefield Bangalore"],
"category": "buy",
"segment": "residential",
"propertyTypes": ["apartment"],
"bedrooms": ["2", "3"],
"minPrice": 5000000,
"maxPrice": 20000000,
"extractListingDetails": true,
"extractAgentDetails": true,
"maxItems": 100,
"maxConcurrency": 5,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Retrieve the data through the API

This is the Apify Actor API. 99acres does not provide this endpoint.

  1. Start datascrapers/99acres-scraper with a JSON input.
  2. Wait until the run finishes, or poll the run status.
  3. Read items from the run's default dataset. Listing rows and agent rows share that dataset. Split them on recordType.
  4. Page the dataset with offset and limit, or export it from the run page.
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("datascrapers/99acres-scraper").call(run_input={
"searchQueries": ["Delhi"],
"category": "buy",
"maxItems": 20,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
listings = [item for item in items if item.get("recordType") == "listing"]
print(listings)

Other languages are listed on the Actor's API tab in Apify Console. Do not put a real token in a URL or in source control.

Export and pipeline examples

DestinationRecommended methodTypical use
PostgreSQL or SupabaseDataset API or a webhook consumerStore listingId for listings and agentId for agents
Google SheetsApify integrationShare a locality price extract
Amazon S3 or other cloud storageScheduled dataset export or an integrationArchive each run's JSON or CSV
A custom applicationDataset items endpointSplit recordType and page a large search

Data quality and record handling

Listing fields come from the 99acres search card. When extractListingDetails is on and extras are attached, those extras are merged onto the same listing and detailsFetched is true. description can still be null after that merge. category and segment reflect the Actor input used for the search.

Within one run, search discovery skips a property id already seen. The id is taken from PROP_ID, then SPID, then projectUnitId, then the heading. The recommended external key is listingId. Agent rows are deduplicated by agentId, then by name plus firm. The stored agent sample uses the firm name as agentId because no separate id was present.

dataset-item is charged for every saved listing. listing-details is charged when detailsFetched is true. agent-details is charged for each saved agent row, and those rows do not use dataset-item. A listing that is not saved is not billed.

Prices are integers in INR plus a separate display string. Do not parse priceDisplay when price is present. Area unit is not always filled; areaDisplay carries the labeled area in the stored sample. Dates postedDate, updatedAt, and scrapedAt are ISO-8601. scrapedAt is the Actor clock in UTC. The other two are source times.

Project cards in the stored sample have null bedrooms and a price range in price and priceMax. Builder-floor cards have a single price and a BHK count.

Pricing and cost examples

The Actor uses pay per event. Every saved listing charges one dataset-item event at $0.001. A listing with attached detail extras also charges one listing-details event at $0.001. Each saved agent row charges one agent-details event at $0.001 and does not charge dataset-item. The same prices apply on every plan tier. There is no separate Actor-start event in this Actor.

Platform usage, including compute and residential proxy traffic, is billed to the run account in addition to these events. Estimates below are event charges only. Agent-row counts depend on how many unique posters the search returns.

RecordsEventsEstimated event cost
1,000 listings, no extras1,000 × dataset-item$1.00
1,000 listings with detail extras1,000 × dataset-item and 1,000 × listing-details$2.00
10,000 listings, no extras10,000 × dataset-item$10.00
10,000 listings with detail extras10,000 × dataset-item and 10,000 × listing-details$20.00

Add $0.001 for each agent row. maxItems caps listing rows, not agent rows.

Limitations and responsible data use

The Actor reads publicly available 99acres pages and the fields those pages expose. It does not return a historical archive. Each run reflects the site at the time of the request. Save datasets yourself if you need a time series.

Values can be missing when 99acres omits them, when a filter matches nothing, or when a listing page adds no extras. Phone values on agent rows are only the text the source exposes, and the stored sample leaves phonePartial null. Site markup and availability can change.

You are responsible for using the dataset in line with 99acres terms, privacy rules, and any contract that applies to your project. This page does not provide a legal conclusion about a particular use.

Dataset questions

What does one dataset item represent?

Either one property listing (recordType listing) or one dealer, owner, or builder (recordType agent). Agent rows appear only when extractAgentDetails is true.

Which field should I use as a unique identifier?

Use listingId for listings. Use agentId for agent rows. agentId may be a firm name when the source has no id.

Are fields nullable or conditional?

Yes. Project cards omit a single BHK. description, areaUnit, builderName, and several agent contact fields are null in the stored sample. Detail extras and agent rows depend on the two extraction switches.

Can I retrieve the records as CSV or JSON?

Yes. Download JSON, CSV, Excel, XML, or another format from the Apify Console export menu, or read JSON through the Dataset API. Split listing and agent rows with recordType before a CSV load if you need one table per entity.

How do I paginate large datasets?

The Actor pages through the 99acres search until maxItems listings are saved or the search ends. After the run, page the Apify dataset with offset and limit.

Does the Actor return historical data?

No. A record is the listing state observed during that run.

What counts as a billable result?

Each saved listing is one dataset-item event at $0.001. Each listing with attached detail extras is an additional listing-details event at $0.001. Each saved agent row is one agent-details event at $0.001. Platform usage is charged separately.

Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.