API Reference

StakeAPI delivers real-time Stake.com sports & esports events and odds over a simple REST API plus a Server-Sent Events stream. JSON in, JSON out - no SDK required.

Introduction

The API exposes normalized fixtures (matches) with live and pre-match odds across all major sports and esports - football, tennis, basketball, ice-hockey, baseball, MMA, CS2, Dota 2, League of Legends, Valorant and more. Virtual feeds (eFootball / eSoccer) are excluded.

REST + JSON SSE live updates API-key auth ~seconds latency

Base URL

All endpoints are served over HTTPS under the /v1 prefix:

Base URL
https://bwapi.lol/v1

Authentication

Authenticate every request with your API key in the X-API-Key header. Keys are issued and managed from your dashboard. An active subscription is required.

Header
X-API-Key: your_api_key
Requests without a valid key return 401. If your subscription has expired you'll get 402 Payment Required.

Quickstart

Fetch upcoming and live events in one call:

cURL
curl "https://bwapi.lol/v1/events?status=live&limit=5" \
  -H "X-API-Key: your_api_key"

Rate limits

Default limit is 1000 requests / minute per key (higher on 6- and 12-month plans). For continuous live data prefer the SSE stream over tight polling.

List sports

GET/v1/sports

Returns enabled disciplines with a live-event counter.

Response

200 OK
{
  "sports": [
    { "key": "counter-strike", "label": "CS2", "category": "esport", "live_count": 3 },
    { "key": "soccer", "label": "Football", "category": "sport", "live_count": 12 }
  ]
}

List events

GET/v1/events

Returns events with markets and odds. Filter by sport and status.

Query parameters

ParamTypeDescription
sportstringFilter by sport key (e.g. soccer, counter-strike). Optional.
statusstringall (default), live, prematch or ended.
limitintMax results, default 200, up to 1000.

Example

cURL
curl "https://bwapi.lol/v1/events?sport=tennis&status=live" \
  -H "X-API-Key: your_api_key"

Response

200 OK
{
  "events": [
    {
      "id": "65c3a461-b9e5-4a68-8082-db97a6bed3bb",
      "sport": "tennis",
      "league": "Wimbledon Men Singles",
      "home": "Alex Molcan",
      "away": "Daniel Altmaier",
      "start_time": "2026-06-30T16:55:00+00:00",
      "status": "live",
      "score": null,
      "markets": [
        {
          "type": "Winner",
          "selections": [
            { "name": "Alex Molcan", "line": null, "price": 1.30 },
            { "name": "Daniel Altmaier", "line": null, "price": 3.30 }
          ]
        }
      ],
      "updated_at": "2026-06-30T22:34:07+00:00"
    }
  ]
}

Get event

GET/v1/events/{id}

Fetch a single event by its id. Returns 404 if not found.

cURL
curl "https://bwapi.lol/v1/events/65c3a461-b9e5-4a68-8082-db97a6bed3bb" \
  -H "X-API-Key: your_api_key"

Live stream (SSE)

SSE/v1/live/stream

A Server-Sent Events stream that pushes a fresh snapshot of live events whenever odds change (checked every ~3s). Optional ?sport= filter.

Browser

JavaScript
const es = new EventSource(
  "https://bwapi.lol/v1/live/stream?sport=counter-strike"
);
es.addEventListener("live", (e) => {
  const { events } = JSON.parse(e.data);
  console.log(events);
});
EventSource can't set custom headers - pass the key as ?api_key= when consuming the stream from a browser. Server-to-server, use the X-API-Key header.

Data model

Event

FieldTypeDescription
idstringStable unique event id (UUID).
sportstringSport key (e.g. soccer).
leaguestringTournament / league name.
homestringHome competitor.
awaystringAway competitor.
start_timestringISO-8601 UTC kickoff time.
statusstringprematch, live or ended.
scorestring|nullCurrent score when live.
marketsMarket[]Markets with selections & odds.
updated_atstringLast update timestamp (ISO-8601).

Market & Selection

FieldTypeDescription
typestringMarket name, e.g. Winner.
selections[].namestringOutcome label.
selections[].linenumber|nullHandicap / total line if any.
selections[].pricenumberDecimal odds.

Errors

Errors use standard HTTP status codes with a JSON body { "detail": "..." }.

StatusMeaning
200OK
401Missing or invalid API key.
402Subscription expired - renew in the dashboard.
404Event not found.
429Rate limit exceeded.

Need help? Write to support@bwapi.lol.