Inspiration

Rental scams cost Americans hundreds of millions of dollars every year. Victims are often first-time renters, students, or people relocating to a new city — people who can least afford to lose a security deposit or month's rent to a fraudster. We wanted to build something that anyone could use before wiring money to a stranger on the internet.

What We Built

RentSentry is a rental listing fraud detector. You paste a Craigslist URL (or raw listing text) and get back:

  • A trust score (0–100) — a weighted composite of LLM suspicion analysis and price heuristics
  • Red flags — short, plain-English fraud signals extracted by the LLM (e.g. "Wire transfer required", "Landlord claims to be overseas")
  • Accessibility signals — positive location signals like nearby transit, parking, and ADA features
  • A clean listing preview — the LLM rewrites cluttered ALL-CAPS, emoji-heavy Craigslist text into professional prose
  • Reverse image search links — Google Lens and TinEye links under every listing photo so you can spot stock images in one click
  • A browser extension that injects an inline trust badge directly on Craigslist and Facebook Marketplace pages

The trust score formula is: $$\text{trust_score} = 100 - ((\text{llm_score} \times 0.6) + (\text{price_score} \times 0.4))$$

How We Built It

The backend is a FastAPI service with three modules:

  1. scraper.py — fetches and parses Craigslist listings using httpx + BeautifulSoup
  2. llm_analysis.py — sends listing data to OpenAI gpt-4o-mini (with Anthropic claude-haiku-4-5 as a fallback) and returns a suspicion score, red flags, and a paraphrased description
  3. main.py — orchestrates everything, applies price heuristics, and returns a unified JSON response

The frontend is intentionally lightweight — a single index.html with vanilla JS, no build step needed. It includes a demo mode that works entirely in-browser without the backend.

We also built a Firefox browser extension (Manifest V3) that uses a MutationObserver to detect listing pages on Craigslist and Facebook Marketplace and inject the RentSentry panel automatically.

The service is deployed on Render.

Challenges

  • Craigslist anti-scraping: Craigslist aggressively blocks automated requests. We had to carefully mimic browser headers and handle edge cases like missing price fields, QR code footers in descriptions, and lazy-loaded images.
  • LLM reliability: LLMs occasionally return malformed JSON or refuse to score borderline listings. We wrapped every LLM call in a safe fallback that returns a neutral default dict so the app never crashes.
  • Facebook Marketplace scraping: Facebook uses a React-rendered DOM with no stable IDs. We had to use a MutationObserver in the extension's content script to wait for the listing content to appear before extracting it.
  • Price heuristics without a real API: We built a Boston-specific median rent table by hand to power the market price score. Scaling this to other cities is on our roadmap.

What We Learned

  • How to structure a multi-model LLM pipeline with graceful fallbacks
  • How to write Manifest V3 browser extensions that work across dynamically rendered pages
  • How to balance speed vs. accuracy when chaining async scraping + LLM calls

Built With

  • anthropic-api-(claude-haiku-4-5)
  • beautifulsoup4
  • fastapi
  • firefox-extension-(manifest-v3)
  • html/css
  • httpx
  • javascript
  • openai-api-(gpt-4o-mini)
  • python
  • render
Share this project:

Updates