Install
openclaw skills install @rsquaredsolutions2026/bet-slip-parserParse bet slips from text, natural language, or screenshots into structured JSON. Extracts stake, odds, bet type, selection, and sportsbook. Supports singles, parlays, teasers, and SGPs. Use when asked to parse, log, or read a bet slip.
openclaw skills install @rsquaredsolutions2026/bet-slip-parserExtract structured betting data from any bet slip format — pasted text, natural language, or screenshots.
Use this skill when the user:
| Bet Type | Keywords |
|---|---|
| Moneyline | moneyline, ML, to win, h2h |
| Spread | spread, point spread, handicap, ATS, -3.5 |
| Total | total, over, under, O/U |
| Parlay | parlay, accumulator, multi, combo |
| Teaser | teaser, adjusted spread |
| Same-Game Parlay | SGP, same game, same-game |
| Prop | prop, player prop, over 24.5 pts |
| Future | future, outright, to win championship |
Identify the sportsbook from branding, URLs, or mentions:
| Sportsbook | Identifiers |
|---|---|
| DraftKings | draftkings, dk, DK Sportsbook |
| FanDuel | fanduel, fd, FD Sportsbook |
| BetMGM | betmgm, mgm, BetMGM Sportsbook |
| Caesars | caesars, czr, Caesars Sportsbook |
| Pinnacle | pinnacle, pin |
| Bet365 | bet365, b365 |
| BetRivers | betrivers, rivers |
| PointsBet | pointsbet |
| Polymarket | polymarket, poly |
| Kalshi | kalshi |
If the sportsbook cannot be identified, set source to "unknown".
When the user pastes sportsbook confirmation text, extract all fields and output JSON.
Extraction steps:
Odds conversion formulas (use inline when needed):
# Decimal to American
echo "$DECIMAL_ODDS" | python3 -c "
import sys
d = float(sys.stdin.read().strip())
if d >= 2.0:
print(f'+{round((d - 1) * 100)}')
else:
print(f'{round(-100 / (d - 1))}')"
# Fractional (e.g. 3/2) to American
echo "3/2" | python3 -c "
import sys
n, d = map(int, sys.stdin.read().strip().split('/'))
dec = (n / d) + 1
if dec >= 2.0:
print(f'+{round((dec - 1) * 100)}')
else:
print(f'{round(-100 / (dec - 1))}')"
# American to implied probability
echo "-110" | python3 -c "
import sys
odds = int(sys.stdin.read().strip())
if odds < 0:
prob = abs(odds) / (abs(odds) + 100)
else:
prob = 100 / (odds + 100)
print(f'{prob:.4f}')"
# American to decimal
echo "-110" | python3 -c "
import sys
odds = int(sys.stdin.read().strip())
if odds < 0:
dec = 1 + (100 / abs(odds))
else:
dec = 1 + (odds / 100)
print(f'{dec:.3f}')"
When the user describes a bet casually, extract the same fields.
Examples of natural language inputs and how to parse them:
Always ask for missing critical fields:
When the user shares an image of a bet slip:
Note: Screenshot parsing requires the LLM to have vision capabilities. If vision is not available, ask the user to paste the bet slip as text instead.
After parsing, validate the extracted data:
# Validate American odds format (must be + or - followed by digits)
echo "$ODDS" | grep -qE '^[+-][0-9]+$' && echo "VALID" || echo "INVALID: odds must be +NNN or -NNN"
# Validate stake is positive number
echo "$STAKE" | grep -qE '^[0-9]+(\.[0-9]{1,2})?$' && echo "VALID" || echo "INVALID: stake must be positive number"
# Validate bet type
echo "$BET_TYPE" | grep -qE '^(moneyline|spread|total|parlay|teaser|sgp|prop|future)$' && echo "VALID" || echo "INVALID: unknown bet type"
# Cross-check: potential payout should match odds × stake
echo "$STAKE $ODDS" | python3 -c "
import sys
parts = sys.stdin.read().strip().split()
stake, odds = float(parts[0]), int(parts[1])
if odds > 0:
payout = stake + (stake * odds / 100)
else:
payout = stake + (stake * 100 / abs(odds))
print(f'Expected payout: {payout:.2f}')"
Built by AgentBets — full tutorial at agentbets.ai/guides/openclaw-bet-slip-parser-skill/.
Part of the OpenClaw Skills series for the Agent Betting Stack.