URA Private Property Transactions Scraper - Singapore Caveats
Pricing
$4.00 / 1,000 transaction scrapeds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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:
| Data | Portal listings | This actor |
|---|---|---|
| Project & street name | ✅ | ✅ |
| Transacted price (actual, not asking) | ❌ | ✅ |
| Unit price $PSF and $PSM | partial | ✅ |
| Floor area in sqft and sqm | partial | ✅ |
| 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 analysis —
remainingLeaseYearsis computed for every leasehold caveat, ready for ageing-leasehold studies.
How to use
- Sign up for Apify — the free plan is enough to try this actor.
- 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. - Watch transactions stream into the dataset table.
- 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. - propertyTypes —
Landed (Non-Strata),Strata Landed,Apartments & Condominiums,Executive Condominiums. Empty = all. - saleTypes —
New Sale,Sub Sale,Resale. Empty = all. - postalDistricts — keep only districts
01–28(e.g.09Orchard,10Bukit Timah,15East Coast,19Hougang/Punggol/Sengkang). Empty = all of Singapore. - marketSegments —
CCR(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). - tenureFilter —
Any,FreeholdorLeasehold. - 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)
| Field | Coverage |
|---|---|
| project, street, property type, sale type, transacted price, $PSF, $PSM, area (sqft & sqm), units, district, market segment, tenure, sale month | ~100% |
| floor level / floor band | strata apartments, condos & EC (landed houses have no floor band) |
| lease term, lease commence year, remaining lease years | all leasehold records (freehold has no lease) |
| nett price | only 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
- Apify API — start runs, fetch datasets, manage schedules over REST.
- apify-client for JavaScript and apify-client for Python — official SDKs.
- Schedules — run it daily/weekly to refresh comps and capture new caveats.
- Webhooks — trigger downstream actions (warehouse load, Slack alert, model refresh) the moment a run finishes.
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:
- 99.co Property Scraper — Singapore property listings and agent leads.
- EdgeProp.sg Scraper — Singapore property listings and agent leads.
- Singapore Company Scraper — UEN, registry and business leads.
- SGCarMart Used Car Scraper — used-car prices, COE/OMV/ARF and dealer leads.
- JobStreet Singapore Scraper — Singapore jobs, salaries and leads.
- MyCareersFuture Scraper — Singapore jobs, salaries and leads.
- StreetDirectory Scraper — Singapore business leads.
- Google Maps Scraper — local businesses with phone, website and reviews.
Tips
- Full market pull: leave the filters empty, set a wide
fromMonth/toMonthand a highmaxResultsto 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
marketSegmentstoCCR(prime) orOCR(suburban) and compare $PSF. - Ageing leasehold: filter
tenureFiltertoLeaseholdand sort byremainingLeaseYears. - Recurring monitoring: combine Schedules with
monitorModeto 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.