URA Private Property Transactions Scraper - Singapore Caveats avatar

URA Private Property Transactions Scraper - Singapore Caveats

Pricing

$4.00 / 1,000 transaction scrapeds

Go to Apify Store
URA Private Property Transactions Scraper - Singapore Caveats

URA Private Property Transactions Scraper - Singapore Caveats

Scrape official URA private residential transactions (caveats) for Singapore: transacted price, $PSF/$PSM, area, tenure, floor, district, market segment & sale type. Filter by period, type & price. No API key. Export to JSON, CSV or Excel.

Pricing

$4.00 / 1,000 transaction scrapeds

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

URA Private Property Transactions Scraper — Singapore Caveats

Extract Singapore's official private residential property transactions straight from the URA Property Market Information portal — the actual transacted (caveat) prices, not asking prices. Every record carries the transacted price, $PSF and $PSM, floor area (sqft & sqm), tenure, floor level, postal district, market segment (CCR/RCR/OCR), property type and sale type, with the period, district, price and tenure all filterable.

No API key, no login, no browser, no personal data — this actor reads URA's own public transaction search and ships a clean, analysis-ready dataset of every caveat in your chosen period.

Why this URA transactions scraper?

Property portals show asking prices. The number that actually matters — what a unit sold for — is the caveat lodged with URA. This actor turns that gated, paginated government search into a structured, exportable dataset, with derived fields most tools never compute:

DataPortal listingsThis actor
Project & street name
Transacted price (actual, not asking)
Unit price $PSF and $PSMpartial
Floor area in sqft and sqmpartial
Nett price (developer discounts)✅ when applicable
Sale type (New Sale / Sub Sale / Resale)partial
Property type (condo, apartment, EC, landed…)
Tenure + derived freehold/leasehold, lease term, remaining lease years
Postal district + locality name (01–28)partial
Market segment CCR / RCR / OCR
Floor-level band (+ parsed from/to floors)
Period, price, $PSF, area & tenure filters
Monitor mode — only newly lodged caveats
One clean dataset, no empty columns

Use cases

  • Asking-vs-transacted analysis — pair this with a listings scraper (99.co, EdgeProp.sg) to compare what's listed against what actually sold.
  • Automated valuation & comparables (X-Value style) — pull recent caveats for a project, district or street to build comps and price-per-square-foot benchmarks.
  • Investment & market research — track $PSF trends by market segment (CCR/RCR/OCR), tenure and property type over any period.
  • Agent & developer intelligence — see transaction volume and pricing by project, district and floor band.
  • Mortgage, proptech & analytics products — feed standardized, deduplicated transaction records into dashboards, models and data warehouses.
  • Lease-decay analysisremainingLeaseYears is computed for every leasehold caveat, ready for ageing-leasehold studies.

How to use

  1. Sign up for Apify — the free plan is enough to try this actor.
  2. Open the URA Private Property Transactions Scraper, choose a period (fromMonth / toMonth) and optionally a property type, postal district, market segment or price band, then click Start.
  3. Watch transactions stream into the dataset table.
  4. Export as JSON, CSV, Excel, XML or RSS — or pull results programmatically via the Apify API.

Leave everything on defaults and you get the last 6 months of all-Singapore private residential transactions, newest period first.

Input

{
"fromMonth": "2026-01",
"toMonth": "2026-06",
"propertyTypes": ["Apartments & Condominiums", "Executive Condominiums"],
"saleTypes": ["Resale"],
"postalDistricts": ["09", "10", "11"],
"marketSegments": ["CCR"],
"minPrice": 1000000,
"maxResults": 500,
"monitorMode": false
}
  • fromMonth / toMonth — period as YYYY-MM. Leave blank for a rolling last-6-months window ending the current month.
  • propertyTypesLanded (Non-Strata), Strata Landed, Apartments & Condominiums, Executive Condominiums. Empty = all.
  • saleTypesNew Sale, Sub Sale, Resale. Empty = all.
  • postalDistricts — keep only districts 0128 (e.g. 09 Orchard, 10 Bukit Timah, 15 East Coast, 19 Hougang/Punggol/Sengkang). Empty = all of Singapore.
  • marketSegmentsCCR (Core Central), RCR (Rest of Central), OCR (Outside Central). Empty = all.
  • projectNameContains / streetContains — case-insensitive substring filters.
  • minPrice / maxPrice / minPsf / maxPsf / minAreaSqft / maxAreaSqft — numeric range filters (0 = no bound).
  • tenureFilterAny, Freehold or Leasehold.
  • maxResults (default 100) — cap on transaction records. Raise it for a full market pull (URA returns thousands of caveats for a typical multi-month query).
  • resultsPerRequest (default 200) — rows pulled per page request (20–500).
  • monitorMode (default false) — emit only caveats not seen in previous runs (see below).

Output

One record per transaction (caveat):

{
"projectName": "QUEENS",
"streetName": "STIRLING ROAD",
"propertyType": "Condominium",
"typeOfArea": "Strata",
"typeOfSale": "Resale",
"transactedPrice": 1584000,
"nettPrice": null,
"unitPricePsf": 1731,
"unitPricePsm": 18635,
"areaSqft": 914.94,
"areaSqm": 85,
"numberOfUnits": 1,
"postalDistrict": "03",
"districtName": "Queenstown, Tiong Bahru",
"marketSegment": "Rest of Central Region",
"region": "RCR",
"tenure": "99 yrs lease commencing from 1998",
"tenureType": "Leasehold",
"leaseTermYears": 99,
"leaseCommenceYear": 1998,
"remainingLeaseYears": 71,
"floorLevel": "11 to 15",
"floorFrom": 11,
"floorTo": 15,
"saleMonth": "2026-06",
"saleYear": 2026,
"saleDateRaw": "Jun-26",
"transactionId": "QUEENS|STIRLING ROAD|2026-06|1584000|914.94|11 to 15|Condominium|Resale",
"sourceUrl": "https://eservice.ura.gov.sg/property-market-information/pmiResidentialTransactionSearch",
"scrapedAt": "2026-06-25T12:00:00.000Z"
}

Use the Transactions, Pricing & size and By location dataset views to switch between column sets.

What to expect (field coverage)

FieldCoverage
project, street, property type, sale type, transacted price, $PSF, $PSM, area (sqft & sqm), units, district, market segment, tenure, sale month~100%
floor level / floor bandstrata apartments, condos & EC (landed houses have no floor band)
lease term, lease commence year, remaining lease yearsall leasehold records (freehold has no lease)
nett priceonly developer New Sales with a discount/rebate

A blank field means URA does not record that value for that caveat (e.g. a freehold unit has no lease, a landed house has no floor band) — not that scraping failed. Nothing is dropped, so you always get the richest record URA exposes.

Monitoring mode — only new transactions

Turn on monitorMode to make the actor remember which caveats it has already returned and emit only transactions not seen in previous runs — perfect for a daily/weekly feed of newly lodged caveats in a project, district or segment. It stores seen transaction fingerprints in a named key-value store (monitorStoreName, one per tracked market).

This complements Apify Schedules and does not conflict with them: Schedules decide when the actor runs, monitoring mode decides what is new in each run. Use both together to track the market as fresh caveats are lodged.

Automate & schedule

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('scrapesage/ura-property-transactions-scraper').call({
fromMonth: '2026-01',
toMonth: '2026-06',
propertyTypes: ['Apartments & Condominiums'],
postalDistricts: ['09', '10'],
maxResults: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} transactions`);

Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

  • Make — multi-step automation scenarios.
  • Zapier — push new transactions into your tools.
  • Slack — get notified when a monitored market records new caveats.
  • Google Drive / Sheets — auto-export every run to a spreadsheet.
  • Airbyte — pipe results into your data warehouse.
  • GitHub — trigger runs from commits or releases.

Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the Apify MCP server — ask your assistant to "pull every URA condo transaction in district 9 over the last quarter and average the $PSF" and let it run the scraper for you.

Agent-ready: autonomous payments (x402 & Skyfire)

This actor is agent-ready — AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402 — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server — no account, no API key.
  • Skyfire — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

More scrapers from scrapesage

Build a complete Singapore property & market-intelligence stack:

Tips

  • Full market pull: leave the filters empty, set a wide fromMonth/toMonth and a high maxResults to download every caveat in the period.
  • Comparables for one project: set projectNameContains (e.g. the sail) over a 12-month window.
  • Prime vs suburban: filter marketSegments to CCR (prime) or OCR (suburban) and compare $PSF.
  • Ageing leasehold: filter tenureFilter to Leasehold and sort by remainingLeaseYears.
  • Recurring monitoring: combine Schedules with monitorMode to capture only newly lodged caveats.

FAQ

Are these asking prices or actual sale prices? Actual. URA caveats are the transacted prices lodged when a property is bought — the ground-truth the whole market is benchmarked against.

Does it need a URA account or API key? No. This actor reads URA's own public Property Market Information transaction search — no AccessKey, login or browser.

Does it expose any personal data? No. URA caveats are anonymous — there are no buyer, seller or agent names. The data is purely about the property and the price.

How far back can I go? Use fromMonth/toMonth to set any period the URA portal covers (typically the recent years of caveats). Large windows simply return more records.

Why is nett price / floor level / lease year sometimes blank? Because URA doesn't record it for that caveat: nett price exists only for discounted developer sales, landed houses have no floor band, and freehold units have no lease. Nothing is dropped — blanks are honest source gaps.

Can I export to Google Sheets, CSV, or Excel? Yes — one click in the dataset view, or automatically on every run via the Google Drive integration.

How do I track new transactions? Turn on monitorMode and create a Schedule; each run returns only caveats not seen before. Add a webhook to push them into your stack.

Is scraping URA data legal? This actor collects publicly available, non-personal transaction data. You are responsible for using it in compliance with applicable laws and URA's terms.

Need help?

Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests are welcome — this actor is actively maintained.