Arbitrage Scanner
Build a scanner that monitors multiple sportsbooks for arbitrage opportunities.
Features
- Real-time arb detection via SSE
- Stake calculations
- Multi-platform alerts
- Logging and analytics
Implementation
Basic Scanner
import json
import logging
from datetime import datetime
import requests
import sseclient
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('arb-scanner')
class ArbScanner:
def __init__(self, api_key: str, min_profit: float = 1.0):
self.api_key = api_key
self.min_profit = min_profit
self.seen_arbs = set()
def start(self):
url = f'https://api.sharpapi.io/api/v1/stream?channel=opportunities&min_profit={self.min_profit}'
headers = {'X-API-Key': self.api_key}
logger.info(f'Starting arb scanner (min profit: {self.min_profit}%)')
response = requests.get(url, headers=headers, stream=True)
client = sseclient.SSEClient(response)
for event in client.events():
if event.event == 'initial':
self._handle_initial(json.loads(event.data))
elif event.event == 'arbitrage':
self._handle_arb(json.loads(event.data))
def _handle_initial(self, data):
opps = data['data']['opportunities']
logger.info(f'Initial: {len(opps)} opportunities')
for opp in opps:
self._process_arb(opp)
def _handle_arb(self, data):
for opp in data['data']['opportunities']:
self._process_arb(opp)
def _process_arb(self, opp):
arb_id = f"{opp['event_id']}:{opp['market_type']}"
if arb_id in self.seen_arbs:
return
self.seen_arbs.add(arb_id)
logger.info(f"💰 ARB FOUND: {opp['profit_percent']:.2f}%")
logger.info(f" Event: {opp['event_name']}")
for leg in opp['legs']:
logger.info(f" → {leg['sportsbook']}: {leg['selection']} @ {leg['odds_american']} ({leg['stake_percent']:.1f}%)")
# Send alert
self._send_alert(opp)
def _send_alert(self, opp):
# Implement your alert logic here
pass
if __name__ == '__main__':
scanner = ArbScanner(
api_key='YOUR_API_KEY',
min_profit=1.5
)
scanner.start()With Stake Calculator
class StakeCalculator:
def __init__(self, bankroll: float):
self.bankroll = bankroll
def calculate(self, arb: dict) -> list:
"""Calculate actual dollar amounts to bet."""
bets = []
for leg in arb['legs']:
stake = self.bankroll * (leg['stake_percent'] / 100)
bets.append({
'sportsbook': leg['sportsbook'],
'selection': leg['selection'],
'odds': leg['odds_american'],
'stake': round(stake, 2),
'potential_return': round(stake * leg['odds_decimal'], 2),
})
return bets
# Usage
calc = StakeCalculator(bankroll=1000)
def process_arb(opp):
bets = calc.calculate(opp)
profit = opp['profit_percent'] * 10 # $10 per 1% on $1000
print(f"💰 {opp['event_name']} - ${profit:.2f} profit")
for bet in bets:
print(f" Bet ${bet['stake']} on {bet['selection']} @ {bet['sportsbook']}")Discord Integration
import discord
from discord import Webhook
import aiohttp
class DiscordAlerter:
def __init__(self, webhook_url: str):
self.webhook_url = webhook_url
async def send_arb(self, opp: dict, stakes: list):
async with aiohttp.ClientSession() as session:
webhook = Webhook.from_url(self.webhook_url, session=session)
embed = discord.Embed(
title=f"💰 {opp['profit_percent']:.2f}% Arbitrage",
description=opp['event_name'],
color=0x00FF00,
)
for stake in stakes:
embed.add_field(
name=stake['sportsbook'],
value=f"${stake['stake']} on {stake['selection']} @ {stake['odds']}",
inline=False,
)
await webhook.send(embed=embed)Best Practices
Act fast
Arbs disappear in seconds. Automate where possible.
Round stakes
$47.32 looks suspicious. Round to $45 or $50.
Track results
Log all arbs for analysis and tax purposes.
Handle failures
If one leg fails, you have exposure. Have a plan.
Last updated on