Sharp Betting Concepts for the API Age
Every sharp bettor knows the terminology: closing line value, steam moves, expected value, vig, reverse line movement. These concepts are the foundation of profitable sports betting — they’ve been refined over decades by syndicates, quantitative bettors, and market makers.
But here’s the disconnect: nearly all the content about sharp betting is written for human handicappers manually tracking lines on their phones. Nobody connects these concepts to what’s actually possible today — APIs that stream odds from 30+ books in real time, autonomous agents that can detect and act on signals in milliseconds, and programmatic execution that removes the slowest link in the chain (you).
This guide bridges that gap. You’ll learn what each sharp concept means, why it matters, and exactly how to operationalize it with code. If you’re building a betting agent, these concepts aren’t just nice-to-know — they’re your edge detection framework.
Why Sharp Betting Concepts Matter for Agent Builders
An automated betting agent without sharp concepts is just a random number generator with a wallet. You can build the most elegant infrastructure — wallets, identity, execution engines — and still lose money if you can’t identify edge.
Sharp betting concepts are the edge identification layer. They answer the fundamental questions your agent needs to resolve before placing any bet:
- Is there an edge here? (+EV calculation, CLV projection)
- How confident are we? (signal stacking: CLV + steam + RLM convergence)
- How much should we bet? (Kelly criterion)
- Is this line about to move against us? (steam detection, RLM analysis)
- Are we paying too much vig? (juice comparison across books)
Before APIs, operationalizing these concepts required manually refreshing odds screens, maintaining spreadsheets, and executing bets by hand. The window for most sharp signals is seconds to minutes — humans simply can’t keep up.
APIs change the equation completely. With real-time odds feeds from The Odds API, OpticOdds, or direct sportsbook connections, your agent can:
- Ingest lines from 20+ books simultaneously
- Normalize odds into implied probabilities
- Detect sharp signals in real time
- Size positions mathematically
- Execute before the market corrects
The rest of this guide covers each concept, what it means for your agent’s architecture, and where to go deep.
Closing Line Value (CLV)
Closing line value is the difference between the odds you bet and the odds at market close (game start). It’s the single most important metric in sharp betting — not your win rate, not your ROI over 50 bets, but whether you systematically beat the closing line.
Why? Because closing lines are the most efficient price the market produces. Thousands of sharp and recreational bettors have hammered the line by game time, and the result is a consensus probability that’s extremely accurate. If you consistently get better numbers than the close, you have edge. If you don’t, you’re paying a tax to the market.
Why It Matters for Agents
CLV tracking is the ground truth metric for your agent’s performance. Win/loss records are noisy — you can lose money over 500 bets and still have positive CLV (variance), or win money over 500 bets with negative CLV (luck). CLV cuts through the noise.
To track CLV programmatically, you need:
- Opening line capture: Record the odds at the time your agent places a bet
- Closing line capture: Poll the odds API one final time just before game start
- Comparison logic: Calculate whether your bet price was better than the close
This sounds trivial, but most bettors — even automated ones — don’t actually track it. Building CLV measurement into your agent from day one gives you the feedback loop to iterate on your models.
Deep dive: Closing Line Value API — Track and Measure CLV Programmatically
Steam Moves
A steam move is a sudden, sharp line movement that cascades across multiple sportsbooks within seconds. It’s triggered by coordinated action from sharp bettors or syndicates hitting a line at multiple books simultaneously.
Steam moves are the market’s loudest signal. When Pinnacle moves a line 1.5 points in under a minute and DraftKings, FanDuel, and BetMGM follow within 90 seconds, something material has changed — an injury report, a weather shift, or simply a sharp model update.
Detecting Steam Programmatically
Human bettors use services like SteamTracker or Pregame.com to get push notifications. Your agent can do better: poll odds APIs at 1-5 second intervals, maintain a rolling window of line snapshots, and detect steam in real time by measuring:
- Velocity: How fast is the line moving? (points per second)
- Breadth: How many books are moving? (N out of M tracked books)
- Magnitude: How large is the total shift? (total points moved)
When all three metrics spike simultaneously, you’ve detected steam. The actionable play is to bet the remaining slow-moving books before they adjust — the books that haven’t caught up yet.
The half-life of a steam opportunity is measured in seconds. This is automation’s natural territory.
Deep dive: Steam Move Detection Bot — Catch Line Cascades Before Books Adjust
Expected Value (+EV)
Expected value is the mathematical expectation of a bet’s long-run profitability. A +EV bet is one where your estimated probability of winning exceeds the implied probability of the odds offered. Over sufficient volume, +EV bets print money. Over insufficient volume, they can lose — that’s variance.
The formula is straightforward:
EV = (Prob_win × Payout) - (Prob_lose × Stake)
If you estimate the Lakers have a 55% chance of winning and a book offers +110 (implied 47.6%), the EV is:
EV = (0.55 × $110) - (0.45 × $100) = $60.50 - $45.00 = +$15.50 per $100
Finding +EV at Scale
The challenge isn’t the math — it’s estimating the true probability. Your agent needs a probability source. The sharpest approach: use Pinnacle’s no-vig line as the “true” probability, then scan softer books for odds that imply a lower probability. Any book offering better odds than the Pinnacle no-vig line is, by definition, +EV against the market’s sharpest benchmark.
This is where multi-book odds APIs become essential. You need simultaneous coverage of the sharp benchmark (Pinnacle) and the soft targets (DraftKings, FanDuel, BetMGM, offshore books). Your agent computes implied probabilities for every line, strips vig, compares, and fires when the edge exceeds your threshold.
Deep dive: +EV Betting Bot — Find and Execute Positive Expected Value Bets
Vig / Juice
Vig (vigorish, also called juice or overround) is the sportsbook’s built-in margin. It’s the reason both sides of a standard bet are priced at -110 instead of +100. The implied probabilities sum to more than 100% — that gap is the vig, and it’s the house’s edge.
Standard vig on a -110/-110 market:
Implied prob (side A): 110/210 = 52.38%
Implied prob (side B): 110/210 = 52.38%
Total: 104.76%
Vig: 4.76%
Why Vig Matters for Agents
Vig is the tax your agent pays on every bet. Lower vig means you need less edge to be profitable. A 2% vig market requires half the edge of a 4% market to break even.
Different books charge very different vig. Pinnacle typically runs 2-3% on major markets. US regulated books run 4-5%. Some offshore books on minor markets charge 8%+. Your agent should always route bets to the lowest-vig book for a given market — this is free edge.
Building a vig comparison layer is trivial:
- Pull odds for the same event from all available books
- Convert to implied probabilities
- Sum the implied probabilities per book
- Rank by total overround (lowest = least vig)
This takes 10 lines of Python and saves your agent thousands of dollars annually.
Deep dive: Juice Comparison Across Offshore and Regulated Books
Middling
A middle occurs when you can bet both sides of a market at different numbers, creating a window where both bets win. Unlike arbitrage (where you guarantee a profit), middling guarantees a small loss or breakeven unless the result lands in the middle — in which case both bets pay out.
Example: You bet Cowboys -3 at Book A and Giants +4.5 at Book B. If the Cowboys win by exactly 4, both bets cash. If the Cowboys win by 3 or less, or by 5 or more, one bet wins and one loses — but the juice usually means a small net loss.
Middling vs. Arbitrage
Arbitrage guarantees profit on every event. Middling guarantees a small loss on most events but a large win when you hit the middle. Over time, if you find enough middles with wide enough windows, the payoff from hitting the middle exceeds the cumulative small losses.
Automating Middle Detection
Your agent scans for situations where the spread differential between two books exceeds a threshold:
def detect_middle(line_a: float, line_b: float, threshold: float = 1.0) -> bool:
"""Detect a middling opportunity between two book lines."""
return (line_a + line_b) > threshold
In practice, you want the line_a + line_b value (the “middle width”) to be at least 1 point on NFL sides, 1.5 on NBA, and 0.5 on MLB run lines. The wider the middle, the more often you’ll hit it — and the more valuable the opportunity.
Deep dive: Middling Bot — Automate Middle Detection Across Books
Reverse Line Movement (RLM)
Reverse line movement occurs when the betting line moves in the opposite direction of where the majority of public bets are placed. If 75% of bets are on the Lakers but the line moves from Lakers -3 to Lakers -2.5, that’s RLM — the book is moving the line toward the less popular side.
What It Signals
RLM indicates that the money on the less popular side is sharper than the volume on the popular side. The book respects sharp money more than public money. When a small number of large, sharp bets outweigh thousands of small public bets, the book adjusts the line to reduce sharp-side exposure.
Detecting RLM via APIs
To detect RLM programmatically, you need two data streams:
- Line movement data: Track how the spread/total/moneyline changes over time (from odds APIs)
- Public betting percentages: Track what percentage of bets and/or handle is on each side (from services like Action Network, DonBest, or scraped from sportsbook consensus data)
When the line moves opposite to the public betting percentage, flag it as RLM. The stronger the divergence (e.g., 80% public on one side but the line moves 2 points the other way), the stronger the signal.
RLM is one of the weaker sharp signals in isolation — it’s most valuable when combined with CLV projections and steam move data. Your agent should weight it accordingly in a composite signal model.
Deep dive: Reverse Line Movement — Detect Smart Money via APIs
Kelly Criterion
The Kelly criterion is a formula for optimal bet sizing given your edge and the odds offered. It tells you the exact fraction of your bankroll to wager to maximize long-run growth rate. Bet more than Kelly and you increase variance (and risk of ruin) without increasing expected growth. Bet less and you leave money on the table.
The formula:
Kelly % = (bp - q) / b
Where:
b = decimal odds - 1 (net payout per unit)
p = your estimated probability of winning
q = 1 - p (probability of losing)
Example: Your model says 55% win probability, odds are +120 (decimal 2.20):
b = 1.20
p = 0.55
q = 0.45
Kelly % = (1.20 × 0.55 - 0.45) / 1.20 = (0.66 - 0.45) / 1.20 = 0.175 = 17.5%
Full Kelly Is Too Aggressive
In practice, nobody runs full Kelly. The formula assumes your edge estimate is exactly correct — and it never is. Overestimating your edge by even a small amount leads to catastrophic over-betting.
Production agents use fractional Kelly: 25-50% of the full Kelly recommendation. This dramatically reduces drawdowns and risk of ruin while retaining most of the growth rate. A 25% Kelly agent with a 10% edge will grow more slowly than full Kelly but will survive the inevitable losing streaks.
Implementing Kelly in Your Agent
Your agent’s position-sizing module takes two inputs:
- Estimated edge: From your +EV calculation (your probability minus the implied probability)
- Odds offered: The current line at the target book
It outputs a stake as a percentage of bankroll. Wire this into your execution pipeline between signal detection and bet placement.
Deep dive: Kelly Criterion Bot — Optimal Position Sizing for Betting Agents
The Sharp Betting Data Pipeline
Every concept above fits into a single pipeline that your agent runs continuously:
┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐
│ Odds APIs │────▶│ Normalization │────▶│ Signal Detection │
│ │ │ │ │ │
│ - TheOddsAPI│ │ - Decimal │ │ - CLV projection │
│ - OpticOdds │ │ - Implied % │ │ - Steam detection │
│ - Pinnacle │ │ - No-vig │ │ - +EV calculation │
│ - DonBest │ │ - Timestamps │ │ - RLM flagging │
└─────────────┘ └──────────────┘ │ - Middle detection │
│ - Vig comparison │
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ Position Sizing │
│ │
│ - Kelly calculation │
│ - Fractional Kelly │
│ - Max exposure caps │
│ - Bankroll tracking │
└──────────┬───────────┘
│
┌──────────▼───────────┐
│ Execution │
│ │
│ - Book selection │
│ - Bet placement │
│ - Confirmation │
│ - CLV logging │
└──────────────────────┘
Each stage maps directly to the concepts covered above:
| Pipeline Stage | Sharp Concepts Used |
|---|---|
| Normalization | Vig stripping, implied probability conversion |
| Signal Detection | CLV, steam moves, +EV, RLM, middling |
| Position Sizing | Kelly criterion, fractional Kelly |
| Execution | Lowest-vig routing, CLV tracking |
Here’s the skeleton of a Python class that ties it together:
from dataclasses import dataclass, field
from datetime import datetime
@dataclass
class OddsSnapshot:
book: str
market: str
event_id: str
side: str
odds: float
implied_prob: float
timestamp: datetime
@dataclass
class SharpSignal:
signal_type: str # "clv", "steam", "ev", "rlm", "middle"
event_id: str
side: str
strength: float # 0.0 to 1.0
metadata: dict = field(default_factory=dict)
class SharpSignalAggregator:
def __init__(self, bankroll: float, kelly_fraction: float = 0.25):
self.bankroll = bankroll
self.kelly_fraction = kelly_fraction
self.signal_weights = {
"clv": 0.30,
"steam": 0.25,
"ev": 0.25,
"rlm": 0.10,
"middle": 0.10,
}
def score_opportunity(self, signals: list[SharpSignal]) -> float:
"""Compute a composite score from multiple sharp signals."""
total = 0.0
for signal in signals:
weight = self.signal_weights.get(signal.signal_type, 0.0)
total += weight * signal.strength
return min(total, 1.0)
def size_position(self, edge: float, decimal_odds: float) -> float:
"""Kelly criterion position sizing with fractional Kelly."""
b = decimal_odds - 1
p = 0.5 + edge # edge expressed as probability advantage
q = 1 - p
kelly = (b * p - q) / b
if kelly <= 0:
return 0.0
return self.bankroll * kelly * self.kelly_fraction
def evaluate(
self, signals: list[SharpSignal], best_odds: float
) -> dict:
"""Full evaluation: score, size, and recommend."""
score = self.score_opportunity(signals)
if score < 0.3:
return {"action": "pass", "score": score}
edge = score * 0.10 # scale score to estimated edge
stake = self.size_position(edge, best_odds)
return {
"action": "bet",
"score": score,
"edge": edge,
"stake": round(stake, 2),
"odds": best_odds,
}
This is a starting point — your production implementation will add persistence, async odds ingestion, and book-specific execution adapters. The spoke articles below go deep on each signal type.
Data Sources for Sharp Analysis
Your agent is only as good as its data. Here’s what you need and where to get it.
The Sharp Benchmark: Pinnacle
Pinnacle is the closest thing to a “true odds” source in sports betting. They accept sharp action, run low vig (2-3%), and their closing lines are the most efficient in the market. Use Pinnacle’s lines as your baseline for:
- CLV measurement: Compare your bet price to Pinnacle’s close
- +EV detection: Anything softer than Pinnacle’s no-vig line is potentially +EV
- Steam origin: Steam moves often originate at Pinnacle before cascading
Direct Pinnacle API access is available but restricted by jurisdiction. Most agents access Pinnacle lines via aggregator APIs.
Multi-Book Coverage
For steam detection, vig comparison, and middle-finding, you need simultaneous odds from multiple books:
- The Odds API — Covers 30+ US and international books. Good polling-based coverage, generous free tier for development.
- OpticOdds — WebSocket-based streaming, faster updates, deeper market coverage. Better for latency-sensitive steam detection.
- DonBest — Industry-standard real-time odds feed used by sportsbooks themselves. Higher cost, highest quality.
Public Betting Data
For RLM detection, you need betting percentage data:
- Action Network — Bet and handle percentages for major US sports
- Pregame.com — Sharp/public consensus data
- Sportsbook consensus — Aggregated from multiple sportsbooks
Historical Data
For backtesting and CLV analysis, you need historical odds and results:
- Kaggle datasets — Free historical odds for major sports
- Odds API historical — Snapshots of past odds via API
- Your own database — Start logging every odds snapshot your agent ingests from day one
The Full Agent Stack
Sharp signal detection is one layer of a complete betting agent. AgentBets.ai covers the full stack — from identity verification and wallet infrastructure through trading execution and intelligence. The sharp concepts on this page are your intelligence layer: the part that answers “should I bet, and how much?”
But intelligence without infrastructure is just a spreadsheet. You need:
- Identity: How your agent authenticates with sportsbooks and markets
- Wallets: How your agent holds and moves funds
- Execution: How your agent places and confirms bets
- Intelligence: How your agent finds edge (you’re reading it)
AgentBets.ai covers the full agent stack — from identity to wallet to trading to intelligence. Start with the intelligence layer here, then build outward.
What’s Next
Dive into the individual concepts with full code implementations, architecture diagrams, and production considerations:
Sharp Betting Spoke Articles
- Closing Line Value API — Track and Measure CLV Programmatically — Build a CLV tracker that measures your agent’s true edge
- Steam Move Detection Bot — Catch line cascades within seconds of origination
- +EV Betting Bot — Find and execute positive expected value bets at scale
- Juice Comparison Across Offshore and Regulated Books — Route bets to the lowest-vig lines automatically
- Middling Bot — Automate middle detection across books
- Reverse Line Movement — Detect smart money patterns via APIs
- Kelly Criterion Bot — Implement optimal position sizing in your agent
Related Guides
- Offshore Sportsbook APIs — Access the soft lines that sharp strategies exploit
- Betting Bots for Offshore Sportsbooks — End-to-end bot architecture for offshore execution
- Sports Betting Arbitrage Bot — The complete developer guide to arb bot construction
+EV Betting Bots: Finding Positive Expected Value Across Offshore Sportsbooks
How to build a positive expected value (+EV) betting bot that scans offshore sportsbook odds, identifies value against sharp benchmarks, and automates +EV detection with Python.
Mar 1, 2026Building a Steam Move Detection Bot with Python
Build a steam move detection bot that monitors multi-book odds feeds for sharp money indicator signals. Python tutorial using steam move API data to catch coordinated line cascades before trailing books adjust.
Mar 1, 2026How to Track Closing Line Value with an API
Build a CLV tracking bot that captures closing lines via API, compares them to your bet placement odds, and measures your edge automatically. Python code included.
Mar 1, 2026Juice Comparison: Which Offshore Sportsbooks Have the Lowest Vig?
Programmatic vig analysis across BetOnline, Bovada, Sportsbetting.ag, MyBookie, and BetUS. Compare juice by sport, calculate overround with Python, and find the lowest-vig offshore books for automated betting.
Mar 1, 2026Kelly Criterion Betting Bot: Automated Bankroll Management
Build a Kelly criterion betting bot that optimally sizes bets based on edge and odds. Covers the math, fractional Kelly for risk management, Python implementation, and integration with automated betting agents.
Mar 1, 2026Middling Bot: How to Find Middles Across Offshore Sportsbooks
Build a middle-finding bot that scans offshore sportsbook spreads and totals for middling opportunities. Covers the math, detection algorithm, Python implementation, and which books create the most middles.
Mar 1, 2026Reverse Line Movement: How to Detect It Programmatically
Build a reverse line movement (RLM) detector that identifies when sportsbook lines move opposite to public betting percentages. Covers the theory, detection algorithm, Python code, and how to use RLM as a sharp signal.
Mar 1, 2026