Inspiration

In August 2026 a renter in San Francisco wired $18,600 for a Duboce Triangle apartment that didn't exist: a copy of a real Zillow listing. Anyone moving to SF for one to six months (interns, new hires, founders in a batch) has to rent sight unseen from Craigslist sublets, and that's exactly who scammers target: "I'm abroad, Zelle me the deposit." I came from Argentina for six weeks and lived it. I wanted a personal agent that rents for you and never sends money before you've seen the place.

What it does

You say what you want ("furnished 1BR under $4,000, Nov 1 to Dec 15"). Sublet Sniper:

  • Searches ~770 live Craigslist SF listings and normalizes the mess (weekly prices, totals, dates).
  • Scam-scores every listing (0–100, explainable): price far below the neighborhood median, payment red flags (Zelle, wire, "deposit to hold"), "out of the country", keys by mail, upfront above 2× rent (California AB 12), duplicate text and reused photos (perceptual hashing). Red listings are never contacted.
  • Emails the landlord from its own inbox and keeps negotiating by email.
  • Phones the landlord with a voice agent, with live captions on screen: it refuses any payment before a viewing, negotiates inside your budget, and books the viewing mid-call.
  • Leaves you one step: pick a listing, then add the viewing to your calendar.
  • Agent-native: the same tools over MCP (search_sublets, check_listing_scam, contact_landlord, get_deals, ask_agent), so Claude or ChatGPT can rent through it.

How we built it

Next.js 15 + TypeScript on Vercel (Fluid Compute). GPT-4.1 runs the chat agent with tool calling. AgentMail provides the agent's inbox and webhooks. ElevenLabs Conversational AI handles the phone calls, over a Twilio number, with webhook tools (book_viewing, get_free_slots), and Twilio real-time transcription streams live captions. Supabase provides multi-tenant auth (magic link or guest) with row-level security. The scam score is deterministic TypeScript: medians per neighborhood, keyword rules, shingle-Jaccard text similarity and pHash photo matching. An MCP server and llms.txt expose the product to other agents. 90 Vitest tests cover the flow from search to booking and scam refusal.

Challenges we ran into

  • Voice agents in real phone calls: latency, background noise interrupting the agent, greetings lost while international audio connected, a "smarter" model that leaked its reasoning and invented prices. We went back to a fast model with a deterministic negotiation ladder and a step-by-step call script.
  • Spoken times: the agent heard "six PM" and booked 9:30 AM, so we added a parser for spoken times.
  • Serverless state: calls, emails and the UI hit different instances. We rebuilt deal state from the mailbox, merged call records across instances and guarded against double-dialing.
  • Staying legal and ethical: no automated Craigslist contact and no captcha solving. The agent only emails and calls an allowlisted demo landlord; real Craigslist replies stay human.

Accomplishments that we're proud of

A real end-to-end loop working live: search → scam blocked → email → phone call → the agent refuses a Zelle deposit, counters $3,400, agrees $3,600 → viewing booked, in under two minutes. One click from the human. The scam score is explainable, not a black box.

What we learned

For voice agents, deterministic rules beat bigger models: fixed numbers, short scripted lines, explicit exits. Above all, the strongest scam protection is behavioral: the agent simply never pays before a viewing, so even a scam that scores green can't get paid.

What's next for Sublet Sniper

Licensed listing feeds instead of scraping, verified-landlord signals, more cities, renter profiles with references, and calling real landlords with proper consent.

Built With

Share this project:

Updates

Submission history