Overview
PROPPR is a microservices-based betting intelligence platform that monitors real-time betting markets, calculates expected value, detects arbitrage opportunities, and delivers personalized alerts via Telegram.The platform processes odds from 100+ bookmakers across 50+ sports, generating thousands of alerts daily for value bets, arbitrage, and player props.
Architecture Diagram
Data Flow
The PROPPR data pipeline follows this sequence:External Data Collection
Three parallel data streams continuously fetch market data:
- UnifiedAPIPoller polls REST API every 60 seconds
- WebsocketUpdater receives real-time odds via WebSocket
- StatsUpdateFM fetches player/team stats from FotMob
UnifiedAPIPoller/runners/run_unified_poller.py:28:Data Normalization
Raw data is normalized through SharedServices modules:
- LeagueNormalizer: Standardizes league names across sources
- MarketMapper: Maps markets to canonical format
- FixtureMatching: Matches games across different APIs
SharedServices/mapping/league_normalizer.py:4:MongoDB Storage
Normalized data is stored in MongoDB collections:
From
| Collection | Purpose | Updated By |
|---|---|---|
all_positive_alerts | Player prop opportunities | UnifiedAPIPoller |
all_positive_team_alerts | Team market opportunities | UnifiedAPIPoller |
cerebro_positive_alerts | EV bets (Pinnacle-based) | EVBot scanner |
arbitrage_bets | Cross-bookmaker arbs | ArbBot scanner |
horse_racing_arbs | Horse racing value bets | HorseBot scanner |
user_tracked_bets | User bet tracking | BetTrackingSystem |
config/settings.py:20:Alert Processing
Alert bots query MongoDB and apply user filters:
- Minimum/maximum odds thresholds
- League preferences (Main leagues vs. all)
- Market selections (goals, assists, corners, etc.)
- Time-to-kickoff requirements
- Bookmaker preferences
Telegram Delivery
Formatted alerts are sent via Telegram Bot API:
- Rich formatting with market emojis
- Bookmaker deep links for one-click betting
- Kelly criterion stake recommendations
- Real-time odds updates on button clicks
PropprTeamBot/core/bot/team_bot.py:42:Alert Bots
PROPPR includes 6 specialized alert bots, each monitoring different market types:PropprTeamBot
Team Market AlertsMonitors team-level betting markets:
- Goals (Over/Under, Both Teams to Score)
- Corners (Total, Asian Handicap)
- Cards (Yellow, Red, Bookings)
- Shots (Total, On Target)
- Fouls, Offsides, Possession
PropprTeamBot/runners/run_team_bot.pyPropprPlayerBot
Player Prop AlertsMonitors individual player markets:
- Goals, Assists, Goal Contributions
- Shots, Shots on Target
- Passes, Key Passes, Long Balls
- Tackles, Interceptions, Duels
- Dribbles, Crosses, Touches
PropprPlayerBot/runners/run_player_bot.pyPropprEVBot
Expected Value AlertsCalculates EV using Pinnacle as sharp reference:Runner:
- Compares soft bookmaker odds to Pinnacle
- Filters by minimum EV% (configurable)
- Kelly criterion stake sizing
- Line movement tracking
PropprEVBot/core/bot/ev_bot.py:40:PropprEVBot/core/bot/ev_bot.pyPropprArbBot
Arbitrage DetectionScans for guaranteed profit opportunities:Runner:
- Cross-bookmaker arbitrage
- Automatic stake calculation
- Exchange commission handling
- Sharp bookmaker filtering
PropprArbBot/core/bot/arb_bot.py:30:PropprArbBot/core/bot/arb_bot.pyPropprHorseBot
Horse Racing AlertsUK horse racing value bets:Runner:
- Win/Place markets
- Value detection vs. market consensus
- Daily summaries with results
- Time-windowed alerts (configurable)
PropprHorseBot/core/bot/horse_bot.py:23:PropprHorseBot/core/bot/horse_bot.pyOvertimeBot
Blockchain BettingAutomated betting on Optimism chain:Runner:
- Overtime Markets protocol integration
- Wallet management (encrypted keys)
- Automatic bet placement
- Gas optimization
OvertimeBot/core/bot/overtime_bot.py:69:OvertimeBot/core/bot/overtime_bot.pyData Services
Three core services populate MongoDB with real-time market data:WebsocketUpdater
Real-time odds via WebSocket connections Maintains persistent WebSocket connections to odds providers for instant updates:- Connection Management: Auto-reconnect on disconnect
- Rate Limiting: Respects provider limits
- Data Validation: Filters invalid/stale data
- MongoDB Updates: Upserts odds with timestamps
WebsocketUpdater/runners/run_websocket_updater.py:28:
WebsocketUpdater/config/
UnifiedAPIPoller
REST API polling at regular intervals Polls multiple odds APIs on a schedule (default: 60 seconds):- Multi-source: Supports OddsAPI, custom feeds
- Rate Limiting: Managed via RequestTracker
- Transformation: Normalizes to unified format
- Matching: Deduplicates across sources
UnifiedAPIPoller/runners/run_unified_poller.py:28:
config/settings.py:36):
StatsUpdateFM
Player/team statistics pipeline Fetches detailed stats from FotMob for predictive models:- Fixtures: Upcoming matches with lineups
- Player Stats: Goals, assists, xG, shot accuracy
- Team Stats: Possession, corners, cards
- Projections: Predicted player output
StatsUpdateFM/runners/run_stats_pipeline.py:28:
SharedServices/api/fotmob_service.py:30):
SharedServices Modules
Shared utilities used across all bots:Grading System
Grading System
Unified bet result gradingLocation: Grading Flow:
SharedServices/grading/- ImmediateBetGrader: Grades finished fixtures on-demand
- Scheduler: Periodic grading jobs for pending bets
- Processors: Market-specific result calculation
SharedServices/grading/processors/immediate_bet_grader.py:23:- Query MongoDB for ungraded bets
- Fetch fixture results from FotMob
- Apply market-specific grading logic
- Update bet status (Won/Lost/Push)
- Calculate profit/loss
- Sync to Google Sheets
Mapping Services
Mapping Services
Data normalization and entity matchingLocation: MarketMapper (
SharedServices/mapping/LeagueNormalizer (league_normalizer.py:4):market_mapper.py):- Maps bookmaker market names to canonical format
- Handles regional variations (US vs. EU odds)
- Normalizes player/team names
fixture_matching_utils.py):- Fuzzy matching for team names
- Kickoff time comparison
- Cross-source fixture linking
canonical_markets.py):- Defines standard market types
- Validation rules for each market
- Conversion factors (Asian lines, etc.)
Tracking System
Tracking System
User bet tracking and reconstructionLocation: AlertReconstructionService (
SharedServices/tracking/BetTrackingSystem (bet_tracking_system.py):alert_reconstruction_service.py):- Rebuilds alert data from message IDs
- Links tracked bets to original alerts
- Handles edited/deleted messages
request_tracker.py):- API rate limit management
- Per-key quota tracking
- Automatic key rotation
SharedServices/tracking/request_tracker.py:Configuration & Presets
Configuration & Presets
Centralized bot configurationLocation:
SharedServices/config/- shared_config.py: MongoDB, API keys, defaults
- presets.py: Optimal market presets per bot
config/credentials.py:143:API Clients
API Clients
Reusable API service wrappersLocation: OddsAPIClient (used by UnifiedAPIPoller):
SharedServices/api/FotMobService (fotmob_service.py:30):- REST endpoint calls
- Response parsing
- Error handling
i18n (Internationalization)
i18n (Internationalization)
Multi-language supportLocation: Supported Languages: English, Spanish, Portuguese, French, German
SharedServices/i18n/From SharedServices/__init__.py:20:Utilities
Utilities
Text normalization and helpersLocation:
SharedServices/utils/- text_normalization.py: Unicode handling, accent removal
- bookmaker_link_generator.py: Deep link creation
SharedServices/__init__.py:19:Deployment Architecture
PROPPR runs on a Hetzner dedicated server with systemd service management:Production Environment
Server: Ubuntu 22.04 LTS on Hetzner (46.224.85.158) Directory Structure:Systemd Services
Each bot runs as a systemd unit:team-bot.service
Deployment Process
Fromscripts/deploy/push_and_restart.sh:1:
Service Selection
Choose which services to restart:
- Individual bot (Team, Player, EV, etc.)
- Data services (WebSocket, Poller, Stats)
- All services
MongoDB Schema
Key collections and document structures:Player Alerts (all_positive_alerts)
Team Alerts (all_positive_team_alerts)
Arbitrage Bets (arbitrage_bets)
Tracked Bets (user_tracked_bets)
Performance Characteristics
Throughput
- Odds Updates: 1,000+ per minute (WebSocket)
- API Polls: 60-second intervals
- Alerts Sent: 500+ per hour peak
- Database Queries: 10,000+ per hour
Latency
- WebSocket Update → MongoDB: <100ms
- Alert Detection → Telegram: <2 seconds
- User Command → Response: <500ms
- Grading Check: Every 60 seconds
Reliability
- Uptime: 99.5% (systemd auto-restart)
- Data Freshness: <1 minute
- Duplicate Prevention: 99.9%
- Rate Limit Compliance: 100%
Scalability
- Concurrent Users: 1,000+
- Active Subscriptions: 5,000+
- MongoDB Storage: 100GB+
- Daily Alerts: 10,000+
Next Steps
Quickstart
Get PROPPR running locally in 10 minutes
Development
Contributing guide and code structure
API Reference
Complete API documentation for all modules
Deployment
Production deployment and monitoring