How It Works

An autonomous investment intelligence system built to find mispriced classic BMWs.

The Problem

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.

The Edge

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

Collection Layer

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.

Intelligence Layer

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).

Alert Layer

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.

PlatformVariantMedian soldSales (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

Built by

Sensvi

Data engineering, market intelligence, autonomous systems