How It Works
An autonomous investment intelligence system built to find mispriced classic BMWs.
Classic BMW prices vary widely across platforms and markets. Salvage and export channels often sit well below the enthusiast market, and right-hand-drive Japanese-market cars can be cheaper than their EU/UK equivalents. These spreads exist because auction platforms don't model variant-level value — a "330i" could be a regular sedan or a ZHP performance package worth far more. This system quantifies the gaps from real sold data, and accounts for import duty and VAT before calling a spread a profit.
Domain knowledge applied at scale. The system distinguishes 35 specific variants across 7 BMW platforms (E24, E28, E30, E34, E36, E39, E46), identifies misidentified cars via VIN decoding, calculates cross-market spreads in real-time, and sends deal alerts to Telegram and Slack when opportunities surface.
Architecture
DATA SOURCES PROCESSING OUTPUT
Classic.com ----+ +------------------+ +-- Telegram Alerts
| | | |
BaT Auctions ---+---> SQLite ---> Deal Scoring +---> Web --+-- Slack #bmw
| DB | VIN Decode | Dashboard|
Cars & Bids ----+ | Mileage Curves | +-- JSON API
| | Arbitrage Calc |
Copart/IAAI ----+ | Condition Class |
| +------------------+
Goo-net Japan --+
| Cron Schedule:
Exchange Rates -+ BaT: daily
C&B: 1x/day
Google Trends --+ RSS: 6x/day
Analysis: weekly
Data Pipeline
Multiple data sources scraped automatically. Playwright browser automation for auction sites (BaT, C&B, Classic.com). REST API for Copart/IAAI via auction-api.app. HTTP for exchange rates and Goo-net Japan export inventory.
6 analysis types. Deal scoring (below-market detection). VIN decoding (M-car identification, salvage history). Mileage-price depreciation curves. Condition classification from listing titles. Transmission premium calculation. Cross-market arbitrage (Japan, salvage, BaT vs Classic.com).
Real-time notifications. Alerts when a car sells >15% below market, when a reserve isn't met on a valuable variant, when VIN decode reveals a misidentified car, or when new classic BMW inventory appears on BaT. Delivered to Telegram + Slack.
35 Tracked Variants
Current median sold price per variant across all sources (n = recorded sales). Medians ignore condition, mileage and options — a starting reference, not a quote. See the Market page for trends and per-listing detail.
| Platform | Variant | Median sold | Sales (n) |
|---|---|---|---|
| E24 | 628CSi Euro M30 2.8L | insufficient data | 0 |
| E24 | 630CS early shark M30 3.0L | insufficient data | 0 |
| E24 | 633CSi M30 inline-6 | insufficient data | 0 |
| E24 | 635CSi | $17,000 | 3 |
| E24 | M6 US-spec S38 | insufficient data | 0 |
| E24 | M635CSi Euro S38 inline-6 | insufficient data | 0 |
| E28 | 535i 535i/535is | $15,000 | 57 |
| E28 | M5 | $45,600 | 59 |
| E28 | M535i Euro-only | $17,138 | 5 |
| E30 | 318i M40/M10 4-cyl | insufficient data | 0 |
| E30 | 318is | insufficient data | 0 |
| E30 | 320is Euro S14 2.0L | insufficient data | 0 |
| E30 | 323i Euro M20 2.3L | insufficient data | 0 |
| E30 | 325e eta engine | insufficient data | 0 |
| E30 | 325i sedan/conv | insufficient data | 0 |
| E30 | 325i Touring | $21,900 | 7 |
| E30 | 325is | $17,175 | 200 |
| E30 | 325ix AWD | insufficient data | 0 |
| E30 | 333i SA M30 3.3L | insufficient data | 0 |
| E30 | M3 | $75,000 | 205 |
| E34 | 535i M30 inline-6 | $11,575 | 28 |
| E34 | 540i 6-speed M60 V8 manual | $16,000 | 53 |
| E34 | M5 S38 3.5L/3.8L inline-6 | $31,991 | 85 |
| E36 | 328i 328i/328is | $10,206 | 67 |
| E36 | M3 Evolution Euro 3.2L | $33,583 | 4 |
| E36 | M3 Lightweight | $149,000 | 17 |
| E36 | M3 US-spec (S50/S52) | $22,000 | 677 |
| E39 | 530i Sport (Euro) | $11,500 | 89 |
| E39 | 540i 6-speed manual | $13,000 | 355 |
| E39 | M5 | $32,500 | 497 |
| E46 | 328i | $9,500 | 11 |
| E46 | 330Ci | $13,250 | 400 |
| E46 | 330i ZHP | $15,000 | 116 |
| E46 | M3 CSL | insufficient data | 0 |
| E46 | M3 Coupe 6-speed | $25,500 | 1344 |
Tech Stack
Backend: Python, SQLite, Flask, Playwright, playwright-stealth
Infrastructure: DigitalOcean VPS, Nginx, Let's Encrypt SSL, cron scheduling
APIs: NHTSA VIN decoder, auction-api.app (Copart/IAAI), exchangerate-api.com, Google Trends
Notifications: Telegram Bot API, Slack Incoming Webhooks
Frontend: HTML/CSS, Chart.js — no frameworks, no build step
Data: 4,900 sold records, 1,641 auction listings, 35 variants, 7 platforms