99acres Scraper | Fast & Reliable | $3.5 / 1k avatar

99acres Scraper | Fast & Reliable | $3.5 / 1k

Pricing

$3.49 / 1,000 results

Go to Apify Store
99acres Scraper | Fast & Reliable | $3.5 / 1k

99acres Scraper | Fast & Reliable | $3.5 / 1k

Scrapes detailed real estate listings from 99acres.com, India's leading property portal. Extracts prices, location details, agent/dealer info, and property specs. Fast and reliable, it delivers clean, structured data ready for market analysis, lead generation, and competitor research.

Pricing

$3.49 / 1,000 results

Rating

0.0

(0)

Developer

Fatih Tahta

Fatih Tahta

Maintained by Community

Actor stats

2

Bookmarked

92

Total users

7

Monthly active users

44 days

Issues response

a day ago

Last modified

Share

99acres Scraper

Slug: fatihtahta/99acres-scraper

Overview

99acres Scraper collects structured property listing data from 99acres, including listing identity, property details, pricing, area, location, seller information, media availability, compliance signals, project metadata, and listing tags. 99acres is a major Indian real estate marketplace, making its public listings useful for market intelligence, competitive tracking, lead enrichment, and operational reporting. The actor converts public listing information into repeatable JSON records that can be consumed by analytics, CRM, BI, and data engineering workflows. It is designed for recurring data acquisition where consistent inputs, predictable output structure, and automation readiness matter. Results reflect the public data available at run time and should be validated against your specific business requirements before scaling.

Why Use This Actor

  • Market research and analytics teams: build structured extraction workflows for pricing, availability, property mix, geography, furnishing, seller type, and market movement analysis.
  • Product and content teams: populate comparison pages, internal catalogs, editorial research, and property intelligence products with normalized public listing data.
  • Developers and data engineering teams: feed downstream systems, warehouses, enrichment pipelines, search indexes, and operational reporting jobs with repeatable JSON records.
  • Lead generation and enrichment teams: identify public seller, builder, dealer, and property signals for qualification, segmentation, and CRM enrichment workflows.
  • Monitoring and competitive tracking teams: schedule recurring collection to observe category movement, pricing shifts, new listings, media availability, and verified-property coverage over time.

Common Use Cases

  • Market intelligence: monitor supply, pricing, availability, locations, property types, construction status, and seller distribution across selected markets.
  • Lead generation: build targeted prospect lists from public listings filtered by location, seller type, deal type, property type, price range, or media availability.
  • Competitive monitoring: track changes across residential and commercial listings, builders, dealers, projects, and local market segments.
  • Catalog and directory building: populate internal databases with structured public property records for discovery, comparison, or review workflows.
  • Data enrichment: add current public attributes such as price, area, location, project, furnishing, seller class, and compliance signals to CRM, BI, or analytics datasets.
  • Recurring reporting: schedule periodic runs for dashboards, alerts, regional trend reports, or operational scorecards.

Quick Start

  1. Choose one or more location values that define the cities, localities, or areas you want to collect.
  2. Select a deal_type, such as residential sale, residential rent, commercial sale, or commercial rent.
  3. Add optional filters such as price or rent range, property type, area, bedrooms, seller type, furnishing, verification, RERA signals, photos, or videos.
  4. Set a small limit for the first validation run.
  5. Run the actor in Apify Console and inspect the first dataset records.
  6. Increase coverage, refine filters, or schedule the actor once the output shape matches your workflow.

Input Parameters

Configure the available filters below to define the collection scope.

ParameterTypeDescriptionDefault
locationarray of stringsOne or more city, locality, or area names, such as New Delhi, Mumbai, or Gurgaon. Leave empty only when another supported scope is sufficient for your run.-
deal_typestringMarket segment to collect. Allowed values: residential_sale (Residential Properties For Sale), residential_rent (Residential Properties For Rent), commercial_sale (Commercial Properties For Sale), commercial_rent (Commercial Properties For Rent).-
min_pricestringMinimum sale price in INR for sale searches. Allowed values range from inr_0 (0) through lacs and crores up to inr_100_plus_crores (100+ Crores). Use with sale deal types.-
max_pricestringMaximum sale price in INR for sale searches. Allowed values range from inr_0 (0) through lacs and crores up to inr_100_plus_crores (100+ Crores). Use with sale deal types.-
min_rentstringMinimum monthly rent in INR for rental searches. Allowed values range from inr_1000 (1,000) to inr_10_plus_lac (10+ Lac). Use with rent deal types.-
max_rentstringMaximum monthly rent in INR for rental searches. Allowed values range from inr_1000 (1,000) to inr_10_plus_lac (10+ Lac). Use with rent deal types.-
verified_propertybooleanWhen true, saves only listings marked as verified. When false, includes both verified and unverified listings.false
rera_approvalarray of stringsRERA-related filters. Allowed values: approved_property (RERA approved properties), approved_agent (RERA registered dealers).-
property_typearray of stringsProperty categories to include. Allowed values: all_residential, all_commercial, apartment, house_villa, land, builder_floor, farm_house, shop, office_space, land_institutional_land, mall_space_retail, office_in_business_park, office_in_it_park, warehouse, industrial_land, factory, agricultural_farm_land, business_center, serviced_apartment, showroom, one_rk_studio_apartment.-
min_areaintegerMinimum built-up area in square feet. Listings below this area are excluded.-
max_areaintegerMaximum built-up area in square feet. Listings above this area are excluded.-
bedroom_countarray of stringsResidential bedroom-count filter. Allowed values: any_bhk, one_bhk, two_bhk, three_bhk, four_bhk, five_bhk, six_bhk, seven_bhk, eight_bhk, nine_bhk, ten_bhk.-
contruction_statusarray of stringsConstruction status filter. Allowed values: new_launch, under_construction, ready_to_move.-
seller_typearray of stringsSeller source filter. Allowed values: owner, builder, dealer, featured_dealer.-
purchase_typearray of stringsSale purchase category. Allowed values: resale, new_booking.-
furnishmentarray of stringsFurnishing level filter. Allowed values: unfurnished, semifurnished, furnished.-
with_photobooleanWhen true, saves only listings with photos.false
with_videobooleanWhen true, saves only listings with videos.false
limitintegerMaximum number of listings to save for each location. Minimum value is 1. Leave empty to collect every available matching listing.-

Choosing Inputs

Use location to define the geographic scope first, then use deal_type to choose the market segment. Price filters apply to sale searches, while rent filters apply to rental searches; area values are measured in square feet. Narrower filters such as property type, bedroom count, seller type, verified status, RERA status, furnishing, and media availability produce more targeted datasets, while broader inputs improve discovery. Use limit to control run size: start small for validation, inspect the dataset, then increase the limit once the output quality and coverage match your needs.

Example Inputs

Residential sale market sample

{
"location": ["Hyderabad"],
"deal_type": "residential_sale",
"property_type": ["apartment", "house_villa"],
"min_price": "inr_50_lacs",
"max_price": "inr_2_crores",
"limit": 25
}

Rental listings with media

{
"location": ["Gurgaon"],
"deal_type": "residential_rent",
"bedroom_count": ["two_bhk", "three_bhk"],
"min_rent": "inr_30000",
"max_rent": "inr_1_lac",
"with_photo": true,
"limit": 50
}

Commercial discovery run

{
"location": ["Mumbai"],
"deal_type": "commercial_rent",
"property_type": ["office_space", "shop", "showroom"],
"seller_type": ["owner", "dealer"],
"with_video": false,
"limit": 40
}

Output

Output destination

The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs without post-processing.

Each item contains a stable record envelope plus a type-specific payload. For this actor, listing records are organized around the selected deal_type, such as residential sale, residential rent, commercial sale, or commercial rent.

Record envelope (all items)

Every dataset item includes these stable envelope fields:

  • type (string, required): record type, usually aligned with the listing deal type.
  • id (number, required): stable numeric listing identifier.
  • url (string, required): public listing URL.

Recommended idempotency key: type + ":" + id.

Use the idempotency key for deduplication and upserts when syncing repeated runs into warehouses, CRMs, search indexes, or operational databases. The envelope makes records easier to merge, deduplicate, and sync across repeated runs even when optional listing details change.

Examples

Example: residential_sale (type = "residential_sale")

{
"type": "residential_sale",
"id": 86837014,
"url": "https://www.99acres.com/residential-land-plot-for-sale-in-nishija-akshita-eastern-meadows-ghatkesar-hyderabad-150-sq-yard-to-263-sq-yard-npspid-B86837014",
"source_context": {
"seed_id": "27bbe52e0fcc",
"seed_type": "location",
"seed_value": "Hyderabad",
"canonical_url": "https://www.99acres.com/residential-land-plot-for-sale-in-nishija-akshita-eastern-meadows-ghatkesar-hyderabad-150-sq-yard-to-263-sq-yard-npspid-B86837014",
"page_index": 1,
"domain": "99acres.com",
"scraped_at": "2026-04-22T14:31:43+00:00"
},
"listing": {
"spid": "86837014",
"property_id": "B86837014",
"title": "Residential land / Plot in Ghatkesar, Hyderabad",
"description": "Nishija akshita eastern meadows is a residential development in bommalaramaram, hyderabad. The project is built by nishija akshita infra llp. They provide skillfully designed plots with all necessities.",
"details_url": "https://www.99acres.com/residential-land-plot-for-sale-in-nishija-akshita-eastern-meadows-ghatkesar-hyderabad-150-sq-yard-to-263-sq-yard-npspid-B86837014",
"deal_type": "residential_sale",
"market": "residential",
"property_type": "Residential Land",
"listing_type": "P",
"product_type": "PSEUDO_LISTING",
"property_number": "7",
"registered_at": "2025-11-24T15:11:08",
"posted_at": "2025-11-24T09:41:08+00:00",
"updated_at": "2025-11-24T09:41:08+00:00",
"expires_at": "2026-08-01T00:00:00",
"registered_display": "4 months ago"
},
"pricing": {
"display_price": "19.53 - 34.25 Lac",
"price_in_words": "Rs. 19.53 Lac to 34.25 Lac",
"min_price": 1953260,
"max_price": 3424717,
"average_price": 2688989,
"price_per_unit_area": 1446.0,
"price_sqft": 1446.0,
"currency": "INR"
},
"property": {
"bathrooms": 0,
"total_floors": 0,
"ownership_label": "Freehold",
"transaction_type": "2"
},
"area": {
"display_area": "1350-2367 sq.ft.",
"secondary_area": "125.42-219.9 sq.m.",
"area_unit": "sq.ft.",
"min_area_sqft": 125.41905,
"max_area_sqft": 219.901401
},
"location": {
"city": "Hyderabad",
"city_id": "269",
"locality": "Ghatkesar, Hyderabad",
"locality_without_city": "Ghatkesar",
"locality_id": "5567",
"building_id": "1148293",
"building_name": "Nishija Akshita Eastern Meadows",
"society_name": "Nishija Akshita Eastern Meadows",
"coordinates": {
"latitude": 17.542541679375,
"longitude": 78.765162690375,
"zoom_level": 16,
"source": "BUILDING"
},
"landmark_summary": [
{
"category": "Education",
"text": "2 Educations"
},
{
"category": "Hospital",
"text": "1 Hospital"
}
],
"total_landmark_count": 5
},
"media": {
"main_image": "https://imagecdn.99acres.com/media1/33857/7/677147563M-1766338203356.jpg",
"photos": [
"https://imagecdn.99acres.com/media1/33857/7/677147563M-1766338203356.jpg"
],
"thumbnails": [
"https://imagecdn.99acres.com/media1/33857/7/677147563T-1766338203055.jpg"
],
"media_count": {
"prop_photo_count": 1,
"prop_video_count": "0"
},
"has_photo": true,
"alt_text": "Nishija Akshita Eastern Meadows Others"
},
"seller": {
"contact_city_id": "269",
"contact_name": "Uma Shankar",
"company_name": "Akshita Infra Projects",
"class_code": "B",
"class_label": "Builder",
"class_heading": "Builder"
},
"compliance": {
"verified": false,
"self_verified": false,
"rera_type": "RERA",
"project_rera_registration_id": "P02000007161",
"registration_status": "REGISTERED",
"poster_rera_registered": "NO",
"dealer_rera_registered": "NO"
},
"project": {
"project_id": "418262",
"project_name": "Nishija Akshita Eastern Meadows",
"builder_id": "0",
"building_id": "1148293",
"building_name": "Nishija Akshita Eastern Meadows",
"amenities": [11, 13, 1, 10, 44, 43, 4, 14]
},
"tags_and_signals": {
"primary_tags": ["FEATURED"],
"secondary_tags": ["UNDER CONSTRUCTION", "NEW BOOKING", "RERA"],
"green_tags": {
"nb": "NO BROKERAGE"
},
"fomo": {
"text": "3 people already contacted this week"
},
"is_new_launch": false,
"is_fresh": false,
"show_whatsapp_icon": true
},
"attributes": {
"features": "26,1,12,3",
"min_area": 1350.0,
"max_area": 2367.0,
"com_area_type": "SUPER_AREA",
"page": 1,
"shortlisted": "N",
"reported": "N"
}
}

Field Reference

Listing records (type = "residential_sale", residential_rent, commercial_sale, or commercial_rent)

  • type (string, required): record type aligned with the listing segment.
  • id (number, required): stable numeric listing identifier.
  • url (string, required): public listing URL.
  • source_context.seed_id (string, optional): identifier for the input scope that produced the record.
  • source_context.seed_type (string, optional): input scope type, such as location input.
  • source_context.seed_value (string, optional): input value associated with the record.
  • source_context.canonical_url (string, optional): canonical public URL for the listing.
  • source_context.page_index (number, optional): result page number associated with the record.
  • source_context.domain (string, optional): source domain.
  • source_context.scraped_at (string, optional): ISO timestamp for when the record was collected.
  • listing.spid (string, optional): listing SPID.
  • listing.property_id (string, optional): property identifier.
  • listing.title (string, optional): listing title.
  • listing.description (string, optional): listing description text.
  • listing.details_url (string, optional): public listing detail URL.
  • listing.deal_type (string, optional): listing segment, such as residential_sale.
  • listing.market (string, optional): residential or commercial market classification.
  • listing.property_type (string, optional): property category label.
  • listing.listing_type / listing.product_type (string, optional): listing classification values.
  • listing.property_number (string, optional): property sequence or reference value when provided.
  • listing.registered_at / posted_at / updated_at / expires_at (string, optional): listing lifecycle timestamps when available.
  • listing.registered_display (string, optional): human-readable listing age.
  • pricing.display_price (string, optional): display price or rent range.
  • pricing.price_in_words (string, optional): price label as displayed by the source.
  • pricing.min_price / max_price / average_price (number, optional): normalized INR price values when available.
  • pricing.price_per_unit_area / price_sqft (number, optional): price per square foot or unit area.
  • pricing.currency (string, optional): currency code, typically INR.
  • property.bathrooms (number, optional): bathroom count.
  • property.total_floors (number, optional): total floor count.
  • property.ownership_label (string, optional): ownership label such as Freehold.
  • property.transaction_type (string, optional): transaction classification value.
  • area.display_area (string, optional): area label as displayed.
  • area.secondary_area (string, optional): secondary area unit label when available.
  • area.area_unit (string, optional): primary area unit, commonly sq.ft..
  • area.min_area_sqft / max_area_sqft (number, optional): normalized area bounds in square feet.
  • location.city / city_id (string, optional): city name and source-provided city identifier.
  • location.locality / locality_without_city / locality_id / locality_name (string, optional): locality labels and identifiers.
  • location.building_id / building_name / society_name (string, optional): project, building, or society identifiers and names.
  • location.coordinates.latitude / longitude (number, optional): geographic coordinates when available.
  • location.coordinates.zoom_level (number, optional): map zoom level when available.
  • location.coordinates.source (string, optional): coordinate source label when provided.
  • location.landmarks (array, optional): nearby landmarks with name, category, order, and category identifier when available.
  • location.landmark_summary (array, optional): summarized landmark counts by category.
  • location.total_landmark_count (number, optional): total number of listed landmarks.
  • media.main_image (string, optional): primary image URL.
  • media.photo_url / medium_photo_url (string, optional): image URLs in available sizes.
  • media.photos / thumbnails (array, optional): image and thumbnail URL arrays.
  • media.media_count.prop_photo_count (number, optional): number of photos.
  • media.media_count.prop_video_count (string or number, optional): number of videos.
  • media.has_photo (boolean, optional): whether the listing includes at least one photo.
  • media.alt_text (string, optional): image alt text when provided.
  • seller.contact_city_id (string, optional): seller contact city identifier.
  • seller.contact_name (string, optional): public seller or representative name.
  • seller.company_name (string, optional): seller, builder, or dealer company name.
  • seller.dealer_photo_url (string, optional): public seller profile image URL when available.
  • seller.class_code / class_label / class_heading (string, optional): seller classification values.
  • seller.profile (object, optional): additional public seller profile details when provided.
  • compliance.verified (boolean, optional): whether the listing is marked verified.
  • compliance.self_verified (boolean, optional): whether self-verification is indicated.
  • compliance.rera_type (string, optional): RERA label when available.
  • compliance.project_rera_registration_id (string, optional): project RERA registration identifier when provided.
  • compliance.registration_status (string, optional): registration status label.
  • compliance.poster_rera_registered / dealer_rera_registered (string, optional): public RERA registration indicators.
  • project.project_id / project_name (string, optional): project identifier and name.
  • project.builder_id (string, optional): builder identifier.
  • project.building_id / building_name (string, optional): building identifier and name.
  • project.amenities (array, optional): amenity identifiers when available.
  • project.project_metadata (object, optional): additional public project metadata when available.
  • tags_and_signals.primary_tags / secondary_tags (array, optional): listing labels such as featured, construction status, booking type, or RERA signals.
  • tags_and_signals.green_tags (object, optional): highlighted listing badges when available.
  • tags_and_signals.tags (array, optional): structured tag objects with identifiers and labels.
  • tags_and_signals.fomo.text (string, optional): demand or engagement signal text when displayed.
  • tags_and_signals.is_new_launch / is_fresh / show_whatsapp_icon (boolean, optional): listing status and contact-related display signals.
  • attributes.features (string, optional): compact feature value when provided.
  • attributes.min_area / max_area (number, optional): area values associated with the listing.
  • attributes.com_area_type (string, optional): commercial or area classification label when available.
  • attributes.page (number, optional): result page associated with the record.
  • attributes.shortlisted / reported (string, optional): listing state indicators when present.

Data Quality, Guarantees, And Handling

  • Structured records: results are normalized into predictable JSON objects for downstream use.
  • Best-effort extraction: fields may vary by region, session, availability, listing type, and target-side UI experiments.
  • Optional fields: null-check optional fields in downstream code, especially media, seller profile, compliance, project, coordinates, and landmark data.
  • Deduplication: use type + ":" + id as the recommended idempotency key.
  • Freshness: results reflect the publicly available data at run time.
  • Repeated runs: use the recommended idempotency key when syncing data into warehouses, CRMs, or search indexes.

Tips For Best Results

  • Start with a small limit to validate the output shape before scaling up.
  • Use one geography or market segment per run when you need cleaner reporting and easier comparisons.
  • Leave optional filters empty when the goal is broad discovery.
  • Add filters gradually to understand how each field changes coverage.
  • Use price filters for sale searches and rent filters for rental searches.
  • Schedule recurring runs for monitoring workflows instead of relying on manual one-off collection.
  • Store records with type + ":" + id to avoid duplicates across repeated runs.

How to Run on Apify

  1. Open the Actor in Apify Console.
  2. Configure the available input fields for the target scope.
  3. Set the maximum number of outputs to collect with limit.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and review the first records.
  6. Download results in JSON, CSV, Excel, or other supported formats.

Scheduling & Automation

Scheduling

Automated Data Collection

Use Apify schedules to run the actor periodically and keep your dataset fresh for monitoring, reporting, or enrichment workflows. Recurring runs are most useful when you store results with stable identifiers and compare changes over time.

  • Navigate to Schedules in Apify Console
  • Create a new schedule, such as daily, weekly, or custom cron
  • Configure input parameters
  • Enable notifications for run completion
  • Add webhooks for automated processing

Integration Options

  • CRM enrichment: sync public property, seller, builder, dealer, location, and compliance attributes into account or lead records.
  • BI dashboards: monitor pricing, availability, property mix, seller distribution, geographic coverage, and listing movement over time.
  • Data warehouses: load normalized listing records into analytics storage for historical trend analysis and operational reporting.
  • Google Sheets or Airtable: review smaller curated datasets, validate leads, or share listing samples with business teams.
  • Webhooks: trigger ingestion, validation, alerts, or notifications after each completed run.
  • Data enrichment pipelines: append current public listing attributes to existing property, market, or CRM datasets.

Export Formats And Downstream Use

Apify datasets can be exported or consumed by downstream systems for analysis, reporting, and operational workflows.

  • JSON: for APIs, applications, and data pipelines
  • CSV or Excel: for spreadsheet workflows and manual review
  • API access: for automated ingestion into internal systems
  • BI and warehouses: for reporting, dashboards, and historical analysis

Performance

Estimated run times:

  • Small runs (< 1,000 outputs): ~3-5 minutes
  • Medium runs (1,000-5,000 outputs): ~5-15 minutes
  • Large runs (5,000+ outputs): ~15-30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record. Highly filtered runs can finish faster, while broad discovery or detail-rich records may take longer.

Limitations

  • Availability depends on what https://www.99acres.com publicly exposes at run time.
  • Some optional fields may be missing on sparse records or certain listing types.
  • Very broad searches may take longer or require higher limits to collect enough matching records.
  • Target-side changes can affect field availability, labels, or naming.
  • Regional, account, or availability differences may change visible results.
  • The actor does not guarantee completeness for every market, listing, or historical change.

Troubleshooting

  • No results returned: check filters, location spelling, property type compatibility, and whether 99acres has matching public records.
  • Fewer results than expected: broaden filters, raise limit, or verify that the selected location and segment contain enough matching listings.
  • Some fields are empty: optional fields depend on what each record publicly provides.
  • Run takes longer than expected: reduce scope, lower limit for validation, or split broad collection into smaller location or segment runs.
  • Output changed: compare the current output with the field reference and report a small sample if support is needed.

FAQ

What data does this actor collect?

It collects public 99acres property listing data, including listing details, prices or rents, area, location, media, seller information, compliance signals, project information, and tags when available.

Can I filter by location, category, price, or other criteria?

Yes. Supported filters include location, deal_type, sale price range, rent range, property type, area range, bedroom count, construction status, seller type, purchase type, furnishing, verification, RERA signals, photos, videos, and limit.

Can I filter by date?

The input schema does not include a date filter. Some output records may include listing lifecycle timestamps such as posted, updated, registered, or expiry dates when those values are publicly available.

Why did I receive fewer results than my limit?

The selected filters may have fewer matching public records than the requested limit. Broaden the location, property type, price or rent range, seller type, media requirements, or verification filters to increase coverage.

Can I schedule recurring runs?

Yes. Use Apify schedules to run the actor daily, weekly, or on a custom cron schedule for recurring monitoring and reporting.

How do I avoid duplicates across runs?

Use type + ":" + id as the idempotency key when storing records in a database, warehouse, CRM, or search index.

Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets support exports in JSON, CSV, Excel, and other formats suitable for analysis and downstream ingestion.

Does this actor collect private data?

The actor is intended to collect publicly available information from 99acres. Users are responsible for using the data lawfully and respecting privacy, platform terms, and applicable regulations.

What should I include when reporting an issue?

Include the input used, the run ID, expected versus actual behavior, and a small output sample if it helps explain the issue. Redact sensitive or private information before sharing.

Compliance & Ethics

Responsible Data Collection

This actor collects publicly available real estate listing information from https://www.99acres.com for legitimate business purposes, including:

  • Real estate research and market analysis
  • Property listing monitoring and operational reporting
  • Lead enrichment and data quality workflows

This section is informational and not legal advice. Users are responsible for ensuring that their use of collected data complies with applicable laws, regulations, platform terms, and internal policies.

Best Practices

  • Use collected data in accordance with applicable laws, regulations, and the target site's terms
  • Respect individual privacy and personal information
  • Use data responsibly and avoid disruptive or excessive collection
  • Do not use this actor for spamming, harassment, or other harmful purposes
  • Follow relevant data protection requirements where applicable, such as GDPR and CCPA

Support

For help, use the actor page or Issues section associated with this actor. Include the input used with sensitive values redacted, the run ID, expected versus actual behavior, and a small output sample when useful. Avoid sharing private data in support requests.