Hackathon Project

PropertyAgent

Search Singapore property in plain English, get an instant fair-value verdict, and book the viewing, no agent required. A conversational agent that pulls live listings, cross-checks valuations, and handles scheduling end-to-end.

Next.js · Google ADK · Gemini 2.5 Flash · Elasticsearch Live demo → GitHub →
PropertyAgent live demo, showing the conversational search sidebar with example prompts and the Singapore property map

The Idea

Buying, selling or renting a property in Singapore or most parts of the world requires a middleman. However, with open sourced data available (and with rising agent comission costs), a lot of the next generation buyers/sellers/renters and landlords are looking to go DIY. Current platforms exist but they do not synthesize these data points well. They are never end-to-end and often requires users to search for data on multiple platforms. This is why we built PropertyAgent, a conversational agent that can search, evaluate a price based on complex data sets, and be your personal property assistant - from scheduling of viewing to producing legal documents.

The Pain Points

These pain points determined what we actually shipped first, not the full platform vision in the PRD. See Scoping It for what's to come.

"My agent's commission is 1–2% of the sale price just to have someone tell me information that's mostly already public... But they represent me in the transaction so I just go with it"

"Most of the time we search with pre-set filters like location, size and price. But what if I wanted to live next to a park or a school, existing platforms exclude places like these"

"I have no idea if a price is fair. I can't read into the valuator's mind. Bid too high and I overpay on COV, bid too low and I lose the flat."

"Coordinating a viewing means messaging multiple owners across different platforms and juggling everyone's calendar by hand. That's just the start of all the admin work that I need to do."

Customer Journey

Before PropertyAgent, Josh had two options: pay a traditional agent, or do it all himself. Here's what both looked like, phase by phase — and where PropertyAgent actually changes something today.

Persona

Josh, a first-time buyer, works as a teacher, doesn't have experience with resale transactions, and he doesnt have much time to think about this.

Scenario

Josh needs to find a flat that fits his lifestyle, book viewings without the usual back-and-forth, and know whether an asking price is worth bidding on.

Before PropertyAgent: Josh's homeownership journey, comparing a standard agent vs. doing it himself across five phases (Search & Discovery, Viewing & Scheduling, Valuation & Deciding to Bid, Negotiation & Offer, Statutory Completion), with his thoughts at each phase and an honest opportunity call-out for where PropertyAgent already helps today

Standard agent vs. doing it himself, phase by phase — click to enlarge

The bet: search, scheduling, and valuation are the three phases where neither a standard agent nor doing it alone gives Josh an edge today — that's where PropertyAgent already helps. Negotiation and the statutory workflow are still open gaps, covered in What's Next.

Scoping It

The PRD covers a full platform: Singpass verification, statutory milestone tracking, contract generation, monetization. Shipping a focused proof of the core agent loop meant almost none of that could make it into this build. Every cut needed an actual reason.

Cut, and why

  • Singpass verification & MyInfo pull: needs government API access and legal review, not a hackathon sandbox
  • Statutory milestone tracker (OTP, Request for Value, Resale Application), which carries high compliance surface area; needed HDB data plumbing we didn't have time to build safely
  • Multi-language translation layer, nice to have, not core to proving the agent loop
  • Legal document generation (CEA tenancy agreement, OTP auto-fill): regulatory risk, not something to prototype under deadline
  • Monetization (premium pass, legal closure kit, affiliate fees), not needed to prove the concept

Kept, and why

  • Conversational search over Elasticsearch: the core "beyond rigid filters" bet, and the reason for the Elastic partner track
  • Auto-scheduled viewings via Google Calendar, the clearest "no manual coordination" win, small enough to ship in days
  • Instant valuation verdict: a percentile-based read on price, without needing a licensed financial advice product
  • A synthetic ~700-listing dataset instead of live HDB/URA feeds, sidestepping data-access and licensing lead time while still proving the search-and-valuation loop end to end
Caught myself: the PRD called for a "walk-away price ceiling" from a full bidding simulator. What we could actually ship in a week was a directional verdict, not a hard number, and framing it as a verdict rather than a guarantee turned out to be the more honest claim anyway.

Requirements

The PRD turned scope into criteria specific enough to check a build against directly, with no guesswork about what was meant. A few examples:

  • Filter extraction returns typed values through a function-tool call the frontend merges directly, with no text-parsing fallback in production
  • A valuation verdict always states Overpriced / Fair value / Good deal plus the % deviation from median comparable PSF, never a bare label with no number behind it
  • The agent auto-detects whether a message is a search request or a market question, and only calls the filter tool for the former, so analytics questions never corrupt the active filters
  • Viewing requests check the host's live Google Calendar free/busy before offering a slot, never booking blind

Technical Approach

One call shaped the rest: routing search and valuation through Elastic's own Kibana Agent Builder MCP server, rather than querying Elasticsearch directly from application code. A requirement of the hackathon's Elastic partner track, and the reason filter search and valuation numbers reflect a live index instead of hardcoded logic.

Google Cloud Run (Next.js App)
Next.js Frontend
  • Agent chat panel
  • Property list & map
  • User calendar view
Next.js Backend
  • Calls agent to build property filters, returns to frontend
  • Executes ES queries
  • Books viewings for user
Google OAuth 2.0 accounts.google.com
Google ADK Agent
  • FunctionTools: extract_property_filters, get_free_slots, create_viewing_event
  • MCP Toolset: generate_esql, execute_esql, get_index_mapping, search, get_document
Vertex AI gemini-2.5-flash · asia-southeast1
MCP over HTTP (ES|QL), search & valuation queries
Calendar API calls, free/busy & create event
Elastic Cloud
  • Kibana Agent Builder MCP: /api/agent_builder/mcp
  • Elasticsearch: property index, ~700 SG listings
Google Calendar API
  • Free/busy queries
  • Create viewing events
Why: putting search, aggregations, and even ES|QL generation behind Elastic's MCP tools, instead of writing our own query layer, meant the agent could reason about the index directly, and it's what qualified the build for the Elastic partner track.

Building It

Each stage built on top of something that already worked, before the next layer went on.

Data foundation
Synthetic ~700-listing Singapore property dataset generated and bulk-ingested into Elasticsearch with a geo_point mapping.
Search MVP
Next.js scaffold, chat panel, and a first working search-and-chat loop against the index.
Renamed to PropertyAgent, valuation logic added
Property valuation feature and multi-select filters (town, furnishing) shipped alongside the rename.
Switched to Gemini 2.5 Flash
Agent moved onto Gemini 2.5 Flash via Vertex AI mid-build, replacing the earlier model.
Valuation panel & listing images
Valuation moved into the property modal directly; listing photos added for realism.
Deploy to Cloud Run
First deployment to Google Cloud Run, with image accessibility fixes to follow.
Viewing booking
Google Calendar free/busy and event-creation tools wired into the agent; map legend and filter fixes.

Acceptance criteria

  • Filter-extraction tool call returns typed values the UI merges directly, with no text-parsing fallback in production
  • Valuation verdict always pairs a classification with the fair-price range behind it
  • Calendar booking checks free/busy before offering a slot to the requester

Risks encountered

  • The model swap to Gemini 2.5 Flash landed mid-week, which meant re-validating agent behaviour late in the build
  • Map pins failed to render on initial load in one build, caught and fixed before demo day
  • Auth was pulled entirely just before submission so judges could reach the demo without credentials: a reasonable call for a judged demo, not how this would ship to users

What's Next

Search, scheduling, and valuation close the gaps a self-directed buyer hits first. Negotiation and the statutory paperwork are where the same buyer is still exposed, so that's where the next build goes:

  • Buyer & seller verification. Without an agent as a trust layer, self-directed deals are more exposed to ghosting, lowballing, and false signals from the other side — verification logic closes that gap.
  • A structured, data-backed bidding flow. A directional fair-value verdict tells a buyer what to expect, not what to actually offer. Offer stage is the highest-stakes, most emotional decision in the process, and it's the one point still unsupported.
  • A step-by-step statutory milestone tracker. This is the Administrative Completion stage flagged as unbuilt in the Customer Journey above — the paperwork after an accepted offer is exactly where a deal can quietly stall.

Reflection

Ambiguity hiding in a feature's language, or in how a requirement was worded, caused more trouble here than any technical issue did. Two things I'd sharpen next time:

Next time: scope the language of a feature as carefully as its logic. Calling the valuation output a "verdict" instead of a "prediction" set the right expectation for what a percentile comparison can and can't promise.
Next time: write requirements as things checkable against a running agent, not just user stories. The PRD lines that held up best were the ones specific enough to verify without any ambiguity about what was meant.