Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

Arbitrage Finder

v1.1.0

Detect guaranteed-profit arbitrage opportunities across sportsbooks and prediction markets. Compares odds from 20+ bookmakers, Polymarket, and Kalshi. Calcul...

0· 100·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for rsquaredsolutions2026/arb-finder.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Arbitrage Finder" (rsquaredsolutions2026/arb-finder) from ClawHub.
Skill page: https://clawhub.ai/rsquaredsolutions2026/arb-finder
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Required binaries: curl, jq, python3
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install arb-finder

ClawHub CLI

Package manager switcher

npx clawhub@latest install arb-finder
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Suspicious
medium confidence
Purpose & Capability
The name/description (finding arbs across sportsbooks, Polymarket, Kalshi) aligns with the runtime instructions: curl + jq calls to The Odds API, Polymarket, and Kalshi and Python for calculations. Required binaries (curl, jq, python3) are appropriate for the shown commands. However, the SKILL.md declares a credential (ODDS_API_KEY) that the registry metadata ( Requirements: 'Required env vars: none') does not list — that's an internal mismatch.
Instruction Scope
Instructions are narrowly scoped to fetching odds/prices from external APIs and performing arithmetic to detect arbs and compute stakes. They do not instruct reading local files or other system state. They will perform outbound network requests to third-party endpoints (the-odds-api.com, gamma-api.polymarket.com, api.elections.kalshi.com), which is expected for this purpose but worth noting because data (queries/results) are transmitted externally.
Install Mechanism
Instruction-only skill with no install spec or code files — nothing is written to disk by an installer. This is the lowest install risk.
!
Credentials
SKILL.md declares a required credential (The Odds API key → ODDS_API_KEY) as metadata, which is appropriate for calling The Odds API. However, the registry metadata for the skill reported 'Required env vars: none' — a clear inconsistency. The skill otherwise does not request unrelated secrets or multiple credentials, so the single API key is proportionate if the registry correctly lists it.
Persistence & Privilege
The skill does not request always:true and is user-invocable with normal autonomous invocation; it does not attempt to modify other skills or system settings in the instructions. No persistence or elevated privileges are requested.
What to consider before installing
This skill appears to do what it says (query odds and detect arbitrage), but take these precautions before installing: - Confirm the ODDS_API_KEY requirement: SKILL.md expects an API key for The Odds API (ODDS_API_KEY). The registry listing omitted that — verify the installer will request this environment variable and you are comfortable providing it. - Consider provenance risk: there is no source repository or homepage and the owner is unknown. If you don't trust the publisher, avoid providing credentials or run the skill in an isolated environment. - Minimize risk of credential exposure: create and use a limited-scope API key you can revoke, not any broader account credential. - Expect network traffic: the skill will make outbound requests to the-odds-api.com, polymarket (gamma-api.polymarket.com), and Kalshi endpoints — only supply data you are comfortable sending to those services. - If possible, view the full SKILL.md (and any truncated code) before installing to confirm there are no hidden commands that access local files or other env vars. If the registry metadata remains inconsistent (omits the declared credential), treat that as a red flag and ask the publisher for clarification. If you want, I can extract the remainder of the truncated Python stake-calculation portion and scan it for questionable operations before you proceed.

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

🔀 Clawdis
Binscurl, jq, python3
agentbetsvk978f1ae6gwsxjb85bzv1m1ch583gs5sbettingvk978f1ae6gwsxjb85bzv1m1ch583gs5slatestvk978f1ae6gwsxjb85bzv1m1ch583gs5sopenclawvk978f1ae6gwsxjb85bzv1m1ch583gs5sprediction-marketsvk978f1ae6gwsxjb85bzv1m1ch583gs5ssports-bettingvk978f1ae6gwsxjb85bzv1m1ch583gs5s
100downloads
0stars
2versions
Updated 1mo ago
v1.1.0
MIT-0

Arbitrage Finder

Detect cross-market arbitrage opportunities across sportsbooks and prediction markets.

When to Use

Use this skill when the user asks about:

  • Finding arbitrage or arb opportunities
  • Guaranteed profit bets
  • Cross-market pricing discrepancies
  • Comparing sportsbook odds vs prediction market prices
  • Calculating optimal stake distribution for an arb
  • Whether a specific event has an arb available

Operations

1. Scan Sportsbook Arbs

Scan a sport for two-way moneyline arbs across bookmakers. Replace SPORT_KEY with the appropriate key (e.g., basketball_nba, americanfootball_nfl):

curl -s "https://api.the-odds-api.com/v4/sports/SPORT_KEY/odds?apiKey=$ODDS_API_KEY&regions=us&markets=h2h&oddsFormat=american" \
  | jq '[.[] | {
    game: "\(.away_team) @ \(.home_team)",
    start: .commence_time,
    away_team: .away_team,
    home_team: .home_team,
    best_away: (.bookmakers | map({book: .title, odds: ((.markets[] | select(.key=="h2h")).outcomes[] | select(.name == .away_team) | .price)}) | sort_by(-.odds) | first),
    best_home: (.bookmakers | map({book: .title, odds: ((.markets[] | select(.key=="h2h")).outcomes[] | select(.name == .home_team) | .price)}) | sort_by(-.odds) | first)
  } | . + {
    ip_away: (if .best_away.odds > 0 then 100/(.best_away.odds+100) else (-.best_away.odds)/(-.best_away.odds+100) end),
    ip_home: (if .best_home.odds > 0 then 100/(.best_home.odds+100) else (-.best_home.odds)/(-.best_home.odds+100) end)
  } | . + {
    total_ip: (.ip_away + .ip_home),
    is_arb: ((.ip_away + .ip_home) < 1)
  } | select(.is_arb == true) | {
    game, start,
    away: {team: .away_team, odds: .best_away.odds, book: .best_away.book},
    home: {team: .home_team, odds: .best_home.odds, book: .best_home.book},
    margin: ((1 - .total_ip) * 100 | . * 100 | round / 100 | tostring + "%")
  }]'

2. Cross-Market Arb Scan — Sportsbooks vs Polymarket

Compare sportsbook moneylines against Polymarket event prices. First fetch Polymarket events, then compare:

Fetch Polymarket active sports/politics events:

curl -s "https://gamma-api.polymarket.com/events?closed=false&limit=50&order=volume24hr&ascending=false" \
  | jq '[.[] | {
    id: .id,
    title: .title,
    markets: [.markets[] | {
      question: .question,
      outcomes: .outcomes,
      outcomePrices: .outcomePrices,
      volume24hr: .volume24hr
    }]
  }]'

For a specific Polymarket market, get the current prices and convert to implied odds:

curl -s "https://gamma-api.polymarket.com/markets?id=MARKET_ID" \
  | jq '.[0] | {
    question: .question,
    outcomes: [.outcomes as $o | .outcomePrices | split(",") | to_entries[] | {
      outcome: ($o | split(",") | .[.key]),
      price: (. .value | tonumber),
      implied_pct: ((. .value | tonumber) * 100 | round | tostring + "%"),
      american_equiv: (if (.value | tonumber) >= 0.5
        then (-((.value | tonumber) / (1 - (.value | tonumber)) * 100) | round)
        else (((1 - (.value | tonumber)) / (.value | tonumber) * 100) | round)
        end)
    }]
  }'

To check for a cross-market arb, compare the Polymarket implied probability for one side against the sportsbook odds for the other side. If the sum of the best available implied probabilities across platforms is below 100%, an arb exists.

3. Scan Kalshi Event Contracts

Fetch Kalshi markets for comparison:

curl -s "https://api.elections.kalshi.com/trade-api/v2/events?status=open&limit=50&with_nested_markets=true" \
  | jq '[.events[] | {
    title: .title,
    category: .category,
    markets: [.markets[]? | {
      ticker: .ticker,
      title: .title,
      yes_price: .yes_ask,
      no_price: .no_ask,
      volume: .volume,
      yes_implied: ((.yes_ask // 0) * 100 | round | tostring + "%"),
      no_implied: ((.no_ask // 0) * 100 | round | tostring + "%")
    }]
  }]'

Kalshi contract prices are already probabilities (e.g., $0.65 = 65% implied). Convert to American odds for comparison:

python3 -c "
price = 0.65  # Replace with actual Kalshi contract price
if price >= 0.5:
    american = -(price / (1 - price)) * 100
else:
    american = ((1 - price) / price) * 100
print(f'Kalshi price: \${price:.2f}')
print(f'Implied prob: {price*100:.1f}%')
print(f'American odds: {american:+.0f}')
"

4. Calculate Optimal Stake Distribution

Given an arb opportunity, calculate exact stakes for equal profit across all legs:

python3 -c "
import sys, json

# Input: best odds per outcome and total bankroll
odds_1 = 150    # American odds for outcome 1 (e.g., +150)
odds_2 = -130   # American odds for outcome 2 (e.g., -130)
bankroll = 1000  # Total amount to deploy

# Convert American odds to implied probability
def american_to_ip(odds):
    if odds > 0:
        return 100 / (odds + 100)
    else:
        return abs(odds) / (abs(odds) + 100)

# Convert American odds to decimal
def american_to_decimal(odds):
    if odds > 0:
        return (odds / 100) + 1
    else:
        return (100 / abs(odds)) + 1

ip1 = american_to_ip(odds_1)
ip2 = american_to_ip(odds_2)
total_ip = ip1 + ip2

if total_ip >= 1:
    print('NO ARB: Total implied probability >= 100%')
    print(f'Total IP: {total_ip*100:.2f}%')
    sys.exit(0)

dec1 = american_to_decimal(odds_1)
dec2 = american_to_decimal(odds_2)

# Equal-profit stake distribution
stake1 = bankroll / (1 + dec1 / dec2)
stake2 = bankroll - stake1

payout1 = stake1 * dec1
payout2 = stake2 * dec2
profit = payout1 - bankroll

margin = (1 - total_ip) * 100

print(f'=== ARB FOUND ===')
print(f'Margin: {margin:.2f}%')
print(f'Outcome 1: odds {odds_1:+d} → stake \${stake1:.2f} → payout \${payout1:.2f}')
print(f'Outcome 2: odds {odds_2:+d} → stake \${stake2:.2f} → payout \${payout2:.2f}')
print(f'Total staked: \${bankroll:.2f}')
print(f'Guaranteed profit: \${profit:.2f} ({profit/bankroll*100:.2f}%)')
"

Replace the odds_1, odds_2, and bankroll values with the actual arb opportunity found in Operations 1-3. For three-way markets (e.g., soccer), extend the calculation to three outcomes.

Output Rules

  1. Always show the event, both sides, and which platform/book has the best price per side
  2. Display the arb margin as a percentage (e.g., "3.5% margin")
  3. For stake calculations, show exact dollar amounts and guaranteed profit
  4. Sort arb opportunities by margin (highest first)
  5. If no arbs are found, report the closest near-arb (lowest total implied probability)
  6. Always note that arb windows are time-sensitive and lines may have moved
  7. Report remaining Odds API quota after sportsbook scans

Error Handling

  • If ODDS_API_KEY is not set, tell the user to get a free key at https://the-odds-api.com/
  • If Polymarket API returns empty, the event may not be listed on Polymarket
  • If Kalshi API returns empty, check that the event category is available on Kalshi
  • If no arbs found, report the tightest market (lowest combined IP) as a near-arb
  • If rate limited on any API, report which source hit the limit and suggest waiting

About

Built by AgentBets — full tutorial at agentbets.ai/guides/openclaw-arb-finder-skill/.

Part of the OpenClaw Skills series for the Agent Betting Stack.

Comments

Loading comments...