99.co Scraper | Singapore Indonesia Real Estate API avatar

99.co Scraper | Singapore Indonesia Real Estate API

Pricing

from $2.50 / 1,000 listings

Go to Apify Store
99.co Scraper | Singapore Indonesia Real Estate API

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 listings

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

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 $50Dedicated $100Hard target $200–999
Site1 simple anti-bot public site1 medium anti-bot public siteCloudflare / aggressive anti-bot / custom parser
ScopeFull listing + detail fieldsListing + detail + pagination, your field listAgreed fields, repeatable runs
DeliveryCSV/JSON · Apify Actor or standalone runnable client (script/CLI)Same, plus a sample run and short instructionsFeasibility first, then build
Time24 hours after we confirm the URL is in scope48 hours after confirmationQuoted after feasibility
Fixes30 days for small public-layout changes30 daysScoped 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 scrape worker through the control plane. Singapore homes (HDB, condo, EC, landed) come from the 99.co App listing API (anonymous JSON: search, detail, projects, agent profile). Indonesia and Singapore commercial / room listings are read from the web pages by the worker's remote browser; one run can mix both. Results include prices, beds, baths, area, MRT / location, tags, listing URLs, agent phone, CEA number, and — when the public agent profile API returns it — personal email.

What can this 99.co scraper extract?

Data pointDescription
Listing ID & URLStable ID / slug and canonical 99.co listing link
MarketSG or ID (+ currency SGD / IDR)
ChannelBUY (sale / jual) or RENT (rent / sewa)
Category / typee.g. condos-apartments, hdb, rooms, apartemen, rumah
Title & projectHeadline / project name when shown
PriceAmount + formatted price / PSF (SG) when available
Size & roomsFloor area (sqft / sqm), bedrooms, bathrooms
LocationAddress locality, region, MRT walk times (SG), geo when present
Tenure & yearFreehold / leasehold and built year when shown (SG)
Tags & badgese.g. Top Pick, Verified, Fully Furnished
Contact controlsCall / WhatsApp button presence + agent phone (SG, from data layer)
Source layerdom_card, next_data, srp+ldp, etc.
Lead fieldsphones, 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.

FieldTypeDescription
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: filled from the public agent profile API (/api/v10/web/agents/{CEA}) when a CEA number is present; the CEA number comes from one listing detail per agent. Without a profile the gap is 未验证; a profile without an email gives 本站无. 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?, photoUrl?}Agent name (e.g. "Lee Leong Yao Perry") and role (agent). profileUrl is the 99.co agent page when the listing page links one; Singapore app-API listings only carry the agent's avatar, given as photoUrl, and have no profileUrl. 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 (本站无).
leadSourceenumWhere the lead was extracted: search (SRP card), detail (LDP), entity (agent profile), contact (contact section), reveal-xhr (click-reveal XHR).
leadRevealenumHow 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).
leadAbsencesobjectMap 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.push payload) 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 闸门锁 in leadAbsences.
  • SG emails: The listing enquiry form is not submitted. Email is taken from the public agent profile API using the listing CEA number (scrapeAgentProfile, default on). If that call returns no address, leadAbsences.emails records the gap.

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

LimitationMarketReason
Agent email missing on some rowsSGFilled from the public agent profile API when CEA is present; some agents have no public email
Agent phone not availableIDServer-masked (e.g. +628123256xxxx); "Show phone" button triggers risk validation that does not reveal the number (闸门锁)
Social media links not availableSG99.co Singapore does not display agent social links (本站无)
Agency name not always availableSGCEA registration number is extracted from the agent profile URL; agency name requires opening the agent profile page (not always enriched)
Geo coordinatesSRP-only cardsgeo is null on search result cards; only populated on detail pages when JSON-LD GeoCoordinates is present
address.unit (门牌)BothUnit/door numbers are not consistently exposed by 99.co; unit is often null
address.countrySGSome SG listings put the postal code in the country field (data quality issue in 99.co's own JSON-LD)
ID rent SRP/LDPIDNot 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:

ActorBest for
PropertyGuru ScraperSingapore / Malaysia PropertyGuru listings
Dot Property Thailand ScraperThailand Dot Property sale and rent listings
Bayut UAE ScraperUAE Bayut property search and details
Property Finder UAE ScraperUAE Property Finder listings
Zillow Group ScraperUS Zillow / Trulia / HotPads / StreetEasy

Browse by category

See the full catalog in Related Actors below.

How to scrape 99.co

  1. Open 99.co Scraper in Apify Console.
  2. Set market (SG / ID / all), channel (BUY or RENT), and property type(s), or paste 99.co start URLs.
  3. Choose max listings and whether to open detail pages.
  4. Click Start, then export results from the Dataset tab. You never configure a proxy: the worker gets its exits from its own control plane.

Markets covered

CodeSiteChannel
SG99.co/singaporeApp API for homes; browser for commercial and rooms
ID99.co/idBrowser (web pages)

Not included: sister brands on different domains — Rumah123.com, SRX, iProperty.com.sg.

Property categories

MarketCategories
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 category
  • propertyTypes — multi-select; overrides propertyType when non-empty
  • all expands 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
}

Example input — scrape Indonesia apartemen for sale

{
"market": "ID",
"channel": "BUY",
"propertyType": "apartemen",
"maxItems": 20,
"maxPages": 1
}

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:

EventPrice
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 (Actor compute) is also billed to the user on top of event charges. No proxy is billed to you.

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.

maxItems defaults to 70 listing rows for each start URL, or for each selected market when startUrls is empty. Property types and other search settings filter rows inside that input's budget. Larger values are collected in parts of 70, and the whole run stops at your maximum total charge.

Free Apify plan limits (set by this Actor's developer)

LimitFree Apify planPaid Apify plan
Runs of this Actor10 runs totalUnlimited
Results per runUp to 200Up to the schema maximum (5,000 per input)

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:

FieldPurpose
startUrls99.co SG / ID search or listing URLs
market / marketsSG, ID, or all (= SG and ID, each with its own maxItems rows)
channelBUY or RENT
propertyType / propertyTypesCategory or multi-select (all = every home type in one search)
maxItemsListing rows per start URL or selected market (default 70). Property types are filters within that budget. Every row has rowType: "listing" and a stable id.
maxPagesBrowser search pages (Indonesia, SG commercial / rooms); the SG App API pages until maxItems
scrapeDetailsEnrich each card from the listing detail
scrapeAgentProfileAgent email + agency from the public agent profile (SG, default on)
requestDelayMillisDelay between browser page loads
workerBaseUrlOptional 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"},
"org": {"name": "PROPNEX REALTY PTE. LTD.", "id": "L3008022J", "type": "agency"},
"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"},
"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"
}

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 taken from the public agent profile API using the listing CEA number (scrapeAgentProfile, default on); the listing enquiry form is not submitted. 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).

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. Indonesia is read from the web pages, so it is slower than Singapore homes.

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.

Do I need a proxy?

No. 99.co uses Cloudflare and only serves clean Singapore exits for its app API; the worker gets a Singapore exit from its own control plane, and Indonesian pages are rendered from Indonesia by the worker's remote browser. You never configure a proxy.

Why did my free-plan run stop after 10 runs?

This Actor allows 10 runs and up to 200 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 the market / category or start URL, then check the run summary (OUTPUT): resultCountReported is the site's own total, notes lists category mappings, and ERROR_SUMMARY holds the failure reason.

Tips for better 99.co scraping

  • Default propertyType is condo; all searches every home type at once. In Indonesia condo is searched as apartemen (and other SG-only types map to their counterpart).
  • Enable scrapeDetails when you need richer detail fields (description, bathrooms, floor area, price per sqft, tenure, built year, nearest MRT).
  • Singapore homes are fast (app API); Indonesia and Singapore commercial / rooms use the browser and take longer.
  • Start with small maxItems to validate price / category tags before scaling.

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.

All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.

Jobs & Freelance

Real Estate

E-commerce

Travel & Stays

Social & Content

Ads Intelligence

Local & Maps

General Tools

→ Browse the full profile: apify.com/lentic_clockss