
You meet a Singapore property agent through a referral, a WhatsApp group, or a flyer. Then you need to know if they are actually registered, and which agency they belong to.
CEA already publishes that. The public register is just a slow place to start a research session.
That is why I built AgentLookup.sg. The first job was verification. The site later grew into agent profiles, agency rosters, HDB town pages, and shareable data cards. It is still not a listing portal.
AgentLookup.sg is independent. It is not CEA, HDB, or URA. Confirm registration on the CEA Public Register before you sign or pay.
The first useful question was a CEA number
Buying, selling, or renting in Singapore is expensive. The first human in that process is often an agent. Names collide, get shortened, and get romanised in different ways.
The CEA registration number does not.
The Council for Estate Agencies publishes currently registered salespersons on data.gov.sg: name, registration number, estate-agent affiliation, licence number, and registration dates. The last snapshot on AgentLookup has 38,232 profiles across 1,015 agencies, synced 12 August 2026.
Version one did one thing. Search by name, registration number, or agency, then open a profile with those public facts.
No agent scores. No “top producer” labels. No invented specialties.
The verify flow is even narrower. Paste a name or CEA number, get an identity card, then jump to the official register. Search URLs stay noindex. The shareable object is the profile, not a query string.
A lookup should not be a dead end
A CEA row is a fact. A product needs a next click.
Each salesperson gets /agent/{cea-reg-slug}. Each estate agency gets /agency/{licence-slug} with the roster. A–Z browse pages exist so you are not trapped in a search box.
From there the loop is obvious:
- Search or paste a registration number
- Open the profile
- Check agency and licence details
- Browse the roster
- Keep going
That is the same lesson as AEDLocator.sg. Public data becomes useful when pages point at related pages.
Next.js, JSON files, and a client search index
The live site does not query a database in the browser. Profiles and rosters are processed JSON. Homepage search loads MiniSearch against /data/search-index.json so typing feels local after the index warms.
The stack I actually run:
- Next.js 16 (App Router) for SSG and ISR
- Tailwind CSS 4 for the UI
- MiniSearch for prefix search on name, normalized name, and registration number
- Processed JSON for agents, agencies, area activity, and HDB/URA market hubs
- MapLibre on the HDB town heatmap
next/ogfor share cards
Agent pages revalidate every 7 days. They are not all prebuilt at next build. 38,000 static profile HTML files on first paint would slow deploys for no user benefit. A–Z hubs are small enough to prebuild. Profiles resolve on demand.
What I did not choose:
| Option | Why I skipped it |
|---|---|
| Runtime database as the read path | Search needs to feel instant. A JSON index in the browser does that. |
| Ranking agents by “performance” | CEA transaction records have no prices and no building names. Counts are not a league table. |
| Joining HDB resale dollars onto agent pages | Different datasets, different jobs. Mixing them looks smart and is misleading. |
| Loan, grant, or stamp-duty engines | Affordability tools compare a budget to town medians. They do not apply CPF, MSR, or LTV rules. |
Do not invent what the source does not contain
Property sites get used for expensive decisions. A confident-looking number with no source is worse than a missing number.
CEA salesperson data can support registration facts. It cannot support ratings, specialties, or transaction value.
CEA residential transaction records can support activity summaries: town or district, represented side, property type mix, trailing 36 months. They cannot support “this agent sold this block for this price.” The file simply does not have dollars or addresses.
HDB resale and rental datasets, plus URA condo rents, power /market pages. Those pages stay off the agent profile. A town median is a market fact. It is not that salesperson’s deal.
The site says this out loud: last sync date, methodology, and a link back to CEA.
People research a place, then an agent
Once lookup worked, the next question was obvious. Most people do not start with “property agent Singapore.” They start with a town, a flat type, or a price they heard from a neighbour.
So I added HDB market pages around how people actually look:
- Town hubs with resale volume, medians, and flat-type slices
- Block pages when there are enough transactions
- Town vs town
- Budget to towns (
/market/hdb/afford) - Remaining-lease lookup
- Record highs and recent lows
- Owner-declared HDB rents, and URA condo rents by district
A Hougang page should not be a national property essay. It should be Hougang.
Area hubs still use CEA transaction counts, not HDB prices. If you want dollars, you are on a market page. If you want who is registered and who has been active in an area, you are on an agent or area page. Keeping those apart is the product.
Tools that answer one question, then stop
The useful tools on AgentLookup are research shortcuts, not fake underwriting.
Paste a budget and a flat type, see which towns have recent medians at or under that number. Compare two towns. Look up remaining lease. Put HDB resale dollars next to indicative rents, with unlike-units labels.
I did not ship a mortgage calculator. I would rather show a median and a date range than pretend I know someone’s CPF balance.
A typical loop looks like this: check an agent, open the town, compare a price, send the page to a spouse. That is more useful than one profile and a bounce.
Share cards are just honest Open Graph images
Property decisions involve more than one person. The next action is often WhatsApp.
Every agent profile already has an Open Graph image: name, CEA number, agency. Market town pages have the same treatment. Block share cards live on a dedicated route so next build does not generate thousands of ImageResponse files.
The card has to stay boring in the right way. Town, transaction count, median, window. No “market is hot” badge. A pretty lie travels farther than a table, which is exactly why it is dangerous.
Programmatic pages only when they finish a job
AgentLookup can mint a lot of URLs. Agent, agency, letter indexes, area hubs, town, flat type, block, month, condo district, tools.
The test is the same as AEDLocator. Does this page answer a search, or help someone complete a task?
An agent profile verifies a person. An agency page is a roster. A town page is local activity. A budget tool is a filter. A query on /verify is a tool, so it is not indexed.
Thin slices without enough transactions stay unpublished. That is cheaper than explaining a median built on three deals.
What I would not do again
Treating the CEA register as the product. The register is the source. Speed, browse links, and a visible as-of date are the product.
Publishing agent “rankings” from transaction counts. Side mix and area activity are useful. A leaderboard is marketing.
Putting HDB prices on salesperson pages because the join key exists. The join is technically tempting. It is still the wrong story.
Prebuilding every agent HTML file on day one. ISR on demand was the right default at 38k profiles.
Known limitations, on purpose
The salesperson dataset lists currently registered people. Expired agents are uncommon in the public file. Status can still change between syncs.
Activity summaries are a trailing 36-month window of CEA residential deals. No matching deals does not mean the person did no work. It means nothing matched that feed.
HDB rents are owner-declared. URA condo rents are major-project samples in $ psf per month, not whole-unit asking rent.
Market hubs are recent by design. Full history stays in raw files for record and lease pages. The default browse view is not 2018.
The site will not become PropertyGuru. Those companies already sell listings. AgentLookup is the research layer: who is this agent, what does this town look like, and can I send a snapshot that does not overclaim.
If you want to see it, open AgentLookup.sg and look up the CEA number on the name card in front of you. Then open the HDB town you actually live in.
If you are turning another public dataset into a directory, hit me up on Twitter.


