99.co Scraper | Singapore Indonesia Real Estate API
Pricing
from $2.50 / 1,000 results
99.co Scraper | Singapore Indonesia Real Estate API
Scrape 99.co Singapore & Indonesia — HDB, condo, landed, rooms, commercial, rumah, apartemen & ruko for sale or rent. Prices, MRT & images — 99.co API alternative.
Pricing
from $2.50 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Need a dedicated scraper for one website?
This Actor is the general tool for protected public pages. If you already have one specific site and a field list, a dedicated scraper is faster and more stable: listing + detail, your export format, delivered to your Apify account or as a standalone runnable client.
I confirm the tier before you pay. The clock starts after that confirmation.
Start here: Submit a custom scraper request
| Starter $50 | Dedicated $100 | Hard target $200–999 | |
|---|---|---|---|
| Site | 1 simple anti-bot public site | 1 medium anti-bot public site | Cloudflare / aggressive anti-bot / custom parser |
| Scope | Full listing + detail fields | Listing + detail + pagination, your field list | Agreed fields, repeatable runs |
| Delivery | CSV/JSON · Apify Actor or standalone runnable client (script/CLI) | Same, plus a sample run and short instructions | Feasibility first, then build |
| Time | 24 hours after we confirm the URL is in scope | 48 hours after confirmation | Quoted after feasibility |
| Fixes | 30 days for small public-layout changes | 30 days | Scoped in the quote |
Hard-target sites are not a 100% uptime promise. You get a dedicated parser that can be re-run on the agreed fields. If the URL is not feasible, you get a refund or pay an assessment fee only — you will know before the build starts.
Not in Starter/Dedicated: login-walled data, native APK / Windows installer / full web apps, or two-year maintenance. Those are a separate quote.
What does 99.co Scraper do?
99.co Scraper extracts Southeast Asia real estate listings from 99.co Singapore and 99.co Indonesia. Cover HDB, condo, landed houses, executive condo, room rentals, and commercial (office, retail, industrial, warehouse, shophouse) in Singapore — plus Indonesian rumah, apartemen, ruko, tanah, kost, vila, and more — for sale and rent.
Pick a market (SG / ID), choose property types, or paste search/listing URLs, then download structured results as JSON, CSV, Excel, or HTML.
This Actor is a practical 99.co API alternative: the Apify Actor is a thin client that calls a hosted Cloud Run scrape worker (Patchright headed Chrome + Xvfb). The worker opens live 99.co pages, reads DOM cards + JSON-LD (Singapore) or #__NEXT_DATA__ (Indonesia), and normalizes prices, beds, baths, area, MRT / location, tags, and listing URLs for proptech, research, and CRM pipelines.
What can this 99.co scraper extract?
| Data point | Description |
|---|---|
| Listing ID & URL | Stable ID / slug and canonical 99.co listing link |
| Market | SG or ID (+ currency SGD / IDR) |
| Channel | BUY (sale / jual) or RENT (rent / sewa) |
| Category / type | e.g. condos-apartments, hdb, rooms, apartemen, rumah |
| Title & project | Headline / project name when shown |
| Price | Amount + formatted price / PSF (SG) when available |
| Size & rooms | Floor area (sqft / sqm), bedrooms, bathrooms |
| Location | Address locality, region, MRT walk times (SG), geo when present |
| Tenure & year | Freehold / leasehold and built year when shown (SG) |
| Tags & badges | e.g. Top Pick, Verified, Fully Furnished |
| Contact controls | Call / WhatsApp button presence + agent phone (SG, from data layer) |
| Source layer | dom_card, next_data, srp+ldp, etc. |
| Lead fields | phones, emails, address, geo, person, org, web, leadSource, leadReveal, leadAbsences |
Lead & contact fields
Each listing item includes structured lead/contact fields following the lead-output schema. These fields are populated from 99.co's data layers (RSC payload for SG, __NEXT_DATA__ for ID) — no click-reveal or form submission is performed.
| Field | Type | Description |
|---|---|---|
phones | [{value, type}] | Agent phone numbers. SG: plain E.164 numbers extracted from the RSC data layer (e.g. +6580441561), already visible in the page payload — no click needed. ID: server-masked and login/risk-gated (e.g. +628123256xxxx); not revealed, recorded in leadAbsences as 闸门锁. |
emails | [{value, type}] | Agent contact emails. SG: gated behind a lead form (闸门锁), not exposed. ID: plain email from __NEXT_DATA__ agent contacts (e.g. rciptagraha@gmail.com), already visible. |
address | {street, unit, locality, region, postalCode, country, full} | Property address. unit = door/unit number (门牌). Extracted from JSON-LD PostalAddress (SG) or full_address string (ID). Some SG listings only show postal code in locality. |
geo | {lat, lng} | Coordinates from JSON-LD GeoCoordinates (SG LDP) or location_pin (ID LDP). Present on detail pages when the site exposes it; null on SRP-only cards. |
person | {name, role, profileUrl} | Agent name (e.g. "Lee Leong Yao Perry"), role (agent), and 99.co agent profile URL. Extracted from the data layer, not from agent profile pages. |
org | {name, id} | Agency/organization. id = CEA registration number (SG, e.g. R069595D) or agency ID (ID). name is the agency name when available. |
web | {website, socials[]} | Agent website and social media links. ID: Instagram, Facebook, YouTube URLs from __NEXT_DATA__ contacts (all plain URLs, already visible). SG: not available (本站无). |
leadSource | enum | Where the lead was extracted: search (SRP card), detail (LDP), entity (agent profile), contact (contact section), reveal-xhr (click-reveal XHR). |
leadReveal | enum | How the lead was obtained: visible (already in data layer), click (click-reveal), xhr (XHR-after-click), gated (login/paywall), image (image-only), absent (not available on site). |
leadAbsences | object | Map of lead subfields that are missing and why. Values: 本站无 (site doesn't have it), 闸门锁 (login/paywall/lead-form gate), 未验证 (not tested during recon). |
Reveal cost
- SG phones: Already visible in the RSC data layer (
self.__next_f.pushpayload) as plain E.164 JSON. The DOM does not render them (show_phone: false), but the worker reads the data layer directly — no click, no XHR, no extra cost. - ID emails & socials: Already visible in
__NEXT_DATA__agent contacts as plain JSON — no click, no XHR, no extra cost. - ID phones: The site shows a "Show phone" button that triggers
POST /id/api/biz/fraud/validate-request(risk validation). This does not reveal the number — it remains server-masked. The worker does not attempt this click; phone is recorded as闸门锁inleadAbsences. - SG emails: Behind a lead form (name/email/phone/message + Send). The worker does not submit this form; email is recorded as
闸门锁inleadAbsences.
No click-reveal or form submission is performed. All extracted leads come from data layers that are already present in the page payload.
Honest limitations
| Limitation | Market | Reason |
|---|---|---|
| Agent email not available | SG | Gated behind a lead form (闸门锁); agent email is never exposed on public pages |
| Agent phone not available | ID | Server-masked (e.g. +628123256xxxx); "Show phone" button triggers risk validation that does not reveal the number (闸门锁) |
| Social media links not available | SG | 99.co Singapore does not display agent social links (本站无) |
| Agency name not always available | SG | CEA registration number is extracted from the agent profile URL; agency name requires opening the agent profile page (not always enriched) |
| Geo coordinates | SRP-only cards | geo is null on search result cards; only populated on detail pages when JSON-LD GeoCoordinates is present |
address.unit (门牌) | Both | Unit/door numbers are not consistently exposed by 99.co; unit is often null |
address.country | SG | Some SG listings put the postal code in the country field (data quality issue in 99.co's own JSON-LD) |
| ID rent SRP/LDP | ID | Not verified during recon (same channel as sale, inferred consistent); worker handles it but lead completeness is not guaranteed |
Why scrape 99.co?
- Singapore market research — track asking prices and inventory for HDB, condo, EC, and landed homes
- Indonesia property intelligence — pull jual/sewa listings for rumah, apartemen, ruko, and commercial types
- Investment & proptech — feed CRM, pricing models, or dashboards with fresh sale/rent data
- Competitive monitoring — watch tags, PSF, and inventory shifts across categories
- Export & automation — pull 99.co property data into Sheets, warehouses, or your own API
More Actors like this
Need a similar property-portal Actor? Start with these peers, then browse curated picks by category:
| Actor | Best for |
|---|---|
| PropertyGuru Scraper | Singapore / Malaysia PropertyGuru listings |
| Dot Property Thailand Scraper | Thailand Dot Property sale and rent listings |
| Bayut UAE Scraper | UAE Bayut property search and details |
| Property Finder UAE Scraper | UAE Property Finder listings |
| Zillow Group Scraper | US Zillow / Trulia / HotPads / StreetEasy |
Browse by category
- Real estate: Realtor.com Scraper · Rightmove Scraper · Idealista Scraper
- Travel: Airbnb Listings Scraper · Booking.com & Airbnb Scraper · Agoda Hotel Scraper
- E-commerce: Amazon Product Scraper · Walmart Product Scraper · eBay Product Scraper
- Jobs: Indeed Job Scraper · LinkedIn Jobs Scraper · Glassdoor Jobs Scraper
- Universal: Stealth Web Scraper · Universal Web Scraper
See the full catalog in Related Actors below.
How to scrape 99.co
- Open 99.co Scraper in Apify Console.
- Set market (
SG/ID/all), channel (BUYorRENT), and property type(s), or paste 99.co start URLs. - Choose max listings / max pages and whether to open detail pages.
- Keep Apify Proxy → RESIDENTIAL enabled (country defaults to SG or ID by market).
- Click Start, then export results from the Dataset tab.
Markets covered
| Code | Site | Typical proxy |
|---|---|---|
SG | 99.co/singapore | RESIDENTIAL + SG |
ID | 99.co/id | RESIDENTIAL + ID |
Not included: sister brands on different domains — Rumah123.com, SRX, iProperty.com.sg.
Property categories
| Market | Categories |
|---|---|
Singapore (SG) | hdb, condos-apartments, houses, executive-condominiums, rooms (RENT), commercial, shophouse, retail, offices, industrial, warehouse |
Indonesia (ID) | rumah, apartemen, ruko, tanah, kost, gudang, vila, ruang-kantor, komersial, hotel, pabrik, gedung-bertingkat, toko, kios (RENT) |
propertyType— single categorypropertyTypes— multi-select; overridespropertyTypewhen non-emptyallexpands each market’s primary navigation categories
Example input — scrape Singapore condos, HDB, and houses for sale
{"market": "SG","channel": "BUY","propertyTypes": ["condo", "hdb", "houses"],"maxItems": 30,"maxPages": 1,"scrapeDetails": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "SG"}}
Example input — scrape Indonesia apartemen for sale
{"market": "ID","channel": "BUY","propertyType": "apartemen","maxItems": 20,"maxPages": 1,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "ID"}}
Example input — scrape Singapore room rentals
{"market": "SG","channel": "RENT","propertyType": "rooms","maxItems": 20,"maxPages": 1}
Example input — 99.co search URL
{"startUrls": [{"url": "https://www.99.co/singapore/sale/condos-apartments"}],"maxItems": 15,"maxPages": 1}
Supported URL patterns
- Singapore sale/rent:
https://www.99.co/singapore/sale,/sale/hdb,/rent/rooms,/sale/commercial/offices, … - Singapore detail:
/singapore/{sale\|rent}/property/{slug} - Indonesia jual/sewa:
https://www.99.co/id/jual/apartemen,/id/sewa/rumah, … - Indonesia detail:
/id/properti/{slug}-cp-{id} - Pagination: SG
?page_num=2· ID?hlmn=2
How much does it cost to scrape 99.co?
This Actor uses Pay per event pricing. You pay for:
| Event | Price |
|---|---|
Actor Start (apify-actor-start) | $0.005 per start (scaled by run memory: one event per GB, minimum one) |
result (apify-default-dataset-item) | $2.50 / 1,000 results ($0.0025 per listing in the default dataset) |
Platform usage (compute, residential proxy, etc.) is also billed to the user on top of event charges.
Example (illustrative): 1 start + 1,000 listings ≈ $0.005 + $2.50 in event fees, plus platform usage for the run.
Tip: set a max total charge on the run if you want a hard spending cap. Start with maxItems 5–20 while validating fields and proxy.
Free Apify plan limits (set by this Actor's developer)
| Limit | Free Apify plan | Paid Apify plan |
|---|---|---|
| Runs of this Actor | 10 runs total | Unlimited |
| Results per run | Up to 1,000 | Up to schema max (500) |
When the run cap is hit, the run finishes with a clear status message — not an Apify platform error. These limits are set by the Actor developer, not Apify.
Worker host migrations: update Actor env WORKER_BASE_URL (and WORKER_AUTH if the API key changed) — no Actor code change required.
Input
Open the Input tab for the full schema. Main fields:
| Field | Purpose |
|---|---|
startUrls | 99.co SG / ID search or listing URLs |
market / markets | SG, ID, or all |
channel | BUY or RENT |
propertyType / propertyTypes | Category or multi-select (all expands primary cats) |
maxItems / maxPages | Caps (fair-shared across categories) |
scrapeDetails | Enrich each card from the listing detail page |
requestDelayMillis | Delay between navigations |
proxyConfiguration | Prefer Apify RESIDENTIAL; country matched to market when omitted |
workerBaseUrl | Optional Advanced override; production uses Actor env WORKER_BASE_URL |
Output example
You can download the dataset extracted by 99.co Scraper in JSON, HTML, CSV, or Excel.
{"id": "balmoral-tower-condo-7T4xvri2E4dJWdoFwmWVFz","url": "https://www.99.co/singapore/sale/property/balmoral-tower-condo-7T4xvri2E4dJWdoFwmWVFz","source": "99.co","market": "SG","sourceCountry": "SG","channel": "BUY","operationType": "sale","propertyType": "condos-apartments","title": "Balmoral Tower","price": 12380000,"priceCurrency": "SGD","priceFormatted": "S$ 12,380,000","pricePsf": 2474,"bedrooms": "6+1","floorAreaSqft": 5005,"mrt": {"name": "Newton MRT","walkMinutes": 8,"distanceM": 587},"phones": [{"value": "+6580441561", "type": "mobile"}],"emails": [],"address": {"full": "1 Fraser Street, 189350", "street": "1 Fraser Street", "unit": null, "locality": "189350", "region": null, "postalCode": null, "country": "189350"},"geo": null,"person": {"name": "Lee Leong Yao Perry", "role": "agent", "profileUrl": "https://www.99.co/singapore/agents/R069595D-lee-leong-yao-perry"},"org": {"name": null, "id": "R069595D"},"web": {"website": null, "socials": []},"leadSource": "detail","leadReveal": "visible","leadAbsences": {"emails": "闸门锁", "socials": "本站无"},"scrapedAt": "2026-07-18T14:03:14.875380+00:00"}
Indonesia example (IDR):
{"id": "1013025068","url": "https://www.99.co/id/properti/apartemen-dijual-600jt-tangerang-cp-1013025068","source": "99.co","market": "ID","channel": "BUY","propertyType": "apartemen","title": "Dijual Segera Apartemen 1 KT & 1 KM di Tangerang, Tangerang","price": 600000000,"priceCurrency": "IDR","priceFormatted": "Rp 600 Juta","bedrooms": 1,"sourceLayer": "next_data","phones": [],"emails": [{"value": "rciptagraha@gmail.com", "type": "agent"}],"address": {"full": "PLN DCC, Jl. Imam Bonjol, Drenges, Kertosono, Nganjuk, Jawa Timur, Indonesia, 64315", "street": "Jl. Imam Bonjol", "unit": null, "locality": "Kertosono", "region": "Jawa Timur", "postalCode": "64315", "country": "Indonesia"},"geo": {"lat": -7.61582, "lng": 112.098267},"person": {"name": "Ratu Cipta Graha", "role": "agent", "profileUrl": null},"org": {"name": "1388205 - Independent Property Agent", "id": "1388205"},"web": {"website": null, "socials": ["https://www.instagram.com/inforumah_nganjuk/", "https://www.facebook.com/propertinganjuk/", "https://www.youtube.com/@ratuperumahan5571"]},"leadSource": "detail","leadReveal": "visible","leadAbsences": {"phones": "闸门锁"},"scrapedAt": "2026-07-18T14:32:56.000000+00:00"}
Is it legal to scrape 99.co?
Our scrapers are ethical and do not extract private user data that is not shown on public listing pages. They only extract what 99.co has chosen to display publicly.
Contact policy: Call / WhatsApp / Show phone controls are detected as presence flags (callButtonPresent, whatsappButtonPresent). SG agent phones are extracted from the page's RSC data layer as plain E.164 numbers — no click or form submission is performed. ID agent phones are server-masked and login/risk-gated; the worker does not attempt to reveal them. SG agent emails are behind a lead form and are not extracted. ID agent emails and socials are plain JSON in __NEXT_DATA__ and are extracted as-is. The worker never submits Apply, RFQ, login, or payment forms.
You should still comply with site terms, applicable Singapore / Indonesia and international laws (including personal-data rules for agent contacts), and only scrape when you have a legitimate purpose. If unsure, consult your lawyers.
Actor name note
The platform Actor slug remains ninetynine-co-sg-scraper for continuity (historical SG-first publish). The Store title/description cover Singapore + Indonesia. Functionally this Actor scrapes both markets on www.99.co.
FAQ
How do I scrape 99.co Singapore condos for sale?
Set market to SG, channel to BUY, and propertyType to condo (or condos-apartments). Keep RESIDENTIAL + SG proxy enabled.
How do I scrape 99.co Indonesia apartemen or rumah?
Set market to ID, channel to BUY or RENT, and propertyType to apartemen or rumah. Use apifyProxyCountry: "ID".
How do I scrape HDB listings on 99.co?
Use market: "SG" and propertyType: "hdb" (sale or rent). HDB is Singapore-only.
How do I scrape 99.co room rentals?
Set channel to RENT and propertyType to rooms. The Actor uses /singapore/rent/rooms.
How do I scrape commercial offices or shops on 99.co?
Set market to SG and propertyType to offices, retail, industrial, warehouse, shophouse, or commercial.
Do I need a 99.co API key?
No. This Actor scrapes the public 99.co websites and returns structured property data — useful when you need a 99.co data API without an official partnership.
Can I export 99.co listings to Google Sheets or Excel?
Yes. Download the Dataset as Excel/CSV, or use Apify integrations and the Dataset API to push results into Sheets, webhooks, or your backend.
Why is a residential proxy required?
99.co uses Cloudflare. Plain HTTP often returns 403 / “Just a moment…”. With WORKER_PROVIDES_PROXY=1, the Cloud Run worker uses its durable residential PROXY_URL and rewrites country-XX to match each market (SG→Singapore, ID→Indonesia). You do not need to pick a proxy country manually.
Why did my free-plan run stop after 10 runs?
This Actor allows 10 runs and up to 1,000 listings per run for free Apify plan users. That policy is set by the Actor developer (not Apify). Upgrade to a paid Apify plan for unlimited runs. The run ends with status message FREE_TIER_LIMIT — it is not a platform crash.
What if a 99.co scrape returns zero results?
Confirm market / category URL, keep the matching residential proxy on, try a smaller maxItems, and inspect Key-Value Store ERROR_SUMMARY / OUTPUT / DEBUG_* records.
Tips for better 99.co scraping
- Default
propertyTypeiscondo(narrow). UsepropertyTypesfor multi-category runs, orallonly when you explicitly want every primary category (much slower). - Enable
scrapeDetailswhen you need richer LDP fields (description, geo, sections). - Keep
requestDelayMillisaround 1500–2500 for stable sessions. - Start with small
maxItemsto validate price / category tags before scaling. - Pick
market/marketscorrectly — the worker auto-matches residential proxy country (SG/ID).
Support
Questions or feature requests? Open an issue on the Actor page or contact the developer through Apify. Feedback on additional filters, districts, or export formats is welcome.
Related Actors
All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.
Jobs & Freelance
- LinkedIn Jobs Scraper
- Bayt Jobs Scraper
- Fiverr Gigs Scraper
- Freelancer.com Scraper
- Glassdoor Scraper
- Himalayas Jobs Scraper
- Indeed Jobs Scraper
- Jobicy Remote Jobs Scraper
- RemoteOK Jobs Scraper
- SEEK Jobs Scraper
- Upwork Jobs Scraper
Real Estate
- Zillow & Zumper Scraper
- Realtor.com Scraper
- 99.co Scraper
- Realtor.com Agents Scraper
- Apartments.com Rental Scraper
- Bayut Scraper
- Craigslist Housing Scraper
- Daft.ie Scraper
- Dot Property Scraper
- FINN.no Scraper
- Funda Scraper
- Hepsiemlak Scraper
- Idealista Scraper
- Immobiliare.it Scraper
- ImmoScout24 Scraper
- Naver Land Scraper
- OpenSooq Scraper
- Otodom Scraper
- Property Finder Scraper
- PropertyGuru Scraper
- realestate.com.au Scraper
- Realtor.ca Scraper
- Rightmove Scraper
- SeLoger Scraper
- SUUMO Scraper
- Zillow Group Scraper
E-commerce
- Shopee Search Scraper
- E-commerce Scraper
- 1688 Global Product Search Scraper
- Allegro Scraper
- Amazon Search Scraper
- ASOS Product Scraper
- Cdiscount Product Scraper
- Costco Product Scraper
- Coupang Product Scraper
- Etsy Scraper
- Lazada Scraper
- MercadoLibre Scraper
- Mercari Japan Scraper
- Rakuten Japan Scraper
- SHEIN Product Scraper
- Target Product Scraper
- Temu Product Scraper
- Walmart Product Scraper
Travel & Stays
- Booking.com & Airbnb Scraper
- Agoda Scraper
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
- Despegar Scraper
- Expedia Scraper
- Traveloka Scraper
- Travelstart Flights Scraper
- Trip.com Scraper
- TripAdvisor Scraper
Social & Content
Ads Intelligence
Local & Maps
General Tools
→ Browse the full profile: apify.com/lentic_clockss