Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
description: 'Generated from the Owls Insight API manifest and the owls-insight-ts SDK types. Schemas are deliberately lenient: every field is optional, enums are open (x-extensible-enum), and unknown fields may appear. Decode accordingly.'
title: Owls Insight Same Game Parlay API
version: 0.78.0
x-owls-manifest-commit: c93b0756
servers:
- url: https://api.owlsinsight.com
security:
- bearerAuth: []
tags:
- name: Same Game Parlay
paths:
/api/v1/{sport}/sgp/build:
post:
description: 'Prices a same game parlay on the book named in book (FanDuel, DraftKings, Hard Rock, BetRivers and Bally Bet): resolves each leg to that book''s own selection for one game and returns that book''s own correlation-adjusted same game parlay price for exactly those legs, verified leg by leg, not a naive multiplication of the singles. The price is the named book''s own same game parlay price for exactly the legs sent, at the lines they resolved to, verified leg by leg: it is returned only when the book''s answer confirms all of that; otherwise the call fails rather than returning a price. On a 200, sgp.isSGM is always true. A book whose pricing misbehaves may be paused: its builds are then a 503 SGP_BOOK_DISABLED until it is switched back on, and the other books are unaffected. A resolved leg carries the book''s own ids: fdSelection { marketId, selectionId } on FanDuel, bookSelection { marketId, selectionId } on every other book (DraftKings: its market id and selection id; Hard Rock: its market id and selection id, both strings of digits; BetRivers and Bally Bet: the book''s offer id and outcome id, both strings of digits). Only one of the two is present on a leg. FanDuel prices are FanDuel''s own bet-slip price, quoted from FanDuel''s New Jersey sportsbook. FanDuel runs separate markets in other states and in Ontario, so a slip placed there can show a different parlay price for the same legs. The price also moves with the market, so compare it only with a slip taken at the time in meta.pricedAt. fdSelection.marketId is FanDuel New Jersey''s id for that market. FanDuel issues a different marketId in every other state and in Ontario, while selectionId is the same everywhere, so to place a leg outside New Jersey use your region''s marketId for that selectionId. meta.timestamp and meta.resolvedAt are the same instant: when the legs were resolved against the book''s catalog, BEFORE pricing. meta.catalogAgeMs is the MINIMUM age that catalog data already had then; the true age can be higher. meta.priceRequestedAt is when the price request went out and meta.pricedAt is when the book''s answer came back, both on our server''s clock. Each can read slightly LATER than the real moment, by the time the answer took to reach our server (typically under 100 ms). If that timing detail is unavailable, priceRequestedAt is when pricing started (earlier than the request) and pricedAt is when the answer reached our server, so the two still enclose the quote. pricedAt is never earlier than priceRequestedAt and is the quote time to use. They are present on every 200, and on a refused 422 or a no-price 503 only when the book returned a response. catalogAgeMs is omitted when the age is unknown. 422 with reasonCode "unresolved" (code repeats it) when any leg cannot be resolved on the book, including a selection the book has suspended; the legs array says which leg and why. Nothing was priced. 422 also when two legs resolve to the same selection on the book, and on FanDuel for player props whose line is carried only in the selection name, because FanDuel does not confirm that line in its price response. These are refused before pricing. On FanDuel, alternate N-or-more strikeout rungs are priced, but its price response identifies the rung by its selection only and does not confirm its line. A 200 that includes one carries meta.lineUnverified: true and meta.lineUnverifiedLegs, the indexes of those legs in your legs array. Both keys are absent when every line was confirmed, and never appear on a DraftKings, Hard Rock, BetRivers or Bally Bet build, because each confirms every line. Player prop coverage is not uniform across books, sports and categories. The categories a player_prop leg can use on FanDuel, per sport: mlb: strikeouts, hits, total-bases, home-runs, rbis, runs, stolen-bases, singles, doubles, triples, hits-runs-rbis. nba: accepted: points, rebounds, assists, threes, steals, blocks. wnba: points, rebounds, and accepted: assists, threes, steals, blocks.'
operationId: buildSgp
parameters:
- in: path
name: sport
required: true
schema:
type: string
x-extensible-enum:
- mlb
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- tennis
- wnba
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/SgpBuildParams'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/SgpBuildResponse'
description: OK
'422':
content:
application/json:
schema:
$ref: '#/components/schemas/SgpBuildResponse'
description: Legs could not be resolved or the parlay was refused
'503':
content:
application/json:
schema:
$ref: '#/components/schemas/SgpBuildErrorBody'
description: No price right now
summary: Prices a same game parlay on the book named in book (FanDuel, DraftKings, Hard…
tags:
- Same Game Parlay
x-owls-access: Rookie and above
x-owls-sdk-method: buildSgp
/api/v1/{sport}/sgp/events:
get:
description: Lists a book's games for a sport together with the eventId the SGP builder needs (FanDuel unless ?book= names another).
operationId: getSgpEvents
parameters:
- in: path
name: sport
required: true
schema:
type: string
x-extensible-enum:
- mlb
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- tennis
- wnba
- description: The book whose games to list, one of fanduel, hardrock, draftkings, betrivers, ballybet (the books the builder prices, listed in supportedBooks on a 400 SGP_BOOK_UNSUPPORTED). Default fanduel. A book whose pricing is paused is a 503 SGP_BOOK_DISABLED, as on the build call.
in: query
name: book
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/SgpEventsResponse'
description: OK
summary: Lists a book's games for a sport together with the eventId the SGP builder…
tags:
- Same Game Parlay
x-owls-access: Rookie and above
x-owls-sdk-method: getSgpEvents
components:
schemas:
SgpFdSelection:
description: 'The FanDuel selection a resolved SGP leg maps to. `marketId` is specific to
the FanDuel state that priced it (New Jersey); `selectionId` is the same in
every state.'
properties:
marketId:
type: string
selectionId:
format: double
type: number
type: object
x-owls-required:
- marketId
- selectionId
SgpBuildResponse:
description: "Response from `POST /api/v1/{sport}/sgp/build`.\n\nAlso what a 422 returns. A 422 is NOT thrown, so check `success` before\nreading `sgp`, then branch on `reasonCode` (the API sends it on every 422 since\nthe refusal-status change; older API versions sent none on a leg-resolution 422\nand threw the refusal as a 502):\n- `\"unresolved\"`: a leg could not be resolved. No `sgp`, and a `reason` on each\n unresolved leg naming which lines FanDuel does offer or why the category,\n side or leg type cannot work. Fix the legs.\n- any other {@link SgpReasonCode} (`line-mismatch`, `bet-failure`,\n `not-placeable`, ...): FanDuel judged the slip and refused it, or its answer\n did not confirm the legs as sent. The request was valid but cannot be priced\n as specified, so do not resend the same body unchanged. `legIndex`,\n `lineEchoed` and `failureCodes` are set where they apply; `message` is prose.\n\nEvery other failure throws: a `ServiceBusyError` with `code` `no-price` when no\nusable answer came back (503, retry after `retryAfterMs`), one with an `SGP_*`\ncode ({@link SgpErrorBody} in `details`), or, from older API versions, an\n`OwlsInsightError` with status 502 whose `details` is the\n{@link SgpBuildErrorBody}."
properties:
code:
description: Repeats `reasonCode`.
type: string
x-extensible-enum:
- ambiguous-combination
- bet-failure
- bet-failure-shape
- combined-odds-missing
- duplicate-selection
- leg-failure
- line-mismatch
- line-not-echoed
- line-unexpected
- line-unverifiable
- no-price
- no-sgm-combination
- not-placeable
- resp-code
- runner-odds-duplicate
- runner-odds-inconsistent
- runner-odds-missing
- single-duplicate
- single-missing
- single-odds-missing
- unresolved
error:
description: 'Present when `success: false`.'
type: string
failureCodes:
description: 'Refused parlay only, when FanDuel rejected it with its own failure codes
(e.g. `SELECTION_NOT_FOUND`).'
items:
type: string
type: array
legIndex:
description: 'Refused parlay, `line-*` codes only: the leg''s index in your `legs` array.'
format: double
type: number
legs:
items:
$ref: '#/components/schemas/SgpResolvedLeg'
type: array
lineEchoed:
description: 'Refused parlay, `line-*` codes only: the line FanDuel priced, exactly as it
sent it, or `null` when it sent none.'
format: double
type:
- number
- 'null'
message:
description: 'Refused parlay (422) only: human-readable prose. Match on `reasonCode`,
`legIndex`, `lineEchoed` and `failureCodes`, never on this.'
type: string
meta:
$ref: '#/components/schemas/SgpBuildMeta'
pricing:
description: '`"fanduel-slip"` on a 200: the price is FanDuel''s own bet-slip answer.'
type: string
reasonCode:
description: 'Present when `success: false`: `"unresolved"` on a leg-resolution 422,
otherwise the {@link SgpReasonCode} of a refused parlay (never `no-price`,
which is thrown as a 503). Absent from older API versions'' leg-resolution
422.'
type: string
x-extensible-enum:
- ambiguous-combination
- bet-failure
- bet-failure-shape
- combined-odds-missing
- duplicate-selection
- leg-failure
- line-mismatch
- line-not-echoed
- line-unexpected
- line-unverifiable
- no-price
- no-sgm-combination
- not-placeable
- resp-code
- runner-odds-duplicate
- runner-odds-inconsistent
- runner-odds-missing
- single-duplicate
- single-missing
- single-odds-missing
- unresolved
sgp:
$ref: '#/components/schemas/SgpPrice'
success:
type: boolean
type: object
x-owls-required:
- success
- legs
- meta
SgpBuildMeta:
description: '`meta` of a `buildSgp` response (200, the leg-resolution 422 and the refused
422), and of the no-price 503, `SGP_BUSY` 503 and legacy 502 error bodies.
The fields marked "API v2.348.0" are absent from older API versions.'
properties:
book:
description: The book the legs were resolved and priced against (`"fanduel"`).
type: string
catalogAgeMs:
description: 'The MINIMUM age, in ms, the catalog data already had at `resolvedAt`; the
true age can be higher. Omitted when the age is unknown. API v2.348.0.'
format: double
type: number
commence_time:
type: string
eventId:
description: The API echoes eventId as the numeric FanDuel event id.
lineUnverified:
description: '`true` on a 200 that priced at least one leg whose line FanDuel''s
response does not confirm (alternate N-or-more strikeout rungs). Absent
when every line was confirmed. API v2.348.0.'
type: boolean
lineUnverifiedLegs:
description: 'With `lineUnverified`: the indexes of those legs in your `legs` array.
API v2.348.0.'
items:
format: double
type: number
type: array
matchup:
type: string
priceRequestedAt:
description: 'When the price request went out, on the API server''s clock. Present on
every 200, and on a refused 422, a no-price 503 or a legacy 502 only when
FanDuel returned a response. Absent on a leg-resolution 422 (nothing was
priced). API v2.348.0.'
type: string
pricedAt:
description: 'When FanDuel''s answer came back, on the API server''s clock. Never earlier
than `priceRequestedAt`; this is the quote time to use. Same presence as
`priceRequestedAt`. API v2.348.0.'
type: string
resolvedAt:
description: 'When the legs were resolved against FanDuel''s catalog, before pricing.
API v2.348.0.'
type: string
timestamp:
description: 'The same instant as `resolvedAt`: when the legs were resolved, BEFORE
pricing. It is not the quote time; use `pricedAt` for that.'
type: string
type: object
x-owls-required:
- eventId
- book
- timestamp
SgpEventsResponse:
description: Response from `GET /api/v1/{sport}/sgp/events`.
properties:
book:
description: The book the events belong to (`"fanduel"`).
type: string
count:
format: double
type: number
events:
items:
$ref: '#/components/schemas/SgpEvent'
type: array
meta:
properties:
timestamp:
type: string
type: object
x-owls-required:
- timestamp
sport:
type: string
success:
type: boolean
type: object
x-owls-required:
- success
- sport
- book
- count
- events
- meta
SgpEvent:
description: One bookable event returned by `getSgpEvents`.
properties:
away:
type: string
commence_time:
deprecated: true
type: string
competition:
description: FanDuel's competition name; empty when unknown.
type: string
eventId:
description: 'FanDuel''s numeric event id (a number on the wire). Pass it to `buildSgp`
as `String(event.eventId)`.'
home:
type: string
matchup:
description: '`"Away @ Home"`.'
type: string
start:
description: Scheduled start (ISO 8601), or `null` when FanDuel lists none.
type:
- string
- 'null'
type: object
x-owls-required:
- eventId
- matchup
- away
- home
- start
- competition
SgpResolvedLeg:
description: A single leg echoed back in a `buildSgp` response, with its resolution.
properties:
description:
description: 'Present when `resolved: true`: the FanDuel selection it resolved to.'
type: string
fdSelection:
$ref: '#/components/schemas/SgpFdSelection'
description: 'Present when `resolved: true`: the FanDuel selection the leg resolved to.'
reason:
description: 'Present when `resolved: false`: why the leg could not be used.'
type: string
resolved:
type: boolean
single:
description: 'On a 200: the leg''s stand-alone price, or `null` when none was matched.'
properties:
american:
format: double
type: number
decimal:
format: double
type: number
type:
- object
- 'null'
x-owls-required:
- american
- decimal
type: object
x-owls-required:
- resolved
SgpBuildErrorBody:
description: "The body of a thrown `buildSgp` failure that reached pricing, found on the\nerror as `err.details`; `err.code` is `reasonCode`:\n- the no-price 503 (`ServiceBusyError`, `code` `no-price`): no usable answer\n came back; retry after `err.retryAfterMs`;\n- the 502 older API versions sent for every refusal (`OwlsInsightError`,\n status 502). Current API versions return a refused parlay as a 422 on\n {@link SgpBuildResponse} instead, with the same fields.\n\nMatch on `reasonCode`, `legIndex`, `lineEchoed` and `failureCodes`, never on\n`message`, which is prose."
properties:
code:
description: Repeats `reasonCode`.
type: string
x-extensible-enum:
- ambiguous-combination
- bet-failure
- bet-failure-shape
- combined-odds-missing
- duplicate-selection
- leg-failure
- line-mismatch
- line-not-echoed
- line-unexpected
- line-unverifiable
- no-price
- no-sgm-combination
- not-placeable
- resp-code
- runner-odds-duplicate
- runner-odds-inconsistent
- runner-odds-missing
- single-duplicate
- single-missing
- single-odds-missing
error:
type: string
failureCodes:
description: Only when FanDuel rejected the parlay with its own failure codes.
items:
type: string
type: array
legIndex:
description: 'Only for the `line-*` codes: the leg''s index in your `legs` array.'
format: double
type: number
legs:
items:
$ref: '#/components/schemas/SgpResolvedLeg'
type: array
lineEchoed:
description: 'Only for the `line-*` codes: the line FanDuel priced, exactly as it sent
it, or `null` when it sent none.'
format: double
type:
- number
- 'null'
message:
type: string
meta:
$ref: '#/components/schemas/SgpBuildMeta'
reasonCode:
type: string
x-extensible-enum:
- ambiguous-combination
- bet-failure
- bet-failure-shape
- combined-odds-missing
- duplicate-selection
- leg-failure
- line-mismatch
- line-not-echoed
- line-unexpected
- line-unverifiable
- no-price
- no-sgm-combination
- not-placeable
- resp-code
- runner-odds-duplicate
- runner-odds-inconsistent
- runner-odds-missing
- single-duplicate
- single-missing
- single-odds-missing
success:
type: boolean
type: object
x-owls-required:
- success
- error
- message
- reasonCode
- code
- legs
- meta
SgpPrice:
description: The computed parlay price from a successful `buildSgp` call.
properties:
american:
format: double
type: number
decimal:
format: double
type: number
isSGM:
description: 'Always `true` on a 200: the price is FanDuel''s correlated same-game price
for exactly the legs sent.'
type: boolean
legs:
format: double
type: number
type: object
x-owls-required:
- american
- decimal
- isSGM
- legs
SgpBuildParams:
description: Params for `buildSgp`.
properties:
book:
description: 'Sportsbook to price the parlay against: `"fanduel"`, `"draftkings"` or
`"hardrock"`. Any other value is a 400 with code `SGP_BOOK_UNSUPPORTED`
listing `supportedBooks`.'
type: string
eventId:
description: Pass as a string. Use `String(event.eventId)` when sourced from `getSgpEvents`.
type: string
legs:
description: Between 2 and 12 legs.
items:
$ref: '#/components/schemas/SgpLeg'
type: array
type: object
x-owls-required:
- eventId
- book
- legs
SgpLeg:
anyOf:
- properties:
selection:
type: string
type:
type: string
x-extensible-enum:
- moneyline
type: object
x-owls-required:
- type
- selection
- properties:
point:
format: double
type: number
selection:
type: string
type:
type: string
x-extensible-enum:
- spread
type: object
x-owls-required:
- type
- selection
- point
- properties:
point:
format: double
type: number
selection:
type: string
x-extensible-enum:
- over
- under
type:
type: string
x-extensible-enum:
- total
type: object
x-owls-required:
- type
- selection
- point
- properties:
category:
description: "Player-prop categories differ per sport (full lists at\nhttps://owlsinsight.com/docs#sub-sgp):\n- MLB: `strikeouts` [ks], `hits`, `total-bases` [tb], `home-runs` [hr],\n `rbis` [rbi], `runs`, `stolen-bases` [sb, steals], `singles`,\n `doubles`, `triples`, `hits-runs-rbis`.\n- WNBA: `points`, `rebounds` verified; `assists`, `threes`, `steals`,\n `blocks` accepted but not verified, so a leg may be refused.\n- NBA: `points`, `rebounds`, `assists`, `threes`, `steals`, `blocks`,\n all accepted but not verified.\n- NFL, NCAAF, NHL, NCAAB, soccer, tennis: no player props. The leg is\n refused (422) naming the category you sent and, for a betting-name\n alias, the props category it stands for, e.g.\n `'anytime_touchdown' (touchdowns)`."
type: string
line:
description: 'The half-point below the threshold: `0.5` = 1 or more, `1.5` = 2 or
more. `total-bases` has no 1+ market, so its lowest line is `1.5`.'
format: double
type: number
player:
description: 'Full player name. A partial name is accepted but 422s if it matches
more than one player on the slate (e.g. "Ramirez").'
type: string
side:
description: 'On MLB, only `strikeouts` accepts `"under"`: the batter categories are
FanDuel "N or more" markets and so are over-only. NBA/WNBA legs take
either side of the full-game line.'
type: string
x-extensible-enum:
- over
- under
type:
type: string
x-extensible-enum:
- player_prop
type: object
x-owls-required:
- type
- player
- category
- side
- line
description: A single leg in a Same Game Parlay build request.
securitySchemes:
bearerAuth:
description: Your Owls Insight API key.
scheme: bearer
type: http
x-owls-v2-books:
- book: 4casters
sports:
- cfl
- esports
- mlb
- mma
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- tennis
- wnba
wsEvent: 4casters-v2-update
- book: 888sport
sports:
- mlb
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- tennis
- wnba
wsEvent: null
- book: ballybet
sports:
- aussie-rules
- boxing
- cricket
- cycling
- darts
- formula1
- golf
- handball
- mlb
- mma
- motorsport
- nba
- ncaab
- ncaaf
- nfl
- nhl
- rugby-league
- rugby-union
- snooker
- soccer
- specials
- surfing
- table-tennis
- tennis
- wnba
wsEvent: ballybet-v2-update
- book: bet105
sports:
- alpine-skiing
- archery
- athletics
- aussie-rules
- badminton
- bandy
- baseball
- basketball
- basketball-3x3
- biathlon
- bowls
- boxing
- cfl
- chess
- cricket
- curling
- cycling
- darts
- esports
- fencing
- field-hockey
- floorball
- football
- formula1
- futsal
- gaelic-sports
- golf
- greyhounds
- handball
- hockey
- horse-racing
- hurling
- judo
- kabaddi
- kbo
- lacrosse
- mlb
- mma
- motorbikes
- motorsport
- nascar
- nba
- ncaab
- ncaaf
- netball
- nfl
- nhl
- npb
- olympics
- padel
- pool
- rugby-league
- rugby-union
- sailing
- ski-jumping
- snooker
- soccer
- softball
- speedway
- squash
- sumo
- supercars
- surfing
- table-tennis
- taekwondo
- tennis
- triathlon
- trotting
- ultimate
- volleyball
- water-polo
- wnba
wsEvent: bet105-v2-update
- book: bet365
sports:
- mlb
- nba
- nfl
- nhl
- soccer
wsEvent: bet365-v2-update
- book: betonline
sports:
- mlb
- nba
- ncaaf
- nfl
- nhl
- soccer
- tennis
wsEvent: betonline-realtime
- book: betrivers
sports:
- aussie-rules
- boxing
- cricket
- cycling
- darts
- formula1
- golf
- handball
- mlb
- mma
- motorsport
- nba
- ncaab
- ncaaf
- nfl
- nhl
- rugby-league
- rugby-union
- snooker
- soccer
- specials
- surfing
- table-tennis
- tennis
- wnba
wsEvent: betrivers-v2-update
- book: betus
sports:
- alpine-skiing
- archery
- athletics
- aussie-rules
- badminton
- bandy
- baseball
- basketball
- basketball-3x3
- biathlon
- bowls
- boxing
- cfl
- chess
- cricket
- curling
- cycling
- darts
- esports
- fencing
- field-hockey
- floorball
- football
- formula1
- futsal
- gaelic-sports
- golf
- greyhounds
- handball
- hockey
- horse-racing
- hurling
- judo
- kabaddi
- kbo
- lacrosse
- mlb
- mma
- motorbikes
- motorsport
- nascar
- nba
- ncaab
- ncaaf
- netball
- nfl
- nhl
- npb
- olympics
- padel
- pool
- rugby-league
- rugby-union
- sailing
- ski-jumping
- snooker
- soccer
- softball
- speedway
- squash
- sumo
- supercars
- surfing
- table-tennis
- taekwondo
- tennis
- triathlon
- trotting
- ultimate
- volleyball
- water-polo
- wnba
wsEvent: betus-v2-update
- book: bookmaker
sports:
- alternative-sports
- aussie-rules
- baseball
- basketball
- boxing
- cricket
- darts
- e-gaming
- entertainment
- esports
- football
- futsal
- futures
- golf
- ice-hockey
- mma
- motorsport
- politics
- rugby
- soccer
- surfing
- table-tennis
- tennis
wsEvent: null
- book: bovada
sports:
- mlb
- mma
- nba
- ncaab
- ncaaf
- nfl
- nhl
wsEvent: null
- book: draftkings
sports:
- mlb
- mma
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- wnba
wsEvent: draftkings-v2-update
- book: fanaticsmarkets
sports:
- boxing
- cs2
- dota2
- golf
- lol
- mlb
- mma
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- tennis
- valorant
- wnba
wsEvent: fanaticsmarkets-v2-update
- book: fanduel
sports:
- mlb
- mma
- nba
- ncaaf
- nfl
- nhl
- soccer
- tennis
- wnba
wsEvent: fanduel-v2-update
- book: hardrock
sports:
- AMERICAN_FOOTBALL
- AUSSIE_RULES
- BASEBALL
- BASKETBALL
- BOXING
- CRICKET
- DARTS
- HANDBALL
- ICE_HOCKEY
- MMA
- RUGBY
- SNOOKER
- SOCCER
- TABLE_TENNIS
- TENNIS
- VOLLEYBALL
wsEvent: null
- book: kalshi
sports:
- cs2
- dota2
- lol
- mlb
- mma
- nba
- ncaaf
- nfl
- nhl
- overwatch
- pubg
- rainbow6
- rocketleague
- soccer
- tennis
- valorant
- wnba
wsEvent: kalshi-v2-update
- book: lowvig
sports:
- boxing
- cricket
- darts
- golf
- mlb
- mma
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- table-tennis
- tennis
- wnba
wsEvent: lowvig-v2-update
- book: mybookie
sports:
- mlb
- nba
wsEvent: mybookie-v2-update
- book: novig
sports:
- mlb
- nba
- ncaab
- ncaaf
- nfl
- nhl
wsEvent: null
- book: pinnacle
sports:
- esports
- handball
- mlb
- mma
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- tennis
- wnba
wsEvent: pinnacle-v2-update
- book: polymarket
sports:
- cs2
- dota2
- lol
- mlb
- mma
- nba
- ncaaf
- nfl
- nhl
- overwatch
- pubg
- rainbow6
- rocketleague
- soccer
- tennis
- valorant
- wnba
wsEvent: polymarket-v2-update
- book: propbuilder
sports:
- mlb
- nba
- ncaaf
- nfl
- nhl
- wnba
wsEvent: propbuilder-v2-update
- book: stake
sports:
- baseball
- basketball
- cs2
- ice-hockey
- mma
- soccer
- table-tennis
- tennis
wsEvent: null
- book: thescore
sports:
- mlb
- nba
- ncaaf
- nfl
- nhl
- soccer
- tennis
wsEvent: null
- book: thunderpick
sports:
- american-football
- baseball
- basketball
- cs2
- dota2
- lol
- soccer
- tennis
- valorant
wsEvent: thunderpick-v2-update
- book: tippmixpro
sports:
- boxing
- cs2
- dota2
- lol
- mlb
- mma
- nba
- ncaab
- ncaaf
- nfl
- nhl
- soccer
- tennis
- valorant
wsEvent: tippmixpro-v2-update
- book: underdog
sports:
- cs2
- kbo
- lol
- mlb
- mma
- nba
- ncaaf
- nfl
- nhl
- npb
- pga
- soccer
- tennis
- valorant
- wnba
wsEvent: null
- book: versus
sports:
- afl
- badminton
- basketball
- boxing
- cricket
- darts
- esports
- golf
- handball
- mlb
- mma
- nfl
- nhl
- padel
- soccer
- table-tennis
- tennis
- volleyball
wsEvent: versus-v2-update