99.co Singapore Property Listings Scraper avatar

99.co Singapore Property Listings Scraper

Pricing

from $4.99 / 1,000 results

Go to Apify Store
99.co Singapore Property Listings Scraper

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

Coding Frontned

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

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.

FieldTypeDefaultDescription
listingTypestringsalesale or rent; used for generated URLs and as a fallback for direct URLs.
searchUrlsstring array[]Public https://www.99.co/singapore/... search URLs.
locationsstring array[]Singapore areas or district names used to generate search URLs.
propertyTypesstring array[]Generated-search property filters such as HDB, Condo, Landed, or Room.
minPrice, maxPriceintegerunsetInclusive price or monthly-rent bounds in SGD.
minBedrooms, maxBedroomsintegerunsetInclusive bedroom bounds.
minBathrooms, maxBathroomsintegerunsetInclusive bathroom bounds.
minFloorArea, maxFloorAreaintegerunsetInclusive floor-area bounds in square feet.
maxItemsinteger50Maximum records pushed to the dataset.
maxPagesinteger50Maximum result pages followed per search URL.
includeDetailsbooleanfalseOpen selected public listing detail pages for descriptions, full media, agent metadata, and development information.
maxDetailItemsinteger50Maximum detail pages opened when enrichment is enabled.
includeImagesbooleantrueKeep public property image URLs and thumbnails.
includeTagsbooleantrueKeep public 99.co tags and labels.
deduplicatebooleantrueSuppress duplicate listing URLs across pages and search URLs.
requestDelayMsinteger0Optional delay before subsequent search/detail navigations.
maxConcurrencyinteger1Number of search pages handled concurrently, from 1 to 5.
maxRequestRetriesinteger3Retries for failed search requests.
navigationTimeoutSecsinteger90Browser navigation timeout.
requestHandlerTimeoutSecsinteger180Total request-handler timeout, including optional details.
cloudflareWaitSecsinteger30Retained for input compatibility; security challenges are reported immediately and are never bypassed.
proxyConfigurationobjectunsetOptional 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 install
apify validate-schema
apify 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.