99.co Singapore Properties Scraper avatar

99.co Singapore Properties Scraper

Pricing

from $1.26 / 1,000 results

Go to Apify Store
99.co Singapore Properties Scraper

99.co Singapore Properties Scraper

Singapore property listings from 99.co (rent + sale): price, price-per-sqft, beds/baths, floor area, built year, furnishing, coordinates and neighbourhood — by listing type and bedroom count.

Pricing

from $1.26 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Categories

Share

Scrapes property listings from 99.co, a major Singapore property portal, for rent and for sale: price, price-per-sqft, bedrooms/bathrooms, floor area, build year, furnishing, exact coordinates and neighbourhood.


What you get

One PROPERTY row per listing, plus a SEARCH_SUMMARY row per query.

listing_id · url · formatted_address · main_category / formatted_sub_category (e.g. "HDB 3 Rooms") · price · psf (price per square foot) · beds · bathrooms · floorarea_sqft · top (build year, e.g. "Built: 2004") · furnishing · neighbourhood_name · region_name · lat / lng · listing_status · posted_at_formatted · photo_counts / video_count / floor_plan_count

price, psf, beds, bathrooms and floorarea_sqft are each an object ({"value": ..., "unit": ..., "formatted_string": ...}), passed through exactly as the site's own data layer shapes them.


Input

{
"queries": [
{ "listingType": "rent", "bedrooms": "2" }
]
}

Each entry needs listingType ("rent" or "sale"); bedrooms is optional.

bedrooms is a validated list (1-5), not free text

Unlike most filters shipped by this portfolio, bedrooms is gated to the 5 values 99.co's own site actually links to (1, 2, 3, 4, 5). That's a deliberate difference from, say, a location filter elsewhere: those were proven honest on an unrecognised value (a clean empty result or 404); this specific URL segment was only verified for those 5 values, and sending something else risks landing on some other, unverified page rather than a guaranteed miss — so it's refused up front instead of guessed at.


Read this before assuming you can page through more results

There is no working pagination on this site. ?page=2 (and every other value tried) returns the exact same listings as ?page=1 — not a policy restriction, a real check: full id-set comparison, not just a glance at counts. Each query in queries therefore returns one fixed batch (consistently ~36 listings in testing), never more, however many listings actually exist for that combination. To cover more ground, add more queries entries — e.g. one per bedroom count, or both rent and sale — rather than expecting depth from a single query.


Known limits

1. No total-count field exists anywhere on this target. The SEARCH_SUMMARY row reports propertiesReturned (what actually came back) and a fixedBatchNote explaining the pagination situation above — there is nothing upstream to report a true total from.

2. Only Singapore is covered. 99.co also operates an Indonesia market (/id/ paths) with different URL conventions not explored this session.

3. Filtering by neighbourhood, price range, property type or sort order is not offered. robots.txt disallows the query-string parameters 99.co's own filter UI uses for all of these (?price_min=, ?bathrooms=, ?condo_sub_type=, ?sort_field=, and many more) — this actor only uses the clean PATH-segment forms the site links to itself (/singapore/rent, /singapore/rent/2-bedrooms), which cover listing type and bedroom count only.


Anti-bot posture

Cloudflare — and the exit IP's geography matters more than you'd expect. Local testing needed only pacing: a burst of unpaced recon requests drew a genuine Cloudflare managed challenge (cf-mitigated: challenge, HTTP 429, "Just a moment...") that cleared on its own after a cooldown. Real cloud runs were a different story — Apify's unpinned Residential proxy pool, and even a direct connection with no proxy at all, both failed every retry against this same challenge for several minutes straight. Pinning the proxy to Singapore fixed it immediately. This actor's default proxy configuration is Residential pinned to SG — Cloudflare here appears to score exit-IP geography against the market this site serves, the same diagnosis already on record for this portfolio's Indonesia real-estate actor. Removing the country pin is likely to make cloud runs fail outright, not just run slower.

Policy

robots.txt (User-agent: *) names no ClaudeBot/anthropic-ai/ GPTBot group, but disallows dozens of query-string parameters covering essentially all of 99.co's own rich-filter UI (price, beds, baths, property sub-type, sort, map bounds, keywords, and more), plus the whole /singapore/s/* map-search surface. This actor never touches any disallowed path — only the clean, site-linked PATH-segment forms (/singapore/{rent|sale}, optionally /{N}-bedroom(s)).