Skip to content

BreathPulley/stake-scraper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

Stake.com Scraper — Odds, Bets & Markets Data via GraphQL API

Telegram Bot Python No Token License


Scrape Stake.com sport odds, live bets, highrollers, trending matches and market data. Python + GraphQL. No captcha. No browser. No Selenium.

Quick Start · What you can scrape · Use Telegram Bot


GitHub stars GitHub forks


Don't want to scrape manually?

Your Stake.com companion. Monitor bets, check balances, manage withdrawals.

@stakecontrolbot already does all the scraping for you 24/7 — highrollers, trending matches, odds monitoring, balance tracking — straight to your Telegram. No code, no server, no maintenance.


Why this scraper is different

Most Stake.com scrapers use Selenium or Puppeteer to render the page in a browser. That's slow, fragile, and gets blocked.

This scraper hits the GraphQL API directly — the same endpoint the Stake.com website uses internally. No browser, no Selenium, no captcha solver needed for public data.

POST https://stake.com/_api/graphql
Content-Type: application/json

Fast. Lightweight. Reliable.


What can you scrape?

Without any token (fully public)

Data GraphQL query Update frequency
Highroller bets highrollerSportBets Real-time
All sport bets feed allSportBets Real-time
Trending matches sportHomepageTrendingMatches Every ~60s
Match odds sportFixture Real-time
Sport markets sportFixture.groups Real-time
Exchange rates (crypto/fiat) CurrencyConversionRate Every ~60s

With API token (personal data)

Data GraphQL query
Your balance UserBalances
Your bet history sportBetList
Your transactions transactions
Your tips history tipList / sendTipList
Active bets activeSportBets

Get your token: Stake.com → Settings → Security → API Tokens


Quick Start

git clone https://github.com/forcemaredart/stake-scraper
cd stake-scraper
pip install -r requirements.txt
python scraper.py

Usage examples

Scrape all sport bets in real time (no token)

import requests

ENDPOINT = "https://stake.com/_api/graphql"
HEADERS  = {"content-type": "application/json"}

query = """
query {
  allSportBets(limit: 20) {
    bet {
      ... on SportBet {
        amount
        currency
        user { name }
        outcomes {
          odds
          fixtureName
          outcome { name }
        }
      }
    }
  }
}
"""

r = requests.post(ENDPOINT, headers=HEADERS, json={"query": query})
bets = r.json()["data"]["allSportBets"]
for item in bets:
    b = item["bet"]
    oc = b["outcomes"][0]
    print(f"{b['user']['name']:20} {b['amount']} {b['currency']} @ {oc['odds']} | {oc['fixtureName']}")

Scrape live odds for a match

query = """
query FixtureOdds($id: String!) {
  sportFixture(id: $id) {
    name
    status
    groups(groups: ["winner"]) {
      templates(limit: 1) {
        markets(limit: 1) {
          name
          outcomes {
            name
            odds
            active
          }
        }
      }
    }
  }
}
"""

r = requests.post(ENDPOINT, headers=HEADERS, json={
    "query": query,
    "variables": {"id": "YOUR_FIXTURE_ID"}
})
fixture = r.json()["data"]["sportFixture"]
print(fixture["name"])
for market in fixture["groups"][0]["templates"][0]["markets"]:
    for outcome in market["outcomes"]:
        print(f"  {outcome['name']:20} {outcome['odds']}")

Scrape trending matches with bet counts

query = """
query {
  sportHomepageTrendingMatches(sortBy: totalBetValue) {
    fixtureStatistics {
      totalUserCount
      totalBetCount
      totalBetValue
    }
    fixture {
      name
      status
      tournament {
        category { sport { name } }
      }
    }
  }
}
"""

r = requests.post(ENDPOINT, headers=HEADERS, json={"query": query})
matches = r.json()["data"]["sportHomepageTrendingMatches"]
for m in matches:
    stats   = m["fixtureStatistics"]
    fixture = m["fixture"]
    sport   = fixture["tournament"]["category"]["sport"]["name"]
    print(f"{fixture['name']:40} {sport:15} bets:{stats['totalBetCount']:>6}  vol:${stats['totalBetValue']:>10,.0f}")

Scrape highrollers with USD conversion

import requests

BINANCE = "https://api.binance.com/api/v3/ticker/price"

# Get prices
prices = {"USDT": 1.0, "USDC": 1.0}
for item in requests.get(BINANCE).json():
    if item["symbol"].endswith("USDT"):
        prices[item["symbol"][:-4]] = float(item["price"])

# Scrape highrollers
query = """
query {
  highrollerSportBets(limit: 25) {
    bet {
      ... on SportBet {
        amount currency
        potentialMultiplier
        user { name }
        outcomes { odds fixtureName outcome { name } }
      }
    }
  }
}
"""

r = requests.post(ENDPOINT, headers=HEADERS, json={"query": query})
for item in r.json()["data"]["highrollerSportBets"]:
    b   = item["bet"]
    usd = float(b["amount"]) * prices.get(b["currency"].upper(), 0)
    oc  = b["outcomes"][0]
    print(f"${usd:>8,.0f}  {b['user']['name']:20}  x{b['potentialMultiplier']:.2f}  {oc['fixtureName']}")

Run the full scraper

# Scrape highrollers to CSV
python scraper.py --mode highrollers --output highrollers.csv

# Scrape trending matches
python scraper.py --mode trending

# Scrape live odds for a fixture
python scraper.py --mode odds --fixture-id FIXTURE_ID

# Monitor all bets in real time
python scraper.py --mode monitor --threshold 500

Output example (CSV)

timestamp,player,amount,currency,usd,odds,fixture,outcome,sport
2026-03-24 14:23:01,cryptowhale,0.25,ETH,1020.50,2.10,Real Madrid vs Barcelona,Real Madrid,Football
2026-03-24 14:23:04,hidden,0.018,BTC,1890.00,1.85,Lakers vs Celtics,Lakers,Basketball
2026-03-24 14:23:09,stake_king,500.0,USDT,500.00,3.40,Djokovic vs Alcaraz,Djokovic,Tennis

Scraping without getting blocked

Stake.com uses Cloudflare. Tips to stay unblocked:

  • Don't exceed 1 request/second for the same query
  • Use requests.Session() — keep-alive reduces fingerprinting
  • Randomize User-Agent between sessions
  • Add x-language: en header — reduces response variation
  • For heavy scraping, use rotating proxies + FlareSolverr for CF cookie refresh
session = requests.Session()
session.headers.update({
    "content-type": "application/json",
    "x-language": "en",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
})

Want this running 24/7 without a server?

@stakecontrolbot is a ready-made Telegram bot that scrapes Stake.com continuously and delivers data straight to your phone:

What you want DIY scraper @stakecontrolbot
Highroller feed + +
Trending matches + +
Live odds monitoring + +
Push alerts on big bets +
Suspicious match detection +
Your personal balance +
Your bet history + ROI +
Runs 24/7, no server needed +
Zero setup +

Related


Disclaimer

Not affiliated with Stake.com. For educational purposes. Scraping public data only. Use responsibly and in accordance with Stake.com Terms of Service.


Star this repo if it saved you time

Telegram

Stake.com scraper · odds scraping · GraphQL API · sport bets · highrollers

About

Scrape Stake.com sport odds, highroller bets and trending matches via GraphQL API. Python, no Selenium, no browser.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages