GET /v3/events
Lists events and returns each one's epk — the identity string that
Place Bet and
Price Check both accept in place of
sport + competition + event.
Use this instead of constructing an EPK yourself. An EPK looks
predictable — aussie_rules/au/afl/st_kilda_saints_v_gold_coast_suns/2026-08-20
— but building one from names means guessing our slugging, our country code
and our league key for every fixture, and a near-miss resolves to nothing.
This endpoint makes an EPK something you select, not something you spell.
Base URL: https://api.b337.ai · Header: X-API-Key: YOUR_API_KEY
| Param | Type | Default | Description |
|---|---|---|---|
sport | string | — | Sport group (aussie_rules) or league (afl). Either works — see below. |
league | string | — | League, explicitly. Narrows sport when both are given. |
date | string | — | Event day, YYYY-MM-DD. |
country | string | — | Country segment, e.g. au, gb, int. |
book | string | — | Only events this bookie is bound to (and can therefore be bet through). |
include_outrights | bool | false | Include outright/futures markets. |
limit | int | 200 | Max rows (1–1000). |
Filters are AND-ed.
sport accepts either grainafl is a league; its sport group is aussie_rules. You can pass
either, and the response's resolved block tells you which reading was used:
curl -s "https://api.b337.ai/v3/events?sport=afl" -H "X-API-Key: YOUR_API_KEY"
"resolved": { "input": "afl", "interpreted_as": "league", "sport": null, "league": "afl" }
Passing sport=aussie_rules instead returns AFL and AFLW, with
"interpreted_as": "sport". To discover the leagues inside a sport, ask for
the sport and read the league field off the rows.
If a token happens to be both a sport group and a league (boxing currently
is), the sport group wins — you get the superset. Pass league= if you
want the narrower read.
{ "count": 8, "matched": 8, "truncated": false, "hidden_outrights": 8, "resolved": { "input": "afl", "interpreted_as": "league", "sport": null, "league": "afl" }, "events": [ { "epk": "aussie_rules/au/afl/st_kilda_saints_v_gold_coast_suns/2026-08-20", "event": "St Kilda Saints v Gold Coast Suns", "home": "St Kilda Saints", "away": "Gold Coast Suns", "sport": "aussie_rules", "league": "afl", "country": "au", "date": "2026-08-20", "start_time": "2026-08-20T09:30:00Z", "status": "scheduled", "is_outright": false, "books": ["bet365", "sportsbet", "tab", "..."] } ] }
| Field | Meaning |
|---|---|
count | Rows returned. |
matched | Rows that matched the filters before limit. |
truncated | true when limit cut the result — the page is not the whole answer. |
hidden_outrights | Outrights suppressed by include_outrights=false. |
resolved | How sport was interpreted. null when sport was not passed. |
books | Bookies bound to this event. Not cosmetic — a book absent here cannot bet this event. |
Place Bet's EPK shortcut only covers head-to-head/team events, so outright EPKs cannot be bet the way the rest of this response implies — they are hidden unless you ask.
This matters for three sports: golf, motorsport and snooker are
currently 100% outright-form, so they return count: 0 by default. That is
not "no coverage" — check hidden_outrights, then re-request:
curl -s "https://api.b337.ai/v3/events?sport=golf&include_outrights=true" \ -H "X-API-Key: YOUR_API_KEY"
An unrecognised sport returns 404 with the valid list, rather than an
empty array — "that sport does not exist" and "nothing is on today" are
different problems and should not look alike:
{ "detail": { "error": "unknown sport or league: 'footy'", "valid_sports": ["american_football", "aussie_rules", "baseball", "basketball", "..."], "hint": "pass a sport group (aussie_rules) or a league (afl); use ?sport=<group> then read `league` off the rows to discover leagues" } }
GET /v3/events?sport=afl&date=2026-08-20 → copy an epk.POST /v3/price_check with that
epk + market + selection to confirm the price.POST /v3/place_bet with the same
body + stake.curl -s "https://api.b337.ai/v3/events?sport=afl&date=2026-08-20&book=tab" \ -H "X-API-Key: YOUR_API_KEY"
404 — unknown sport/league token (response carries valid_sports)401 — unauthorized503 — event index temporarily unavailableepk you just found (takes session_id, singular)epk, no stake (takes session_ids, a list)