# 99.co Property Search API Documentation

Search 99.co property listings in Singapore for sale or rent. Filter by property segment and category, location (district, area, MRT station, region or subzone from /autocomplete), price in SGD, bedrooms, bathrooms and floor area in square feet, then sort and page. Each item carries the price, price per square foot, area, bedrooms, bathrooms, tenure, completion year, address and coordinates, nearest MRT with walking time, photos, video, lister contact, posting time, flags and a development_id for /transactions. Filters are applied to every item: the bathrooms filter is applied by Scrappa because upstream only partly honours it, so a page can hold fewer items than limit and search_metadata.filtered_out_count says how many were removed. Streets and developments cannot filter a search. A page past the last one is a valid empty page that keeps the requested page number. A separate listing detail endpoint is deferred: the search item already carries the card data, and the detail page was not reliably reachable in the release soak.

- **Documentation:** [https://scrappa.co/docs/99co-api/99co_search](https://scrappa.co/docs/99co-api/99co_search)
- **API group:** 99.co API
- **Endpoint:** `GET https://scrappa.co/api/99co/v1/search`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `listing_type` | string | Yes | sale or rent. |
| `property_segments` | string | No | residential or commercial. Defaults to residential. |
| `main_category` | string | No | Residential: condo, hdb or landed. Commercial: office. Defaults to the first category of the segment. |
| `location_type` | string | No | district, zone, subway_station, region or subzone, as returned by /autocomplete. Requires location_id. |
| `location_id` | string | No | Location id from /autocomplete, for example dtdistrict09 or sg-mrt-orchard. Requires location_type. Without a location the search covers all of Singapore. |
| `min_price` | integer | No | Minimum price in SGD (monthly rent or sale price). |
| `max_price` | integer | No | Maximum price in SGD. |
| `bedrooms` | string | No | Comma separated bedroom counts, matching any of them: 0 is a studio, 5 means 5 or more. Example: 2,3. Room rentals never match. |
| `bathrooms` | integer | No | Exact bathroom count, 1 to 9. |
| `min_area` | integer | No | Minimum floor area in square feet. |
| `max_area` | integer | No | Maximum floor area in square feet. |
| `sort_by` | string | No | price or posted_at. Without it the order is the 99.co default ranking. |
| `sort_order` | string | No | asc or desc. Defaults to asc. Used together with sort_by. |
| `page` | integer | No | One-based page number, 1 to 5000. Defaults to 1. |
| `limit` | integer | No | Listings per page, 1 to 60. Defaults to 20. |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/99co/v1/search?listing_type=rent&main_category=condo&location_type=district&location_id=dtdistrict09&bedrooms=2%2C3&max_price=6000&limit=10"
```

## Example response

```json
{
    "success": true,
    "data": {
        "items": [
            {
                "id": "o2oMT5dxBjaoEfr97iuirB",
                "url": "https://www.99.co/singapore/rent/property/visioncrest-condo-o2oMT5dxBjaoEfr97iuirB",
                "title": "Visioncrest",
                "listing_type": "rent",
                "property_segment": "residential",
                "main_category": "condo",
                "sub_category": "condo_apartment",
                "sub_category_label": "Apartment",
                "status": "active",
                "description": "Spacious patio and fresh air. Newly painted. 7 mins walk to MRT Somerset and Dhoby Ghaut.",
                "highlights": "Immediate move-in, Spacious Patio, MRT 5 mins",
                "price": 4500,
                "currency": "SGD",
                "price_formatted": "S$ 4,500",
                "area_sqft": 871,
                "area_sqm": 80.92,
                "price_per_sqft": 5.17,
                "bedrooms": 2,
                "is_studio": false,
                "is_room_rental": false,
                "bathrooms": 2,
                "tenure": "Freehold",
                "completed_year": 2007,
                "photo_count": 7,
                "floor_plan_count": 1,
                "address": {
                    "name": "Visioncrest",
                    "line_1": "Visioncrest",
                    "line_2": "39 Oxley Rise \u00b7 D9",
                    "project_name": "Visioncrest",
                    "street_name": "Oxley Rise",
                    "street_number": "39",
                    "postal_code": "238713",
                    "district_number": 9
                },
                "coordinates": {
                    "lat": 1.29825,
                    "lng": 103.84308
                },
                "development_id": "deBww68UZiCQC9buT6HJHn94",
                "cluster_mappings": {
                    "district": [
                        "dtdistrict09"
                    ],
                    "region": [
                        "recentral_region"
                    ],
                    "zone": [
                        "zomuseum"
                    ],
                    "development": [
                        "deBww68UZiCQC9buT6HJHn94"
                    ]
                },
                "nearest_mrt": {
                    "name": "Dhoby Ghaut MRT",
                    "walking_minutes": 4,
                    "line_colors": [
                        "#FFAA31",
                        "#E55244",
                        "#AB59B6"
                    ],
                    "distance_m": 280
                },
                "photos": [
                    {
                        "id": "8yd84qCoWYpQyQJ9ETVVfn",
                        "url": "https://pic2.99.co/v3/8yd84qCoWYpQyQJ9ETVVfn?sampling=lanczos&height=300&width=400",
                        "caption": "Living Room",
                        "category": "Living Room"
                    }
                ],
                "photo_url": "https://pic2.99.co/v3/8yd84qCoWYpQyQJ9ETVVfn?sampling=lanczos&height=300&width=400",
                "video": {
                    "id": "k5ky8Bd028sQXCESFOpODm2uOZScMbLYH7UY3Le00aJWk",
                    "source": "mux",
                    "thumbnail_url": "https://image.mux.com/GHl62cirBKYZfsxPA1Hd88SldZptOO64EzbyAQUPWXs/thumbnail.jpg?time=0",
                    "duration_seconds": 23.01,
                    "aspect_ratio": "9:16"
                },
                "lister": {
                    "id": "WfuFGpVjiYGShszemCZfNn",
                    "name": "Agent Name",
                    "phone": "+6560000000",
                    "whatsapp": "+6560000000",
                    "photo_url": "https://pic2.99.co/v3/CrMLvaT2quR8Nr3wUqkMVj?height=120&width=120",
                    "is_online": false
                },
                "posted_at": {
                    "raw": 1792934103417690,
                    "iso": "2026-10-25T14:15:03+00:00"
                },
                "posted_label": "2 hrs ago",
                "created_label": "4 years ago",
                "flags": {
                    "has_video": true,
                    "is_must_see": true
                },
                "tags": [
                    "DIVERSITY FRIENDLY"
                ],
                "rental_details": {
                    "diversity_friendly": true
                }
            }
        ],
        "pagination": {
            "current_page": 1,
            "page_size": 10,
            "total_results": 187,
            "total_pages": 19,
            "has_next_page": true
        },
        "search_metadata": {
            "listing_type": "rent",
            "property_segments": "residential",
            "main_category": "condo",
            "location_type": "district",
            "location_id": "dtdistrict09",
            "sort_by": null,
            "sort_order": null,
            "filters": {
                "max_price": 6000,
                "bedrooms": [
                    2,
                    3
                ]
            },
            "currency": "SGD",
            "area_unit": "sqft",
            "bathrooms_post_filtered": false,
            "upstream_item_count": 10,
            "filtered_out_count": 0
        }
    },
    "meta": {
        "endpoint_family": "search",
        "billable": true
    }
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Validation Error | A public parameter is missing or invalid. No upstream call is made and the response is not billable. |
| 502 | Unexpected Upstream Response | 99.co answered with a body that is not the documented shape. The response is not billable. |
| 503 | Upstream Unavailable | 99.co was temporarily unavailable or blocked the request. The response is not billable and the request never answers 429. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
