URA Singapore Property Scraper — Prices, Transactions & Rentals avatar

URA Singapore Property Scraper — Prices, Transactions & Rentals

Pricing

from $2.00 / 1,000 output rows

Go to Apify Store
URA Singapore Property Scraper — Prices, Transactions & Rentals

URA Singapore Property Scraper — Prices, Transactions & Rentals

Scrape Singapore private property data from URA's own PMI service: unit-level sale transactions with floor range, area and price PSF, quarterly median and 25th/75th percentile rents, and project summaries with market segment and tenure. By project, street, district 01-28 or island-wide.

Pricing

from $2.00 / 1,000 output rows

Rating

0.0

(0)

Developer

R.L.

R.L.

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Pull live Singapore private residential market data straight from the same backend that powers URA's official PMI Mobile app — project price and rental summaries, unit-level sale transaction history, and quarterly rental statistics — for any project in Singapore, any street, an entire URA postal district, or the whole island at once. Run it manually, on a schedule, or from the Apify API to keep a property-market dataset continuously up to date. No URA account or access key of any kind is needed.

What can you use Singapore property data for?

  • Market research & investment analysis — track price/rental trends for specific projects or districts over time.
  • Portfolio monitoring — watch transaction and rental activity for buildings you own or manage.
  • Real estate proptech & data products — feed structured Singapore property data into dashboards, models, or apps without maintaining your own scraper.
  • Comparative analysis — pull an entire district's worth of projects in one run to compare price/rental performance.

How do I look up a project, street or district?

  1. Click Try for free or set up input in the Input tab.
  2. Pick a lookup mode -- projectNames, streetNames, and districts are all searchable dropdowns pre-populated from URA's own project index, so there's no free-text typing or guessing exact names:
    • Specific projects — pick one or more from the projectNames dropdown (e.g. "THE SAIL @ MARINA BAY").
    • Specific streets — pick one or more from the streetNames dropdown.
    • A district — pick one or more from the districts dropdown to fetch every known project in those districts.
    • Free-text search — type into searchQuery to reproduce the app's own search box (case-insensitive substring match against project and street names, e.g. "sail" finds "THE SAIL @ MARINA BAY", "RIVERSAILS", "VERSAILLES"). Combine with districts to scope it.
    • The whole index — set crawlAll to true to fetch all ~3,200 projects island-wide (use maxProjects to cap this for a first test run).
  3. Choose which data types to include: project summary, transaction history, rental history.
  4. Run the Actor and download results from the Dataset tab, or read them via the Apify API/CLI.

Modes combine: project names, street names, a searchQuery and districts in one run are all resolved into a single, de-duplicated target list.

What input does it take?

FieldTypeDefaultDescription
projectNamesarray of strings—Exact/near-exact project names to fetch directly
streetNamesarray of strings—Street names to fetch directly (best-effort)
searchQuerystring—Free-text substring search over project/street names, same as the app's search box
districtsarray of strings—URA district codes (01–28) to browse via the bundled project index
crawlAllbooleanfalseFetch every project in the bundled index
maxProjectsinteger0Cap on resolved projects/streets actually fetched (0 = no cap)
includeProjectSummarybooleantrueFetch project-level summary (project-name lookups only)
includeTransactionsbooleantrueFetch sale transaction history
includeRentalsbooleantrueFetch rental history
transactionMonthsinteger240Months of sale history to request (URA caps actual results at the project's available history)
rentalQuartersinteger60Quarters of rental history to request
concurrencyinteger5Parallel project fetches
requestDelayMsinteger300Pause between calls within one project's fetch

Example input:

{
"districts": ["09", "10"],
"includeProjectSummary": true,
"includeTransactions": true,
"includeRentals": true,
"maxProjects": 100
}

What does each row contain?

Each dataset item is one record — a project summary, a single sale transaction, or a single quarter of rental stats — tagged with dataType and the project/street/district it belongs to.

{
"dataType": "transaction",
"projectName": "THE SAIL @ MARINA BAY",
"streetName": null,
"districtCode": "01",
"districtName": "Raffles Place, Cecil, Marina, People's Park",
"floorRange": "01 to 05",
"areaSqft": 883.0,
"areaSqm": 82.05,
"price": 1608000.0,
"refPeriod": "JUL 2026",
"unitPricePsf": 1822.0,
"unitPricePsm": 19611.87
}

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Data fields

URA reports area and price rates in imperial units (sqft, PSF) only -- this Actor derives the metric equivalents (sqm, PSM) itself using 1 sqm = 10.7639 sqft, so every row carries both.

FieldApplies toDescription
dataTypeallprojectSummary, transaction, or rental.
projectName, streetName, districtCode, districtNameallProject/location context
lastTransactedRefPeriod, lastTransactedValuePsf, lastTransactedValuePsmprojectSummaryMost recent transacted price rate and period
lastRentalRefPeriod, lastRentalValuePsf, lastRentalValuePsmprojectSummaryMost recent rental rate and period
lastMedianUnitRentalPeriod, lastMedianUnitRentalValuePsf, lastMedianUnitRentalValuePsmprojectSummaryMost recent median unit rental rate and period
marketSegment, tenure, propertyTypeprojectSummarySegment (CCR/RCR/OCR), tenure, property type code
floorRange, areaSqft, areaSqm, price, unitPricePsf, unitPricePsm, refPeriodtransactionPer-unit sale record
medianPsfPerMonth, medianPsmPerMonth, p25PsfPerMonth, p25PsmPerMonth, p75PsfPerMonth, p75PsmPerMonth, refPeriodrentalQuarterly rental price distribution

Which Singapore districts can you scrape?

districts takes URA's postal district codes. These are the 28 districts, the areas each covers, and how many distinct projects the bundled index resolves for each (the figures below come from the index itself, so they tell you how big a district run will be before you start it):

DistrictAreas it coversProjects in the bundled index
01Raffles Place, Cecil, Marina, People's Park21
02Anson, Tanjong Pagar29
03Queenstown, Tiong Bahru33
04Telok Blangah, Harbourfront39
05Pasir Panjang, Hong Leong Garden, Clementi New Town131
06High Street, Beach Road (City)3
07Middle Road, Golden Mile34
08Little India81
09Orchard, Cairnhill, River Valley257
10Ardmore, Bukit Timah, Holland Road, Tanglin428
11Watten Estate, Novena, Thomson230
12Balestier, Toa Payoh, Serangoon128
13Macpherson, Braddell82
14Geylang, Eunos231
15Katong, Joo Chiat, Amber Road540
16Bedok, Upper East Coast, Eastwood, Kew Drive139
17Loyang, Changi57
18Tampines, Pasir Ris46
19Serangoon Garden, Hougang, Punggol316
20Bishan, Ang Mo Kio91
21Upper Bukit Timah, Clementi Park, Ulu Pandan115
22Jurong27
23Hillview, Dairy Farm, Bukit Panjang, Choa Chu Kang93
24Lim Chu Kang, Tengah— (none)
25Kranji, Woodgrove, Woodlands23
26Upper Thomson, Springleaf36
27Yishun, Sembawang41
28Seletar, Yio Chu Kang67

District 24 (Lim Chu Kang, Tengah) holds no private residential projects in the index, so selecting it resolves nothing. Counts are of indexed projects, not of projects that still have live data — a project with no recent activity simply returns fewer rows.

What do the URA terms mean?

  • PSF and PSM — price per square foot and per square metre. URA publishes rates per square foot only; the Actor converts each one at 1 sqm = 10.7639 sqft and gives you both, so unitPricePsm is always unitPricePsf × 10.7639.
  • Market segment (CCR / RCR / OCR) — URA's three-way split of the island. CCR is the Core Central Region (the prime central districts), RCR the Rest of Central Region (the city fringe), and OCR Outside Central Region (the suburbs). The marketSegment field carries URA's own code for the project.
  • Tenure — how long the land is held for, as URA states it: freehold, or a lease of a fixed number of years (99-year leases are the common case in Singapore) with its commencement. It arrives as text, not a number of years.
  • Floor range — a sale transaction is reported for a band of floors ("01 to 05"), never a unit number. URA aggregates it this way deliberately, so unit-level identification is not possible from this data.
  • Reference period (refPeriod) — the period a row belongs to: a month like JUL 2026 for sale transactions, and a quarter for rental statistics. It is the period URA filed the record under, not the date you ran the scraper.
  • Median, 25th and 75th percentile rent — a rental row is a distribution for one quarter, not one lease: the median is the middle rent per square foot per month, and p25/p75 are the rents a quarter of leases fell below and above. The gap between them tells you how spread the project's rents were.
  • Project summary vs. transaction vs. rental — a projectSummary row is one per project, holding its latest headline rates, segment and tenure. A transaction row is one sale. A rental row is one quarter of rental statistics. They share the location fields and are told apart by dataType.

How much does it cost to scrape URA property data?

This Actor is pay per result — $0.002 per row ($2.00 per 1,000 rows). Every dataset row counts once, whether it is a project summary, a single sale transaction, or one quarter of rental stats. Apify platform usage (compute) is billed on top at standard rates; the Actor makes lightweight SOAP calls rather than rendering pages, and no proxy is required.

A single well-traded project can easily return a few hundred transaction rows across 20 years of history, so scope runs deliberately: use maxProjects, or turn off includeTransactions / includeRentals when you only need summaries. Setting Max total charge on the run caps spend independently — the Actor stops pushing rows as soon as that limit is reached.

How do I keep a run fast and polite?

  • Start with a maxProjects cap when exploring districts or crawlAll mode.
  • Project names must match URA's own naming closely — check data.gov.sg's URA Property Transaction dataset or the PMI app if a lookup returns nothing.
  • Keep concurrency modest (default 5) — this is a public government service, not a bulk API.

FAQ

Do I need a URA account, login, or API key? No. The Actor calls the public, unauthenticated web service that URA's own PMI Mobile app uses, with read-only queries. It does not use URA's data.gov.sg data service either, so there is no access key to obtain and nothing to configure.

What does one row contain? One of three things, marked by dataType: a projectSummary (one per project, with its latest transacted and rental rates, market segment and tenure), a transaction (one sale: floor range, area, price, PSF), or a rental (one quarter's median and 25th/75th percentile rent). Every row also carries the project, street, district code and district name.

How far back does the history go? As far as URA keeps for that project. The Actor asks for 240 months of sale transactions and 60 quarters of rentals by default (raise or lower transactionMonths / rentalQuarters), and URA returns whatever of that it actually holds — an older project yields more rows than a recent launch.

Can I schedule it? Yes, with Apify Schedules. A weekly or monthly run over the districts you care about keeps a market time-series growing; the summary and the latest refPeriod rows are what change between runs.

Is the project list up to date? The live market data is, but the browsable index is not. The bundled project/street/district index is a static snapshot of the PMI app's own offline database, dated 2014, and it is used only to decide which projects exist for districts / crawlAll / searchQuery browsing. Projects launched after that are missing from it — look those up by name through projectNames, which goes straight to URA and is not limited by the index.

Why did my street lookup return nothing? URA's street search is stricter than its project search, so some street names legitimately return no rows — try the project name instead. Note also that includeProjectSummary only applies to project-name lookups; a street-only target returns transactions and rentals but no summary row.

Does it cover HDB flats? No. This is URA's private residential market data — condominiums, apartments and landed private housing. HDB resale transactions are not part of the PMI service this Actor reads.

Does the data identify units, buyers or sellers? No. Sales are reported by floor band ("01 to 05") with area and price; there are no unit numbers, addresses beyond the street, or any personal data of buyers or sellers.

How is the cost bounded? Rows cost $0.002 each, maxProjects caps how many targets are fetched, and Max total charge stops the run pushing further rows once your limit is hit. Turning off includeTransactions is the single biggest saving, since transaction history is what produces most rows.

Disclaimers and support

This Actor calls a public, unauthenticated web service used by URA's own PMI Mobile app to serve property market data to the public. It performs read-only queries and does not require credentials. Data accuracy and availability depend entirely on URA; this Actor does not modify, cache-poison, or resell URA data beyond what the source service already returns.

Found a bug or have a feature request? Use the Issues tab on this Actor's page.

Singapore real estate data toolkit

Part of the Singapore real estate data toolkit — Singapore property data across the island's major listing portals and the government's own transaction records:

Did you find this useful?

⭐ Rate this actor on Apify! Your feedback helps other users find it and helps us keep improving it.