# 99acres — India property listings for sale, rent and PG, with lakh/crore prices in rupees, area by type, locality, poster and new-project units; then one listing in full: amenities, RERA, photos, specifications and the advertiser.

> Search 99acres listings by city, locality or free text, for sale, rent or PG, residential or commercial, with the filters the source applies itself (BHK, property type, price, area, poster, construction status, resale/new booking, furnishing, verified, posting age). 25 rows a page by default, up to 50. Each row says whether it is a featured placement, a builder's new-project unit or an ordinary listing. 🔴 Needs one of city_id, locality_id or query. No sort parameter is offered: none of the source's sort keys changed the order.
> ReefAPI engine `99acres` · 2 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/99acres/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/99acres/v1/search — 3 credits
Search 99acres listings by city, locality or free text, for sale, rent or PG, residential or commercial, with the filters the source applies itself (BHK, property type, price, area, poster, construction status, resale/new booking, furnishing, verified, posting age). 25 rows a page by default, up to 50. Each row says whether it is a featured placement, a builder's new-project unit or an ordinary listing. 🔴 Needs one of city_id, locality_id or query. No sort parameter is offered: none of the source's sort keys changed the order.

**Parameters:**
- `city_id` (integer, optional) — The source's numeric city id: 19 Pune, 12 Mumbai, 1 Delhi / NCR (measured). Any search echoes the resolved city in meta.resolved.cities, and `query` resolves a city or locality name for you. One of city_id, locality_id or query is required.
- `locality_id` (string, optional) — One or more locality ids, comma-separated (Baner, Pune = 1074). Every row carries its locality_id; meta.facets.LOCALITY_ID lists the city's localities with counts.
- `query` (string, optional) — Free text the source resolves itself to a city, locality or project ('mumbai', 'baner'). The resolution it applied is echoed in meta.resolved. Text the source cannot place is refused (INVALID_PARAM).
- `transaction` (enum, optional, default "buy") — buy, rent or pg (paying guest / co-living). Rent and PG prices are monthly. [one of: buy, rent, pg]
- `segment` (enum, optional, default "residential") — residential or commercial. [one of: residential, commercial]
- `property_type` (string, optional) — The source's property-type id(s), comma-separated: 1 Residential Apartment, 2 Independent House/Villa, 3 Residential Land, 4 Builder Floor, 5 Farm House, 22 Serviced Apartment, 90 Studio Apartment (residential facet, 2026-10-14). Commercial ids differ — the `facets` block of any commercial search lists them with counts.
- `bedrooms` (string, optional) — BHK count(s), comma-separated: 1-9 or 9+. '2,3' returns 2 BHK and 3 BHK.
- `price_min` (integer, optional) — Minimum price in rupees (monthly rent for rent/pg). The source filters on its own price steps (5 L, 10 L … 1 Cr …; 1K … 10 L for rent); the bound is widened to the nearest step and meta.filters_applied says which. The source's band is loose — rows outside it come back flagged `outside_price_filter: true`.
- `price_max` (integer, optional) — Maximum price in rupees (monthly for rent/pg); widened to the nearest step like price_min.
- `area_min_sqft` (integer, optional) — Minimum area in square feet.
- `area_max_sqft` (integer, optional) — Maximum area in square feet.
- `posted_by` (enum, optional) — owner, dealer or builder — who posted the listing. [one of: owner, dealer, builder]
- `construction_status` (enum, optional) — ready_to_move, under_construction or new_launch. [one of: ready_to_move, under_construction, new_launch]
- `sale_type` (enum, optional) — resale or new_booking (sold by the builder). [one of: resale, new_booking]
- `furnishing` (enum, optional) — furnished, semifurnished or unfurnished. [one of: furnished, semifurnished, unfurnished]
- `verified` (boolean, optional) — true = only listings the site marks verified.
- `posted_since_days` (integer, optional) — Only listings posted in the last N days: 1, 3, 7, 15 or 30. [one of: 1, 3, 7, 15, 30]
- `page` (integer, optional, default 1) — Result page (1-based).
- `limit` (integer, optional, default 25) — Rows a page, up to 50 (the source's ceiling). Featured rows come on top of this count on page 1.

**Returns:** listings[{listing_id, spid, url, title, listing_kind (featured|project_unit|listing), product_type, transaction, segment, property_type, property_type_id, bedrooms, bathrooms, balconies, price_inr, price_max_inr, price_is_range, price_display, price_on_request, price_period, price_per_sqft_inr, price_per_unit_text, price_per_unit_inr, price_per_unit_label, price_per_unit_area_type, area{super_area_sqft, super_built_up_area_sqft, built_up_area_sqft, carpet_area_sqft, display_area_type, display_area, display_area_unit, display_area_text, secondary_area_text, area_range_min/max/unit}, locality, locality_id, locality_text, city, city_id, society, building_id, project_id, lat, lng, location_precision, floor, total_floors, furnishing, sale_type, ownership, age, verified, poster_rera_registered, posted_at, updated_at, posted_label, tags[], highlights[], description, photo_url, photo_count, seller{type, label, name, company, photo_url, rera_registered}, outside_price_filter}]; meta.total, meta.pagination, meta.facets (the source's own counts per filter value), meta.resolved, meta.filters_applied, meta.row_kinds

**Example request body:**
```json
{
  "city_id": 19,
  "transaction": "buy",
  "bedrooms": "2",
  "posted_by": "owner"
}
```

### POST https://api.reefapi.com/99acres/v1/listing — 3 credits
One listing in full by its listing_id: price in rupees (and range for project units) with negotiable / all-inclusive flags, brokerage, super / built-up / carpet area with units, plot length and breadth, floor, facing, overlooking, furnishing, ownership, availability, age, amenities, highlights, description, RERA, coordinates, every photo, posting / update / expiry dates and the advertiser (name, company, type, member since, office address, the phone as the site masks it).

**Parameters:**
- `listing_id` (string, required) — The listing_id of a search row (letter + digits, e.g. S94838160), or the listing's full 99acres URL.

**Returns:** listing{listing_id, spid, url, title, heading, transaction, segment, property_type, bedrooms, bathrooms, balconies, price_inr, price_max_inr, price_display, price_text, price_on_request, price_period, price_negotiable, price_all_inclusive, price_per_unit_area_inr, brokerage, area{super_area, super_area_unit, built_up_area, carpet_area, area_text, plot_length, plot_breadth}, floor, total_floors, facing, overlooking, furnishing, ownership, availability, age, sale_type, gated_community, corner_property, amenities[], highlights[], description, locality, city, address, lat, lng, verified, rera_type, rera{}, posted_on, updated_on, expires_on, images[], image_count, seller{type, name, company, member_since, address, phone_masked}}

**Example request body:**
```json
{
  "listing_id": "S94838160"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=99acres
- Human docs page: https://reefapi.com/docs/99acres
- Overview page: https://reefapi.com/99acres-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
