99.co Singapore Property Listings Scraper avatar

99.co Singapore Property Listings Scraper

Pricing

from $2.00 / 1,000 property listings

Go to Apify Store
99.co Singapore Property Listings Scraper

99.co Singapore Property Listings Scraper

Scrape Singapore property from 99.co — HDB, condo, landed and commercial, for sale or rent. Price, PSF, floor area, beds, baths, tenure, TOP year, coordinates, nearest MRT, photos and agent phone/WhatsApp. Breaks past 99.co's 10,000-result cap to reach all 48,000+ listings. No proxy needed.

Pricing

from $2.00 / 1,000 property listings

Rating

0.0

(0)

Developer

Elena Vance

Elena Vance

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Scrape Singapore property listings from 99.co — HDB flats, condos, landed homes and commercial space, for sale or for rent. Every row carries price, price per square foot, floor area, bedrooms, bathrooms, tenure, completion year, coordinates, nearest MRT with walking time, photos, and the listing agent's phone and WhatsApp.

It reaches listings other 99.co scrapers cannot. 99.co refuses to serve more than 10,000 results for any one search, so a conventional scraper tops out at 10,000 of the 48,000+ sale listings — and cannot tell that it stopped short. This one splits the search by postal district automatically and retrieves all of them.

No API key, no login, no residential proxy, no browser.

What you get

One row per listing. A real sample, from a District 15 condo run:

projectNamedistrictpricepsfsqftbedstenurenearest MRTwalkagentphone
Tembusu Grand157,888,0002,9312,691599 yrsTanjong Katong MRT10 minParamjit Kaur+6590091172
The Waterside156,500,0002,7092,3994FreeholdKatong Park MRT5 minVivien+6593859960
The Line @ Tanjong Rhu155,000,0001,6892,9603FreeholdKatong Park MRT3 minJamie Yoeng+6589893212

Plus, on every row: postal code, street number and name, both address lines, latitude/longitude, floor area in sqm, HDB flat model, photo count, floor-plan count, video tour URL, virtual-tour flag, 99.co's verification badges, posting time, and the cluster id that joins to 99.co's project data.

Export as JSON, CSV, Excel or XML.

Why this is cheap to run

99.co's Cloudflare wall is a TLS-stack gate, not a JavaScript challenge. Presenting Chrome's TLS fingerprint clears it outright — which means this Actor needs no browser and no residential proxy:

This ActorTypical 99.co scraper
RuntimePlain HTTP clientHeadless browser, or residential proxy
Memory256 MB2,048–4,096 MB
Start fee$0.00005up to $0.10
Proxy costnone~$8/GB residential

apify-actor-start is billed once per gigabyte, so a 4 GB Actor charges its start fee four times before returning a single row. This one charges it once.

A default 100-listing run finishes in under 3 seconds using one HTTP request. A 3,000-listing run takes 21 seconds and peaks at 103 MB.

What makes this different

It gets past the 10,000-result cap. page_num × page_size must be ≤ 10,000 or 99.co answers HTTP 400. That 400 looks exactly like a transient error, so a naive scraper reports success having collected 21% of the market. Ask this Actor for more than the cap allows and it partitions the search by postal district — 28 disjoint queries whose counts sum to the full corpus — then by property type and price band if a district ever outgrows the window too. On smaller runs nothing is split, so you never pay for the machinery you don't need.

It separates room rentals from whole units. 99.co's rental feed mixes them, and rooms are 46% of it (10,364 of 22,570). Averaging a S$900 room in with S$5,000 condos makes rent and PSF figures meaningless. rentalType picks one, and every row states which it is.

It never charges you twice for the same listing. Listing ids are de-duplicated across the entire run, before billing, not after — a live marketplace re-orders itself between requests, and a 6,000-listing test run suppressed 204 duplicates that a naive pager would have billed for.

It tells you when it could not finish. If a search genuinely cannot be narrowed below the cap, the run says so in its status message instead of quietly returning a short dataset.

Input

Everything is optional — running with no input at all returns 100 listings for sale across Singapore.

FieldDescription
listingTypesale or rent. Default sale.
propertyTypeall, condo, hdb or landed.
districtsPostal districts, e.g. ["D9", "D10", "D11"]. Empty means all of Singapore.
searchUrlPaste a 99.co search URL and its filters are read out of it.
maxItemsHow many listings to return. Default 100.
minPrice / maxPriceTotal price for sale, monthly rent for rentals.
bedroomsMulti-select, 0 (studio) to 7.
bathroomsMinimum bathroom count.
tenurefreehold, 999, 99.
furnishingfully, partial, unfurnished.
rentalTypewhole_unit or room. Rentals only.
propertySegmentresidential or commercial (offices, retail, industrial).
minFloorAreaSqft / maxFloorAreaSqftApplied locally — 99.co has no floor-area filter.
newLaunchOnlyRestrict to new-launch projects.
includeAgentContactsAgent name, phone, WhatsApp. Default on.
includePhotoGalleryEvery photo with caption and room category. Default off.
completeCoverageSplit past the 10,000 cap. Default on.
maxRunSecsTime budget. The run stops cleanly and keeps what it has.

Example runs

Every 3-bedroom condo in the prime districts over S$3M

{
"listingType": "sale",
"propertyType": "condo",
"districts": ["D9", "D10", "D11"],
"bedrooms": ["3"],
"minPrice": 3000000,
"maxItems": 500
}

Whole-unit rentals only, fully furnished, near an MRT

{
"listingType": "rent",
"rentalType": "whole_unit",
"furnishing": ["fully"],
"maxItems": 300
}

The entire sale market — all 48,000+ listings

{ "listingType": "sale", "maxItems": 50000, "maxRunSecs": 3600 }

This is the run that needs district partitioning; it happens automatically.

Agent lead list for one district

{ "districts": ["D19"], "includeAgentContacts": true, "maxItems": 2000 }

What this Actor does NOT return

Said plainly, because competing 99.co Actors advertise some of it:

  • Agent agency name, CEA licence number, email or transaction counts. 99.co's agent endpoint exists but will not resolve the agent ids its search results carry, and the agent profile pages are behind the Cloudflare wall that the JSON API is not. Rather than guess, these fields are absent. You get the agent's name, phone, WhatsApp and 99.co's badge flags.
  • Sorted results. 99.co accepts no sort parameter at all — eleven spellings were tested and every one was ignored. Results arrive in 99.co's own relevance order. Sort the dataset yourself; because coverage is complete, sorting it is meaningful.
  • Server-side floor-area filtering. There is no such parameter, so minFloorAreaSqft / maxFloorAreaSqft are applied after fetching. Listings that state no floor area are kept, not dropped — an absent area is not evidence of not matching.
  • Price history or past transactions. 99.co's search API carries only the current asking price.
  • Indonesia and Malaysia. Singapore only.

Notes on the data

  • posted_at is converted from 99.co's microsecond epoch to ISO-8601 UTC.
  • tenure and completedYear are routinely null on landed property. That is 99.co's data, not a parsing failure.
  • subCategory is sometimes the literal string "unknown". It is passed through rather than nulled, so you can tell "99.co says unknown" from "99.co said nothing".
  • marketSegment (CCR/RCR/OCR) and districtName are derived from the district number using URA's convention; 99.co does not return them.
  • Totals drift by a few listings over the course of a long run. It is a live marketplace.

clusterId on every row is the join key to 99.co's project data — feed it to the 99.co Project & Condo Profile Scraper for building specifications, price ranges per bedroom type, and nearby amenities with walking and driving times.

This Actor collects publicly available listing data. Agent phone and WhatsApp numbers are business contact details that agents publish on their own listings so that buyers can contact them. You are responsible for using the data in compliance with applicable law, including Singapore's PDPA and the GDPR where it applies, and with 99.co's terms. Do not use it for unsolicited bulk messaging where that is prohibited.