Skip to main content

SharpAPI Python SDK

Official Python client for the SharpAPI real-time sports betting odds API.

Get pre-computed +EV opportunities, arbitrage detection, middles, and live odds from 20+ sportsbooks — with Pinnacle as the sharp reference.

Install

pip install sharpapi

Quick Start

from sharpapi import SharpAPI

client = SharpAPI("sk_live_xxx")

# --- Arbitrage opportunities ---
arbs = client.arbitrage.get(min_profit=1.0, league="nba")
for arb in arbs.data:
    print(f"{arb.profit_percent:.2f}% profit — {arb.event_name}")
    for leg in arb.legs:
        print(f"  {leg.sportsbook}: {leg.selection} @ {leg.odds_american} ({leg.stake_percent:.1f}%)")

# --- +EV opportunities ---
evs = client.ev.get(min_ev=3.0, sport="basketball")
for opp in evs.data:
    print(f"+{opp.ev_percentage:.1f}% EV on {opp.selection} @ {opp.sportsbook}")
    if opp.kelly_percent:
        print(f"  Kelly: {opp.kelly_percent:.1%} of bankroll")

# --- Best odds across books ---
odds = client.odds.best(league="nba", market="moneyline")
for line in odds.data:
    print(f"{line.home_team} vs {line.away_team}: {line.selection} {line.odds_american}")

Streaming

Real-time SSE streaming for odds updates and opportunity alerts (requires WebSocket add-on):

stream = client.stream.opportunities(league="nba")

@stream.on("ev:detected")
def on_ev(data):
    for opp in data:
        print(f"+EV: {opp['selection']} {opp['ev_percentage']}% @ {opp['sportsbook']}")

@stream.on("arb:detected")
def on_arb(data):
    for arb in data:
        print(f"Arb: {arb['profit_percent']}% — {arb['event_name']}")

stream.connect()  # Blocks, processing events

Or iterate over events:

for event_type, data in stream.iter_events():
    if event_type == "ev:detected":
        print(data)

All Resources

# Odds
client.odds.get(sport="basketball", league="nba")
client.odds.best(league="nfl", market="moneyline")
client.odds.comparison(event_id="abc123")
client.odds.batch(event_ids=["abc123", "def456"])

# Opportunities
client.ev.get(min_ev=2.0, sportsbook="draftkings")
client.arbitrage.get(min_profit=0.5, sport="football")
client.middles.get(sport="football", min_size=3.0)
client.low_hold.get(max_hold=2.0)

# Reference data
client.sports.list()
client.leagues.list(sport="basketball")
client.sportsbooks.list()
client.events.list(league="nba", live=True)

# Account
client.account.me()       # Tier, limits, features
client.account.usage()    # Request counts

# Streaming
client.stream.odds(league="nba")
client.stream.opportunities(min_ev=3.0)
client.stream.all(sport="basketball")
client.stream.event("event_id_here")

Data Quality

Every opportunity response includes staleness metadata to avoid acting on stale odds:

arbs = client.arbitrage.get()
for arb in arbs.data:
    if arb.possibly_stale:
        print(f"  Skipping — odds may be stale ({arb.oldest_odds_age_seconds}s old)")
        continue
    if "LIVE_HIGH_PROFIT_SUSPICIOUS" in arb.warnings:
        print(f"  Skipping — likely phantom arb")
        continue
    print(f"Actionable: {arb.profit_percent}%")

Rate Limits

Rate limit info is available after every request:

response = client.odds.get()
print(f"Remaining: {client.rate_limit.remaining}/{client.rate_limit.limit}")
print(f"Tier: {client.rate_limit.tier}")

Error Handling

from sharpapi import (
    SharpAPI,
    AuthenticationError,
    TierRestrictedError,
    RateLimitedError,
)

client = SharpAPI("sk_live_xxx")

try:
    evs = client.ev.get()
except AuthenticationError:
    print("Invalid API key")
except TierRestrictedError as e:
    print(f"Upgrade to {e.required_tier} tier for this feature")
except RateLimitedError as e:
    print(f"Rate limited — retry after {e.retry_after}s")

Odds Conversion Utilities

from sharpapi import american_to_decimal, american_to_probability, decimal_to_american

american_to_decimal(-110)       # 1.909
american_to_decimal(150)        # 2.5
american_to_probability(-110)   # 0.524
decimal_to_american(2.5)        # 150

Requirements

  • Python 3.9+
  • httpx
  • pydantic v2

Metadata

Release files for sharpapi 0.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sharpapi 0.4.1
File Size Uploaded
sharpapi-0.4.1.tar.gz 23.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sharpapi 0.4.1
File Interpreter ABI Platform
sharpapi-0.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 50.8 kB

Release files / sharpapi-0.4.1.tar.gz

Download URL sharpapi-0.4.1.tar.gz
Size 23.3 kB
Tags Source
SHA-256 checksum
How to use checksums
988a044ae737a7d607bea038c3a7a0ebd28aa91352cb8e988187aca10373abae
BLAKE2b-256 checksum
How to use checksums
0d99de33f852946f336066f5788253554e19561e7fb0b71153dfdb053a9fcd9f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 3, 2026.

Transparency log

Release files / sharpapi-0.4.1-py3-none-any.whl

Download URL sharpapi-0.4.1-py3-none-any.whl
Size 27.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bf862a24f568b4dcf0cdbdf96c56eac3293cb1351fbf9ad4c00d35cede75a0e8
BLAKE2b-256 checksum
How to use checksums
a304883baaaadcfa8b1ff45da98eb34ca0b71af7059a80cdb79f07b407b830d4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 3, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.1 This release

2 release files

0.4.0

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.2.5

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page