# Methodology

How agentlookup.sg derives registration status, transaction counts, and area rankings from CEA open data — and how HDB market pages are built separately.

HTML: https://agentlookup.sg/methodology

**Source scope.** The CEA Salesperson Information dataset on data.gov.sg publishes **currently registered** salespersons only. We do not receive a feed of expired or historical registrations. If someone is missing from this directory, confirm on the CEA Public Register.

**Registration status** on each profile is derived from the salesperson registration end date compared to our last sync date. If the end date is empty or on/after that date, we show Currently registered; otherwise Registration ended. With the open dataset’s active-only scope, almost every profile is Currently registered — treat any directory page as a snapshot and re-check CEA for high-stakes decisions.

**Search** runs in the browser against a compact index built at sync time (name + registration number).

## Transaction activity and areas

Activity summaries use the **CEA Salespersons’ Property Transaction Records (residential)** dataset on data.gov.sg (dataset `d_ee7e46d3c57f7865790704632b0aef71`). Each row is a deal closed by a salesperson: month, property type, transaction type, represented side (buyer / seller / tenant / landlord), and location (town and/or postal district).

**Window.** Public ranks and profile summaries use a **trailing 36 months** ending at the transactions sync date. The window is shown on area and profile pages.

**Areas.** HDB rows map to the `town` field. Private rows without a town map to postal `district`, using `general_location` in the label when present. A deal is counted in exactly one hub. Blank locations are excluded from marketed area pages.

**Sides.** Buy-side / sell-side counts are sales where the salesperson represented the buyer or seller. Tenant / landlord counts are rental representations. We do not invent dollar amounts — CEA TRI does not include prices.

**Agency attribution.** Agency totals sum deals for salespersons matched to the current salesperson register. If an agent changed agencies, historical deals still follow today’s roster join — we note this limitation rather than invent historical agency IDs.

**Rankings.** Organic lists sort by deal count in the window (with optional side filters on area pages). Paid placement, when it exists, will never change these sort keys.

**What we do not show.** Transacted prices, rents, specific addresses, or building / project pages from this dataset. Independent HDB market pages (no agent join) live under `/market`.

## Market hub (HDB prices and condo rents)

Town pages under `/market/hdb` use the HDB resale flat prices dataset on data.gov.sg (dataset `d_8b84c4ee58e3cfc0ece0d773c8ca6abc`). We publish medians, P25/P75, flat-type mix, and capped recent resales for a trailing 36-month window.

**Comparables tool.** `/market/hdb/compare` matches resales in the same town and flat type. If a floor area is given, we keep comps within ±15% sqm; if fewer than 8 remain, we widen to ±25%; if still thin, we show all of that type in the town and say so. An optional block or street query boosts matching rows to the top without hiding the rest. An asking-price percentile is computed on this matched set only. These are historical comps — not an HDB valuation and not cash-over-valuation (COV).

**Budget → towns.** `/market/hdb/afford` lists towns with at least 10 resales of the chosen flat type in the 36-month window, then bins them by how a budget sits against that type’s median and P25: at or under the median, between P25 and median, or below P25. This is not a loan, grant, or HDB valuation calculator — we do not apply income, CPF, MSR, or LTV rules.

**Town vs town.** `/market/hdb/vs` compares two town hubs on trailing-36-month medians, volume, and P25–P75. Pair URLs such as `/market/hdb/ang-mo-kio/vs/bishan` sort slugs so each pair is one page. Remaining-lease mix on these pages comes from the full-history lease track and is labeled as such. This is not a ranking of where to buy.

**Town heatmap.** `/market/hdb/map` colours the same 36-month town medians (or volume) on a zoomable map — URA Master Plan 2019 planning areas matched to HDB towns, accent opacity, initials at town centres. These are not official HDB estate boundaries. Agent activity is a separate area-page link, not a join onto the map.

**Rent vs buy.** `/market/hdb/rent-vs-buy` pairs trailing-36-month resale medians with HDB renting-out medians for the same town and flat type (at least 10 rows on each side). Rents are owner-declared on HDB approval forms — HDB does not verify them. The annual-rent-to-resale figure is a ratio of two market medians, not a rental yield, cash-flow model, or advice to buy or rent.

**HDB rent hubs.** `/market/hdb/rent` and town pages such as `/market/hdb/rent/tampines` use the same renting-out dataset (trailing 36 months). Median, P25, and P75 are monthly rents. These pages are not resale town hubs and not asking rents.

**Private condo rents.** `/market/condo`, district pages such as `/market/condo/district-09`, and project pages use URA’s quarterly rentals of non-landed residential buildings (dataset `d_149ac00a2734bb0a03867bbe2ec0e7b0`). URA publishes a project only when it has at least 100 units and 10 rental contracts that quarter. Median, P25, and P75 are **$ per sq ft per month**, not whole-unit monthly rent and not asking rent. District figures are a median of those project medians. We do not scrape URA PMI or REALIS for sale comps. `/market/hdb-vs-condo` places HDB resale dollars beside these psf rents with unlike-units labels — not an upgrade calculator.

**Town × flat-type pages** (for example `/market/hdb/bedok/type/5-room`) publish when that type has at least 10 resales in the window. They reuse the same 36-month artifacts as town hubs.

**Record resales** under `/market/hdb/records` use the full HDB resale history (January 2017 onward), not the 36-month hub window. Island and town pages show the highest transacted price in that dataset, highs by flat type, and the cheapest sale of each type in the last 12 months (labeled as a recent low — not an all-time low). Block names link to a block hub only when that hub exists in the 36-month market track.

**Remaining lease.** `/market/hdb/lease` and town pages such as `/market/hdb/ang-mo-kio/lease` bin resales by remaining lease (90+, 80–89, 70–79, 60–69, under 60 years) and show median / P25 / P75 in each band. Town pages publish when at least 50 rows have a parsed remaining-lease field; type slices need at least 10. These are dataset medians — not a valuation, not Bala’s Table, and not a forecast of what a flat will be worth.

**Remaining-lease lookup.** `/market/hdb/lease/lookup` maps remaining years (or a 99-year lease start year) onto those same bands and shows that band’s median / P25 / P75. This is not Bala’s Table, not a forecast, and not a valuation of a specific flat.

**No agent join.** HDB and URA market rows have no salesperson registration number. We never attribute these prices or rents to agents or agencies. Soft links between a town or district market page and the matching area activity hub are navigation only.

Browse [areas](https://agentlookup.sg/areas), [market](https://agentlookup.sg/market), or read [about our data](https://agentlookup.sg/about-data.md).
