Proba Bet
Try free

Sharp plan · REST · JSON

API documentation

Everything the dashboard shows, as JSON: opportunities of the last scan (every 45 s), surebets, parlays and the fair probabilities of every match. Base URL: https://proba.bet.

Authentication

Create a key in Settings → API (Sharp plan, 3 active keys max). Send it as a Bearer token. The key is shown once; we only store its SHA-256 hash.

curl -H "Authorization: Bearer pb_live_xxxxxxxx" "https://proba.bet/api/v1/me"
{ "plan": "sharp", "daily_limit": 20000, "remaining_today": 19999 }

Quota

20,000 requests per key and per day (UTC). Each response carries X-RateLimit-Limit and X-RateLimit-Remaining. Data changes every 45 seconds: polling faster than that is pointless.

Endpoints

EndpointParametersReturns
GET /api/v1/meplan, daily_limit, remaining_today
GET /api/v1/opportunitieskind=value|surebet|combo · min_ev · sport · limitcount, data[] (event, market, outcome, book, price, fair_prob, ev, grade, alt_books, link…)
GET /api/v1/matchessport · hours (≤ 168) · limit — ou id=<event_id>count, data[] (home, away, commence_time, p_home, p_draw, p_away, total_line, p_over, p_under, source, matched, thin, kind)

Example: value bets

curl -H "Authorization: Bearer pb_live_xxxxxxxx" \
  "https://proba.bet/api/v1/opportunities?kind=value&min_ev=0.02&sport=soccer_epl&limit=50"
{
  "kind": "value", "count": 12, "generated_at": "2026-09-19T21:03:44Z",
  "data": [{
    "event_id": "0ab3…", "sport_key": "soccer_epl", "home": "Arsenal", "away": "Chelsea", "commence_time": "2026-09-20T15:00:00Z",
    "market_key": "h2h", "outcome": "Draw", "point": null,
    "book": "unibet_fr", "book_title": "Unibet (FR)", "price": 3.60, "link": "https://…",
    "fair_prob": 0.2914, "fair_odds": 3.43, "ev": 0.0490, "grade": "A", "flags": [],
    "alt_books": [{ "book": "betclic_fr", "price": 3.55, "ev": 0.0344, "grade": "A" }]
  }]
}

grade A = Babeth's selection (tracked in the public track record); B = published with flags; C = check before betting. alt_books lists the other bookmakers offering the same bet with an edge.

Example: match probabilities

curl -H "Authorization: Bearer pb_live_xxxxxxxx" "https://proba.bet/api/v1/matches?sport=soccer_epl&hours=48"
curl -H "Authorization: Bearer pb_live_xxxxxxxx" "https://proba.bet/api/v1/matches?id=0ab3c9d1"

Errors

Webhooks

Instead of polling, let Babeth call you: in Settings → Webhook, enter an HTTPS URL. Every new selection bet at your bookmakers (same filters as your alerts) is POSTed once, with your stake. A failed call is retried at the next scan; after 5 failures, delivery pauses for 10 minutes.

POST https://votre-serveur.example/proba          (Settings → Webhook)
Content-Type: application/json
X-Proba-Event: picks | test
X-Proba-Signature: sha256=<HMAC-SHA256(secret, body)>

{
  "event": "picks", "sent_at": "2026-09-20T09:00:12Z", "user_id": "…",
  "picks": [{
    "event_id": "0ab3…", "sport_key": "soccer_epl", "home": "Arsenal", "away": "Chelsea", "commence_time": "2026-09-20T15:00:00Z",
    "market_key": "h2h", "outcome": "Draw", "point": null,
    "book": "unibet_fr", "book_title": "Unibet (FR)", "price": 3.60, "link": "https://…",
    "fair_prob": 0.2914, "fair_odds": 3.43, "min_odds": 3.50, "ev": 0.049, "grade": "A", "stake": 12, "currency": "EUR"
  }]
}

Verify the signature before trusting the payload:

# Node.js
const sig = req.headers["x-proba-signature"];            // "sha256=…"
const mac = crypto.createHmac("sha256", SECRET).update(rawBody).digest("hex");
const ok = sig === "sha256=" + mac;

# Python
ok = hmac.compare_digest(sig, "sha256=" + hmac.new(SECRET.encode(), raw_body, hashlib.sha256).hexdigest())

Respond 2xx within 5 seconds. The `test` event comes from the “Send a test” button.

Terms

Personal use or your own tools. No resale of the data, no public redistribution. Keys can be revoked at any time from Settings. Decision-support data, no guarantee of winnings.

Need the API?

The Sharp plan includes the API, line moves, multiple bankrolls and the full comparator.