PRODUCTION · REAL ESTATE · DUBAI

Every call
answered.
Every lead scored.

A 24/7 AI voice receptionist named Sarah that handles real estate inquiries via WebRTC voice — searches properties, books viewings, and escalates to agents — all in natural conversation. Claude scores every call 0–100 in the background.

31
Routes
5
DB models
50+
Seeded listings
WebRTC
Real-time voice
sunriserealty.app/call
Sarah is listening · 0:42
I'm looking for a 2-bed apartment in Dubai Marina, budget around 2 million.
Great choice! I found 3 apartments in Dubai Marina within your budget. The top pick is a 2-bed at Cayan Tower — 1,450 sqft, AED 1.95M, with full marina views and a private balcony.
Can I book a viewing for Saturday afternoon?
Perfect! I've booked your viewing at Cayan Tower for Saturday 2:00 PM. Our agent will meet you in the lobby.
Properties found
CT
Cayan Tower · 2BR
Dubai Marina · AED 1,950,000
Viewing
85
CLAUDE · scored
Qualified lead
BOOKED
Sat 2:00 PM
Powered by
OpenAI Realtime Claude Sonnet 4 WebRTC FastAPI PostgreSQL AWS S3 SQLAlchemy 2.0 Docker
THE PROBLEM

After-hours calls go to voicemail.

Real estate agencies lose 40%+ of inquiries outside business hours. A hot lead calling at 9 PM hits a recorded message and never calls back.

40% missed inquiries

Evenings, weekends, holidays — the busiest prospect times are the ones nobody's answering.

Slow response time

Average callback takes 2+ hours. Studies show leads go cold after 5 minutes.

Unqualified handoffs

Receptionists forward every call equally. No scoring, no priority — agents waste time on tire-kickers.

No instant booking

Prospect wants to see a unit this weekend. But booking requires a human, a CRM, and 3 back-and-forth emails.

THE SOLUTION

An AI receptionist that
searches, books, and scores.

Sarah is always on. She speaks naturally via WebRTC, searches 50+ listings in real time, books viewings mid-call, and sends Claude a transcript for lead scoring the moment the call ends.

1

Caller speaks via WebRTC

Browser mic → OpenAI Realtime with Whisper STT + "shimmer" TTS + server-side VAD (800ms silence threshold).

2

AI searches live properties

Tool-use: search_properties() queries the DB by bedrooms, location, price range, type. Results spoken naturally.

3

Books viewings mid-call

Tool-use: book_viewing() creates a Viewing row — property, date, time, contact — all confirmed in conversation.

4

Escalates when needed

Complex asks or complaints → request_callback() captures reason + contact → agent sees escalation in dashboard.

5

Claude scores the call

Background task fires asyncio.create_task() → Claude reads transcript → returns score 0–100, intent, status, summary.

VOICE_TOOLS — tool definitions
# OpenAI Realtime tool-use definitions
VOICE_TOOLS = [
  {
    "name": "search_properties",
    "description": "Search Dubai property listings",
    "parameters": {
      "bedrooms": "int",
      "location": "string",
      "min_price": "float",
      "max_price": "float",
      "property_type": "enum",
    }
  },
  {
    "name": "book_viewing",
    "parameters": {
      "property_id": "uuid",
      "viewer_name": "string",
      "viewing_date": "YYYY-MM-DD",
      "viewing_time": "HH:MM AM/PM",
    }
  },
  {
    "name": "request_callback",
    "parameters": {
      "caller_name": "string",
      "reason": "string",
    }
  },
]
ARCHITECTURE

Two AI models, one voice loop.

OpenAI Realtime handles the live voice + tool execution; Claude handles post-call intelligence. Both async, both with retry/backoff.

Real-time voice layer
Browser mic
WebRTC
Whisper STT
Auto-transcribe
GPT-4o Realtime
"Sarah" persona
Tool calls
search · book · escalate
TTS "shimmer"
Voice output
Application layer
Controller
calls
Session lifecycle
Controller
viewings
Booking CRUD
Service
property
50+ listings
Service
ai (Claude)
Score + summary
Data layer
User
Property
CallSession
Viewing
OTP
FEATURES

Voice, tools, scoring — end to end.

Natural voice via WebRTC

OpenAI Realtime with Whisper STT, "shimmer" TTS, and server-side VAD (0.6 threshold, 800ms silence). Low-latency peer connection.

gpt-4o-realtimeVAD

Live property search

AI calls search_properties() mid-conversation. Filters: bedrooms, location, price, type. 50+ Dubai listings seeded.

tool-usePostgreSQL

In-call viewing booking

Caller says "Saturday 2 PM" → tool creates a Viewing row → AI confirms date, time, and location. No human required.

book_viewingDB write

Async lead scoring

Call ends → asyncio.create_task() → Claude reads transcript → returns score (0–100), intent, status, summary. Agents see it seconds later.

Claude Sonnet 4background

Agent dashboard

KPI cards (total calls, qualified %, avg score, viewings booked). Recent calls list. Full transcript detail. Viewing calendar.

KPIstranscripts

Property management

Full CRUD: apartments, villas, penthouses, townhouses. Multi-image upload to S3. Featured flag. AED pricing. Dubai communities.

S3 imagesCRUD
TECH STACK

OpenAI voice + Claude brain, async Python.

Backend

  • Python 3.12
  • FastAPI 0.115
  • Uvicorn 0.34
  • Pydantic v2
  • itsdangerous tokens

Data

  • PostgreSQL
  • asyncpg driver
  • SQLAlchemy 2.0
  • Alembic configured
  • UUID PKs · JSON fields

AI / Voice

  • OpenAI Realtime API
  • gpt-4o-realtime
  • Claude Sonnet 4
  • WebRTC + VAD
  • Tool-use (3 tools)

Infra / UI

  • Docker / Compose
  • Azure Pipelines CI
  • Jinja2 + Tailwind
  • AWS S3 (images)
  • aiosmtplib (OTP)
CALL FLOW

From "hello" to qualified lead.

01

Caller clicks "Talk to Sarah"

Browser requests ephemeral WebRTC token. Peer connection opens. Mic activates.

02

Natural voice conversation

Sarah greets, qualifies (budget, location, timeline, buy-to-live vs invest), and searches the property DB in real time.

03

Tool calls fire in-flight

search_properties → results spoken. book_viewing → confirmed mid-call. request_callback → escalation logged.

04

Call ends → transcript saved

Full JSON transcript, properties discussed, duration — all persisted to CallSession. Agent dashboard updates.

05

Claude scores in background

asyncio.create_task() → Claude reads entire transcript → returns score 0–100, qualified/unqualified, intent, summary.

06

Agent follows up

Dashboard shows scored call + transcript + booked viewings. Agent clicks through to confirm Saturday 2 PM at Cayan Tower.

PRODUCT TOUR

See it in action.

sunriserealty.app/dashboard
Dashboard
Agent dashboard
KPIs, recent calls with scores, upcoming viewings
Primary view
/call
Voice call
Voice call interface
Mic, waveform, live transcript, property sidebar
/calls/{id}
Call detail
Call detail + transcript
Full conversation, score, intent, properties discussed
/viewings
Viewings
Scheduled viewings
Date, time, property, viewer, status
/properties/list
Properties
Property management
50+ Dubai listings, images, CRUD
IMPACT

A 24/7 receptionist that
never misses a call.

Every after-hours inquiry answered, every lead scored, every viewing booked — all before the human team wakes up.

24/7
Always on
0–100
Lead scoring
In-call
Viewing booking
3 tools
Search · book · escalate
Production-ready · WebRTC voice · Claude scoring · async throughout