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:
scraper.py— fetches and parses Craigslist listings usinghttpx+BeautifulSoupllm_analysis.py— sends listing data to OpenAIgpt-4o-mini(with Anthropicclaude-haiku-4-5as a fallback) and returns a suspicion score, red flags, and a paraphrased descriptionmain.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
MutationObserverin 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
Log in or sign up for Devpost to join the conversation.