99.co Singapore Property Listings Scraper
Pricing
from $4.99 / 1,000 results
99.co Singapore Property Listings Scraper
Extract detailed property listings from 99.co Singapore with comprehensive data including prices, locations, amenities, and agent information. Perfect for real estate analysis, market research, and property investment decisions.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
Coding Frontned
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
This Actor collects publicly rendered Singapore property listings from 99.co. It supports sale and rental searches, direct 99.co search URLs, result pagination, card-level filters, optional public detail-page enrichment, and normalized dataset output.
The Actor reads public page content only. It does not log in, submit contact forms, solve CAPTCHAs, inject fingerprints, mask automation signals, or bypass access controls. If 99.co presents a security check, the Actor leaves the dataset empty for that page and records only bounded status and page-structure metadata in OUTPUT.
Input
Use listingType with locations, or provide one or more public searchUrls. When searchUrls is present, those URLs are used directly and their existing 99.co filters and sort order are preserved.
| Field | Type | Default | Description |
|---|---|---|---|
listingType | string | sale | sale or rent; used for generated URLs and as a fallback for direct URLs. |
searchUrls | string array | [] | Public https://www.99.co/singapore/... search URLs. |
locations | string array | [] | Singapore areas or district names used to generate search URLs. |
propertyTypes | string array | [] | Generated-search property filters such as HDB, Condo, Landed, or Room. |
minPrice, maxPrice | integer | unset | Inclusive price or monthly-rent bounds in SGD. |
minBedrooms, maxBedrooms | integer | unset | Inclusive bedroom bounds. |
minBathrooms, maxBathrooms | integer | unset | Inclusive bathroom bounds. |
minFloorArea, maxFloorArea | integer | unset | Inclusive floor-area bounds in square feet. |
maxItems | integer | 50 | Maximum records pushed to the dataset. |
maxPages | integer | 50 | Maximum result pages followed per search URL. |
includeDetails | boolean | false | Open selected public listing detail pages for descriptions, full media, agent metadata, and development information. |
maxDetailItems | integer | 50 | Maximum detail pages opened when enrichment is enabled. |
includeImages | boolean | true | Keep public property image URLs and thumbnails. |
includeTags | boolean | true | Keep public 99.co tags and labels. |
deduplicate | boolean | true | Suppress duplicate listing URLs across pages and search URLs. |
requestDelayMs | integer | 0 | Optional delay before subsequent search/detail navigations. |
maxConcurrency | integer | 1 | Number of search pages handled concurrently, from 1 to 5. |
maxRequestRetries | integer | 3 | Retries for failed search requests. |
navigationTimeoutSecs | integer | 90 | Browser navigation timeout. |
requestHandlerTimeoutSecs | integer | 180 | Total request-handler timeout, including optional details. |
cloudflareWaitSecs | integer | 30 | Retained for input compatibility; security challenges are reported immediately and are never bypassed. |
proxyConfiguration | object | unset | Optional Apify Proxy configuration. Use only a proxy and access pattern permitted by 99.co. |
Example input for one small search:
{"listingType": "sale","searchUrls": ["https://www.99.co/singapore/sale/areas/orchard"],"maxItems": 10,"maxPages": 1,"includeDetails": false,"includeImages": true,"includeTags": true,"deduplicate": true}
Example input with detail enrichment and card filters:
{"listingType": "rent","locations": ["Tampines", "District 10"],"propertyTypes": ["Condo"],"minBedrooms": 2,"maxPrice": 6000,"maxItems": 25,"includeDetails": true,"maxDetailItems": 10,"requestDelayMs": 500}
Output
Each dataset record contains the stable fields available for that listing. Card-level records include URL, ID, title, listing type, property type, price, PSF, bedrooms, bathrooms, area, MRT proximity, tenure, built year, images, tags, and agent text when exposed. Records also include provenance fields: searchLocation, searchUrl, pageUrl, pageNumber, scrapedAt, and extractionMethod.
With includeDetails: true, the Actor additionally attempts to collect the public address/postal code, district and region, floor level, furnishing, developer, project name, unit types, total units, neighbourhood, development URL, description, last-updated text, public agent profile/agency/credential text, and detail-page media. Detail failures leave the card record intact and set detailEnriched to false.
The complete field definitions, descriptions, anonymized examples, and the 12-column overview view are in .actor/dataset_schema.json. Dataset rows require canonical listing identity, provenance, and a sequential rank; undeclared fields are rejected.
Example output (values are anonymized):
{"url": "https://www.99.co/singapore/sale/property/example-residence-ExampleId","listingId": "ExampleId","title": "Example Residence, 3 Bed Condo","listingType": "sale","propertyType": "Condo","price": 2100000,"priceFormatted": "S$2,100,000","pricePerSqft": 1897,"bedrooms": 3,"bathrooms": 2,"floorArea": 1108,"address": "Example Walk, Singapore","nearestMrt": "Example MRT","agentName": "Example Agent","agencyName": "Example Realty","detailEnriched": false,"searchUrl": "https://www.99.co/singapore/sale/areas/example-district","pageNumber": 1,"scrapedAt": "2026-08-04T10:00:00.000Z","extractionMethod": "listing-card"}
Local development
Install dependencies, then run the local Actor with a bounded input from this directory:
npm installapify validate-schemaapify run --input '{"listingType":"sale","searchUrls":["https://www.99.co/singapore/sale/areas/orchard"],"maxItems":1,"maxPages":1}'
The Actor uses the default local dataset and writes a compact OUTPUT record with counts, proxy use, access boundaries, and non-content structural observations. It never stores raw blocked-page HTML or screenshots.