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.
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.
Evenings, weekends, holidays — the busiest prospect times are the ones nobody's answering.
Average callback takes 2+ hours. Studies show leads go cold after 5 minutes.
Receptionists forward every call equally. No scoring, no priority — agents waste time on tire-kickers.
Prospect wants to see a unit this weekend. But booking requires a human, a CRM, and 3 back-and-forth emails.
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.
Browser mic → OpenAI Realtime with Whisper STT + "shimmer" TTS + server-side VAD (800ms silence threshold).
Tool-use: search_properties() queries the DB by bedrooms, location, price range, type. Results spoken naturally.
Tool-use: book_viewing() creates a Viewing row — property, date, time, contact — all confirmed in conversation.
Complex asks or complaints → request_callback() captures reason + contact → agent sees escalation in dashboard.
Background task fires asyncio.create_task() → Claude reads transcript → returns score 0–100, intent, status, summary.
# 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",
}
},
]
OpenAI Realtime handles the live voice + tool execution; Claude handles post-call intelligence. Both async, both with retry/backoff.
OpenAI Realtime with Whisper STT, "shimmer" TTS, and server-side VAD (0.6 threshold, 800ms silence). Low-latency peer connection.
AI calls search_properties() mid-conversation. Filters: bedrooms, location, price, type. 50+ Dubai listings seeded.
Caller says "Saturday 2 PM" → tool creates a Viewing row → AI confirms date, time, and location. No human required.
Call ends → asyncio.create_task() → Claude reads transcript → returns score (0–100), intent, status, summary. Agents see it seconds later.
KPI cards (total calls, qualified %, avg score, viewings booked). Recent calls list. Full transcript detail. Viewing calendar.
Full CRUD: apartments, villas, penthouses, townhouses. Multi-image upload to S3. Featured flag. AED pricing. Dubai communities.
Browser requests ephemeral WebRTC token. Peer connection opens. Mic activates.
Sarah greets, qualifies (budget, location, timeline, buy-to-live vs invest), and searches the property DB in real time.
search_properties → results spoken. book_viewing → confirmed mid-call. request_callback → escalation logged.
Full JSON transcript, properties discussed, duration — all persisted to CallSession. Agent dashboard updates.
asyncio.create_task() → Claude reads entire transcript → returns score 0–100, qualified/unqualified, intent, summary.
Dashboard shows scored call + transcript + booked viewings. Agent clicks through to confirm Saturday 2 PM at Cayan Tower.
Every after-hours inquiry answered, every lead scored, every viewing booked — all before the human team wakes up.