Singapore URA Private Property Transactions & Rentals Scraper avatar

Singapore URA Private Property Transactions & Rentals Scraper

Pricing

from $10.20 / 1,000 results

Go to Apify Store
Singapore URA Private Property Transactions & Rentals Scraper

Singapore URA Private Property Transactions & Rentals Scraper

Scrape official Singapore URA private residential sale transactions (price, area, $psf, floor, district, tenure, sale type, contract date) and rental contracts (rent, bedrooms, lease month). Filter by project, district, type, price and date. Export to JSON, CSV or Excel.

Pricing

from $10.20 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Singapore URA Private Property Transactions & Rentals Scraper

Singapore URA Private Property Transactions & Rentals Scraper

Here is one real result. This actor needs your own free URA AccessKey; without one, it returns exactly this record (real, from run UNGWuHM3J7UaoiRL9) and charges nothing:

{
"error": "A free URA AccessKey is required. Register at ura.gov.sg (Digital Services > URA Data Service), then paste your AccessKey into the \"URA Access Key\" input field. The actor exchanges it for a daily token automatically.",
"source": "URA (Urban Redevelopment Authority), Singapore",
"observedAt": "2026-08-10T14:35:38.442Z"
}

With a valid AccessKey, each sale transaction is returned with all of the fields listed under Output reference (project, street, district, priceSgd, pricePsfSqft, areaSqft, tenure, contractDate and more), and each rental contract with its own field set (rentSgd, noOfBedRoom, leaseDate, area range). The example values in that section are the real shapes the URA Data Service returns.

The most complete Singapore URA private property scraper available. It returns every field the URA Data Service exposes for unit-level private residential sale transactions (last 5 years) and rental contracts (by quarter), plus derived fields such as square-foot area, price per square foot, market-segment names and ISO contract months, and gives you more than a dozen filters to target exactly the records you need.

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

The actor calls the official URA Data Service with your free AccessKey, pulls unit-level private residential sale transactions (last 5 years, split into 4 batches by URA) or rental contracts (by quarter), applies the filters you pass, and writes one normalized record per transaction or contract to the run's dataset. Raw source values (areas in square metres, mm-yy dates, coded sale types and market segments) are enriched with derived fields: square-foot area, price per square foot and per square metre, human-readable sale-type and market-segment names, and ISO YYYY-MM months. Missing source values are returned as null.

You need a free URA AccessKey. Register at ura.gov.sg (Digital Services > URA Data Service); URA emails you an AccessKey once approved. The actor exchanges it for a daily token automatically.

Quickstart

Open the actor, paste this into the input (with your own AccessKey), and press Run. It returns up to 10 recent private residential sale transactions.

{
"dataType": "transactions",
"uraAccessKey": "YOUR_FREE_URA_ACCESS_KEY",
"maxRecords": 10
}

For rentals, set dataType to rentals. All filters are optional; leave them empty to pull everything within your maxRecords cap.

Input reference

FieldTypeRequiredDefaultDescription
dataTypeenumnotransactionsWhich dataset to pull: transactions (unit-level sales, last 5 years) or rentals (rental contracts, by quarter).
uraAccessKeystring (secret)yes(none)Your free URA Data Service AccessKey. Register at ura.gov.sg. The actor exchanges it for a daily token automatically.
maxRecordsintegerno50Maximum number of transaction or rental records to return across the run.
batchesstring[]no(all)Sale transactions only. URA splits the 5-year dataset into 4 batches; list specific batches like 1, 2, or leave empty for all four.
refPeriodsstring[]no(recent)Rental contracts only. Quarters in yyqq format, for example 24q2. Empty pulls the most recent quarters automatically.
quartersBackintegerno4Rental contracts only. When no specific quarters are listed, how many recent quarters to pull.
projectNamesstring[]no(any)Keep only records whose project name contains any of these (case-insensitive), for example The Sail, Reflections.
streetKeywordstringno(empty)Keep only records whose street contains this text, for example Orchard.
districtsstring[]no(all)Filter by URA postal district, for example 09, 10, 15 (or D09).
propertyTypesstring[]no(any)Filter by property type, for example Condominium, Apartment, Terrace (sales); Non-landed Properties, Landed Properties (rentals). Partial match.
marketSegmentsstring[]no(any)Sale transactions only. CCR, RCR, OCR.
saleTypesstring[]no(any)Sale transactions only. newSale, subSale, resale.
tenureenumnoanySale transactions only. any, freehold, leasehold.
minPriceintegerno(none)Sale transactions only. Keep transactions at or above this total price (SGD).
maxPriceintegerno(none)Sale transactions only. Keep transactions at or below this total price (SGD).
minRentintegerno(none)Rental contracts only. Keep contracts at or above this monthly rent (SGD).
maxRentintegerno(none)Rental contracts only. Keep contracts at or below this monthly rent (SGD).
minAreaSqftintegerno(none)Keep only records with floor area at or above this many square feet.
maxAreaSqftintegerno(none)Keep only records with floor area at or below this many square feet.
bedroomsstring[]no(any)Rental contracts only. Filter by number of bedrooms, for example 1, 2, 3.
fromMonthstringno(empty)Keep only records whose contract/lease month is at or after this month (YYYY-MM).
toMonthstringno(empty)Keep only records whose contract/lease month is at or before this month (YYYY-MM).

Filters combine with logical AND.

Output reference

One dataset item per transaction or rental contract. Types: string, integer, number, or null when the source value is absent.

Sale transactions (dataType: "transactions")

FieldTypeDescription
dataTypestringAlways transaction.
projectstringProject or development name.
streetstringStreet name.
marketSegmentstringMarket segment code: CCR, RCR, OCR.
marketSegmentNamestringFull market-segment name, for example Core Central Region.
districtstringPostal district, for example D10.
propertyTypestringProperty type, for example Condominium.
typeOfAreastringArea basis, for example Strata, Land.
tenurestringRaw tenure text as published.
tenureTypestringNormalized Freehold or Leasehold, or null.
saleTypestringSale type code (1, 2, 3).
saleTypeLabelstringSale type name: New Sale, Sub Sale, Resale.
floorRangestringFloor range, for example 06-10.
noOfUnitsintegerNumber of units in the transaction.
areaSqmnumberFloor area in square metres.
areaSqftnumberDerived floor area in square feet.
priceSgdintegerTransaction price in SGD.
nettPriceSgdintegerNett price where reported, or null.
pricePsfSqftnumberDerived price per square foot.
pricePsmnumberDerived price per square metre.
contractDatestringRaw contract date (mmyy).
contractMonthstringDerived ISO month (YYYY-MM).
contractYearintegerDerived contract year.
svy21XnumberSVY21 X coordinate of the project.
svy21YnumberSVY21 Y coordinate of the project.
sourcestringAlways the URA Data Service source label.
observedAtstringISO 8601 collection timestamp.

Rental contracts (dataType: "rentals")

FieldTypeDescription
dataTypestringAlways rental.
projectstringProject or development name.
streetstringStreet name.
districtstringPostal district, for example D10.
propertyTypestringProperty type, for example Non-landed Properties.
noOfBedRoomstringNumber of bedrooms, or null.
rentSgdintegerMonthly rent in SGD.
areaSqmstringRaw floor-area range in square metres.
areaSqftstringRaw floor-area range in square feet.
areaSqftMinnumberParsed minimum area (sqft).
areaSqftMaxnumberParsed maximum area (sqft).
areaSqmMinnumberParsed minimum area (sqm).
areaSqmMaxnumberParsed maximum area (sqm).
rentPsfSqftApproxnumberDerived approximate rent per square foot.
leaseDatestringRaw lease date (mmyy).
leaseMonthstringDerived ISO month (YYYY-MM).
leaseYearintegerDerived lease year.
refPeriodstringReference quarter (yyqq).
svy21XnumberSVY21 X coordinate of the project.
svy21YnumberSVY21 Y coordinate of the project.
sourcestringAlways the URA Data Service source label.
observedAtstringISO 8601 collection timestamp.

On a failed run, or when no AccessKey is supplied, a single item with a populated error field is written instead of results.

Example output record

The one record this actor returns without a valid AccessKey (real, from run UNGWuHM3J7UaoiRL9):

{
"error": "A free URA AccessKey is required. Register at ura.gov.sg (Digital Services > URA Data Service), then paste your AccessKey into the \"URA Access Key\" input field. The actor exchanges it for a daily token automatically.",
"source": "URA (Urban Redevelopment Authority), Singapore",
"observedAt": "2026-08-10T14:35:38.442Z"
}

With a valid AccessKey, records follow the transaction or rental schema documented in Output reference.

Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token and use your own URA AccessKey.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~singapore-ura-property-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"dataType":"transactions","uraAccessKey":"YOUR_KEY","districts":["10"],"minPrice":2000000,"maxRecords":25}'

Start a run asynchronously:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~singapore-ura-property-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"dataType":"rentals","uraAccessKey":"YOUR_KEY","refPeriods":["24q2"],"maxRecords":100}'

Apify CLI:

apify call scrapers_lat/singapore-ura-property-scraper \
--input '{"dataType":"transactions","uraAccessKey":"YOUR_KEY","projectNames":["The Sail"],"maxRecords":50}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per transaction or rental record returned (result event). See the pricing tab for the current per-result price.
  • No charge on failure. If no AccessKey is supplied or a run errors, the actor writes a single item with a populated error field and does not charge for it. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results.
  • Free Apify plans are capped at 10 records per run. Upgrade for higher maxRecords.
  • URA AccessKey required. The AccessKey is free from URA and supplied by you. The actor never bundles or shares a key.

FAQ and troubleshooting

A run returned only an error record. Why? No valid URA AccessKey was supplied, or the key was rejected. Register a free AccessKey at ura.gov.sg and paste it into uraAccessKey. The error record is not charged.

Where do I get an AccessKey? At ura.gov.sg under Digital Services > URA Data Service. URA emails you an AccessKey once your registration is approved. It is free.

Sales or rentals? Set dataType to transactions for unit-level sales (last 5 years) or rentals for rental contracts (by quarter).

Why are some fields null? The URA source did not publish that value for the record. Missing source values are returned as null, never invented.

What extra fields do you add? Square-foot area, price per square foot and per square metre, human-readable sale-type and market-segment names, and ISO YYYY-MM months, computed on top of the raw URA fields for easier analysis.

Is this an official URA tool? No. This actor is independent and has no affiliation with the Urban Redevelopment Authority. It uses your own AccessKey to read publicly available URA Data Service data. Use the results in accordance with URA's terms.

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for public platforms: real estate, company registries, government data, finance and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool, not affiliated with the Urban Redevelopment Authority (URA). Uses your own free AccessKey to read publicly available URA Data Service data. Use the results in accordance with URA's terms.