{"openapi":"3.1.0","info":{"title":"LiveFeed API - Client Integration API","version":"0.1.0","description":"Prematch, live and asset API for sports feed distribution. Live push is exposed via SSE at /api/v1/live/stream and WebSocket at /api/v1/live/ws. Client entitlements can restrict modules, sports, leagues, nations and market depth. Packages cover small SaaS, diretta/live score, limited sportsbook, full sportsbook, Cricket Pro and Horse Racing Pro. Trading controls can open/close events, close only specific market groups, assign market levels by sport/nation/league/team and apply sportsbook margin/odds adjustments. The optional BetBuilder module filters incompatible same-event selections, supports exclusive odds bands and refuses unsafe independent pricing for correlated legs. Provider connections and polling are cached and shared server-side."},"servers":[{"url":"https://livefeedapi.com"}],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"},"BearerAuth":{"type":"http","scheme":"bearer"},"CookieAuth":{"type":"apiKey","in":"cookie","name":"sfh_session"},"BetfairClosure":{"type":"object","properties":{"open":{"type":"boolean"},"suspended":{"type":"boolean"},"closed":{"type":"boolean"},"settled":{"type":"boolean"}}},"BetfairRunner":{"type":"object","properties":{"selectionId":{"type":["string","null"]},"name":{"type":["string","null"]},"status":{"type":"string"},"odds":{"type":["number","null"],"description":"Sportsbook decimal odds when available."},"availableToBack":{"type":"array","items":{"type":"object"}},"availableToLay":{"type":"array","items":{"type":"object"}},"settlement":{"type":"string","enum":["PENDING","WON","LOST","VOID","PUSH","HALF_WON","HALF_LOST"]}}},"BetfairMarket":{"type":"object","properties":{"marketId":{"type":["string","null"]},"name":{"type":["string","null"]},"type":{"type":["string","null"]},"product":{"type":"string","enum":["sportsbook","exchange"]},"status":{"type":"string","enum":["OPEN","SUSPENDED","CLOSED","CANCELLED","UNKNOWN"]},"closure":{"$ref":"#/components/schemas/BetfairClosure"},"runners":{"type":"array","items":{"$ref":"#/components/schemas/BetfairRunner"}}}}},"schemas":{"BetBuilderSelection":{"type":"object","required":["selectionId","marketKey","odds"],"properties":{"selectionId":{"type":"string"},"betradarId":{"type":"string","description":"Preferred same-event matching identifier."},"eventId":{"type":"string"},"sportId":{"type":["integer","string"]},"marketKey":{"type":"string"},"marketFamily":{"type":"string","description":"Optional normalized family, for example total, handicap, goalscorer or match_result."},"outcomeId":{"type":"string"},"outcome":{"type":"string"},"side":{"type":"string","examples":["over","under","home","away"]},"line":{"type":["number","null"]},"rangeMin":{"type":["number","null"]},"rangeMax":{"type":["number","null"]},"participantId":{"type":"string","description":"Player/team identifier for player and participant props."},"period":{"type":"string"},"odds":{"type":"number","minimum":1.01},"conflictsWith":{"type":"array","items":{"type":"string"},"description":"Optional provider-declared incompatible selection IDs."}}},"CricketPlayer":{"type":"object","properties":{"playerId":{"type":["string","null"],"description":"Provider player identifier when available."},"name":{"type":["string","null"]},"role":{"type":["string","null"]},"dismissal":{"type":["string","null"]},"batting":{"type":"object","properties":{"runs":{"type":["number","null"]},"balls":{"type":["number","null"]},"minutes":{"type":["number","null"]},"fours":{"type":["number","null"]},"sixes":{"type":["number","null"]},"strikeRate":{"type":["number","null"]}}},"bowling":{"type":"object","properties":{"overs":{"type":["number","null"]},"maidens":{"type":["number","null"]},"wickets":{"type":["number","null"]},"economyRate":{"type":["number","null"]}}}}},"CricketScorecardInnings":{"type":"object","properties":{"innings":{"type":["string","null"]},"players":{"type":"array","items":{"$ref":"#/components/schemas/CricketPlayer"}}}},"CricketInningsTotal":{"type":"object","properties":{"innings":{"type":["string","null"]},"extras":{"type":["number","null"]},"extrasText":{"type":["string","null"]},"overs":{"type":["string","number","null"]},"total":{"type":["string","null"]}}},"CricketDetailedResult":{"type":"object","properties":{"eventId":{"type":"string"},"betradarId":{"type":"string","description":"Official BetRadar ID or stable LiveFeed fallback for unmapped Cricket results."},"officialBetradarId":{"type":["string","null"],"description":"Official BetRadar ID only."},"idSource":{"type":"string","enum":["betradar","livefeedapi"]},"phase":{"type":"string","enum":["ENDED"]},"scorecard":{"type":"array","items":{"$ref":"#/components/schemas/CricketScorecardInnings"}},"inningsTotals":{"type":"array","items":{"$ref":"#/components/schemas/CricketInningsTotal"}},"wickets":{"type":"array","items":{"type":"object"}},"ballByBall":{"type":"array","items":{"type":"object"}},"lineups":{"type":"object"},"detailCoverage":{"type":"object"},"closure":{"type":"object"},"settlement":{"type":"object"}}}}},"paths":{"/health":{"get":{"summary":"Service health and live ingestion status","security":[],"responses":{"200":{"description":"Service is reachable"}},"x-livefeed-public":true}},"/api/v1/tracker/events":{"get":{"summary":"List live events available for Match Tracker","description":"Returns recent live events allowed for the authenticated client, formatted for widget selection.","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"CookieAuth":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20}},{"name":"sportId","in":"query","schema":{"type":"number","enum":[1,2,5]},"description":"Optional sport filter: 1 football/soccer, 2 basketball, 5 tennis."}],"responses":{"200":{"description":"Tracker event summaries"},"401":{"description":"Missing or invalid API key/session"},"403":{"description":"Missing live module or live scope"}},"x-livefeed-public":true}},"/api/v1/tracker/state":{"get":{"summary":"Match Tracker visual state","description":"Builds the visual tracker state for football/soccer, basketball or tennis: scoreboard, visual surface, ball position, pressure, control metrics, action map, timeline and book risk indicators.","security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"CookieAuth":[]}],"parameters":[{"name":"betradarId","in":"query","schema":{"type":"string"}},{"name":"providerEventId","in":"query","schema":{"type":"string"}},{"name":"sportId","in":"query","schema":{"type":"number","enum":[1,2,5]},"description":"Use 1 for football/soccer, 2 for basketball, 5 for tennis. If no real event is available, data is null and no synthetic event is generated."},{"name":"sport","in":"query","schema":{"type":"string","enum":["calcio","basket","tennis","soccer","basketball"]}}],"responses":{"200":{"description":"Tracker visual state"},"401":{"description":"Missing or invalid API key/session"},"403":{"description":"Missing live module or live scope"}},"x-livefeed-public":true}},"/api/v1/prematch/matches":{"get":{"summary":"List prematch matches","parameters":[{"name":"sportId","in":"query","schema":{"type":"number"}},{"name":"leagueId","in":"query","schema":{"type":"number"}},{"name":"nation","in":"query","schema":{"type":"string"}},{"name":"team","in":"query","schema":{"type":"string"}},{"name":"from","in":"query","schema":{"type":"string"}},{"name":"to","in":"query","schema":{"type":"string"}},{"name":"mappedOnly","in":"query","schema":{"type":"boolean"}},{"name":"includeMarkets","in":"query","schema":{"type":"boolean"}},{"name":"limit","in":"query","schema":{"type":"integer","default":50}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Prematch matches"}},"x-livefeed-public":true}},"/api/v1/prematch/collections":{"get":{"summary":"List prematch database collections","responses":{"200":{"description":"Collection names"}},"x-livefeed-public":true}},"/api/v1/prematch/betradar/{betradarId}":{"get":{"summary":"Find prematch records by BetRadar ID","parameters":[{"name":"betradarId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Matching prematch records"}},"x-livefeed-public":true}},"/api/v1/results/live":{"get":{"summary":"GDA Live result and event closure","description":"Requires the results module and results:read. Accepts up to ten comma-separated IDs and always returns an explicit PENDING record until a provider confirms the final report. Confirmed Live results are persisted across restarts. If the Live event has a verified prematch identity, available prematch market settlements are included with explicit coverage. Football records can include footballReport, stats.hitWoodwork and settlement.statisticalMarkets.hitWoodwork. Woodwork markets are settled only at a terminal state with complete home and away values; missing values remain null and never mean zero.","parameters":[{"name":"betradarId","in":"query","description":"Preferred canonical match key.","schema":{"type":"string"}},{"name":"eventId","in":"query","description":"GDA provider event ID fallback.","schema":{"type":"string"}}],"responses":{"200":{"description":"Normalized Live results and closure state"},"400":{"description":"An event identifier is required"},"403":{"description":"Results module not enabled"}},"x-livefeed-public":true}},"/api/v1/results/prematch":{"get":{"summary":"GDA Prematch settlement results","description":"Reads manual_results first and settled second. Historical provider events without a verified BetRadar link retain betradarId=null instead of receiving an invented mapping. Event closure and result do not imply full market coverage: clients must inspect settlement.markets and each market coverage before settling selections. Football records can include footballReport, stats.hitWoodwork and settlement.statisticalMarkets.hitWoodwork. Woodwork markets are settled only at a terminal state with complete home and away values; missing values remain null and never mean zero.","parameters":[{"name":"betradarId","in":"query","description":"Preferred canonical match key.","schema":{"type":"string"}},{"name":"eventId","in":"query","description":"Prematch provider event ID fallback.","schema":{"type":"string"}}],"responses":{"200":{"description":"Normalized event and market settlements"},"400":{"description":"An event identifier is required"},"403":{"description":"Results module not enabled"}},"x-livefeed-public":true}},"/api/v1/exchange/status":{"get":{"summary":"Live/Prematch Exchange connector status","description":"Combined BetAPI connector and GDA pricing readiness. Requires exchange:read and either an Exchange module or rubikode-live-pricing.","responses":{"200":{"description":"Connector status"},"403":{"description":"Exchange module not enabled"}},"x-livefeed-public":true}},"/api/v1/exchange/live/events":{"get":{"summary":"GDA Live Exchange events","description":"GDA-owned Live Exchange feed with runner-specific Back/Lay prices, Exchange tick ladder and estimated capacity. BetAPI is read once only as a locked calibration seed and does not continuously supply prices.","parameters":[{"name":"sportId","in":"query","schema":{"type":"integer"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Live Exchange event list"},"403":{"description":"exchange-live module required"}},"x-livefeed-public":true}},"/api/v1/exchange/prematch/events":{"get":{"summary":"GDA Prematch Exchange events","description":"Prematch Exchange generated from GDA prematch odds after sportsbook margin removal. Supports two-way and three-way markets with runner-specific Back/Lay books and estimated capacity.","parameters":[{"name":"sportId","in":"query","schema":{"type":"integer"}},{"name":"day","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Prematch Exchange event list"},"403":{"description":"exchange-prematch module required"}},"x-livefeed-public":true}},"/api/v1/exchange/live/event":{"get":{"summary":"Live Exchange event markets","parameters":[{"name":"eventId","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Live Back/Lay markets"},"403":{"description":"exchange-live module required"}},"x-livefeed-public":true}},"/api/v1/exchange/prematch/event":{"get":{"summary":"GDA Prematch Exchange event markets","parameters":[{"name":"eventId","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Prematch Back/Lay markets"},"403":{"description":"exchange-prematch module required"}},"x-livefeed-public":true}},"/api/v1/exchange/timeline":{"get":{"summary":"Exchange event timeline","parameters":[{"name":"eventId","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Provider timeline"},"403":{"description":"Live or Prematch Exchange module required"}},"x-livefeed-public":true}},"/api/v1/exchange/results":{"get":{"summary":"Exchange results and settlement support","description":"Accepts up to ten comma-separated IDs. Live GDA IDs are resolved by betradarId and translated from a matched BetAPI reference when available; prematch BetAPI IDs are queried directly. Event results are combined with Exchange market closure and WON/LOST runner settlement. Every requested ID is returned, with settlement.status=PENDING until a final result is confirmed.","parameters":[{"name":"eventId","in":"query","required":true,"description":"One to ten comma-separated GDA betradarId or BetAPI event IDs.","schema":{"type":"string"}}],"responses":{"200":{"description":"Normalized results, including explicit pending records"},"403":{"description":"exchange-results module required"}},"x-livefeed-public":true}},"/api/v1/horse-racing/status":{"get":{"summary":"Horse Racing Pro connector and shared collection status","description":"Requires horse-racing:read and at least one Horse Racing commercial module. Provider credentials are never exposed.","responses":{"200":{"description":"Horse Racing service status"},"403":{"description":"Horse Racing module required"}},"x-livefeed-public":true}},"/api/v1/horse-racing/prematch":{"get":{"summary":"Horse Racing prematch schedule","description":"Returns normalized race meetings and start times for sportId 2. Provider collection is shared across all customers.","parameters":[{"name":"day","in":"query","description":"Date in YYYYMMDD format.","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":1}}],"responses":{"200":{"description":"Normalized prematch races"},"403":{"description":"horse-racing-prematch module required"}},"x-livefeed-public":true}},"/api/v1/horse-racing/live":{"get":{"summary":"Horse Racing live races","description":"Returns the current in-play race list with closure state and provider IDs for racecard retrieval.","responses":{"200":{"description":"Normalized live races"},"403":{"description":"horse-racing-live module required"}},"x-livefeed-public":true}},"/api/v1/horse-racing/stream":{"get":{"summary":"Horse Racing live SSE push","description":"Persistent stream backed by one shared upstream collector. Emits status, snapshot, horse_racing_live, horse_racing_closed, horse_racing_settlement and heartbeat events. Closure and settlement messages use eventId/providerEventId; betradarId is not required.","parameters":[{"name":"snapshotLimit","in":"query","schema":{"type":"integer","minimum":0,"maximum":100,"default":25}}],"responses":{"200":{"description":"Server-Sent Events stream"},"403":{"description":"horse-racing-live module required"}},"x-livefeed-public":true}},"/api/v1/horse-racing/race":{"get":{"summary":"Horse Racing racecard, runners and odds","description":"Normalizes runners, cloth/draw, jockey, trainer, form, weight, official Win/Place live markets and a mathematically derived Odd/Even winning-cloth market when all required prices are available. phase=result returns closure and settlement using the same providerEventId.","parameters":[{"name":"providerEventId","in":"query","required":true,"schema":{"type":"string"}},{"name":"phase","in":"query","schema":{"type":"string","enum":["prematch","live","result"],"default":"prematch"}}],"responses":{"200":{"description":"Normalized racecard"},"400":{"description":"providerEventId missing"},"403":{"description":"Horse Racing phase module required"}},"x-livefeed-public":true}},"/api/v1/horse-racing/results":{"get":{"summary":"Horse Racing ended races and result detail","description":"Without an ID, returns ended races already enriched with providerEventId, runners, reported positions, winner, placed runners, closure and marketSettlements. With eventId or providerEventId, returns one result. betradarId is never required. Odd/Even is settled from the winning cloth-number parity; Place/Each Way still requires race-specific terms.","parameters":[{"name":"day","in":"query","description":"Date in YYYYMMDD format.","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":1}},{"name":"includeDetails","in":"query","description":"Defaults to true. Set false only for a fast summary list.","schema":{"type":"boolean","default":true}},{"name":"eventId","in":"query","description":"Stable LiveFeed event ID from the ended list.","schema":{"type":"string"}},{"name":"providerEventId","in":"query","description":"Native race ID when already known.","schema":{"type":"string"}}],"responses":{"200":{"description":"Ended races or normalized finishing order"},"403":{"description":"horse-racing-results module required"}},"x-livefeed-public":true}},"/api/v1/cricket/status":{"get":{"summary":"Cricket provider and shared cache status","description":"Requires the cricket module and cricket:read scope. Provider credentials are never exposed.","responses":{"200":{"description":"Cricket connector status"},"403":{"description":"cricket module required"}},"x-livefeed-public":true}},"/api/v1/cricket/feed/status":{"get":{"summary":"Cricket Pro hybrid feed status","description":"Shows source priority, shared polling health and the most recent realtime refresh. Available to clients with at least one Cricket Pro module.","responses":{"200":{"description":"Cricket Pro service status"},"403":{"description":"A Cricket Pro module is required"}},"x-livefeed-public":true}},"/api/v1/cricket/feed/prematch":{"get":{"summary":"Unified Cricket Pro prematch fixtures","description":"Returns the union of API-Cricket and EntitySport fixtures. Canonical event time priority is EntitySport, verified GDA prematch mapping, then API-Cricket. Stable event IDs and all source IDs are retained.","parameters":[{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date"}},{"name":"leagueId","in":"query","schema":{"type":"string"}},{"name":"eventId","in":"query","description":"Provider event ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"Normalized unified Cricket prematch fixtures"},"403":{"description":"cricket-prematch module required"}},"x-livefeed-public":true}},"/api/v1/cricket/feed/odds":{"get":{"summary":"Cricket Pro prematch odds","description":"Returns normalized bookmaker markets from API-Cricket linked to the stable Cricket Pro event ID and BetRadar mapping when available.","parameters":[{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date"}},{"name":"leagueId","in":"query","schema":{"type":"string"}},{"name":"eventId","in":"query","description":"API-Cricket event ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"Normalized Cricket markets and selections"},"403":{"description":"cricket-odds module required"}},"x-livefeed-public":true}},"/api/v1/cricket/feed/live":{"get":{"summary":"Cricket Pro realtime live snapshot","description":"EntitySport is the realtime primary source. API-Cricket is used as an automatic fallback. The response includes score, innings, game state, scorecard and source health.","parameters":[{"name":"leagueId","in":"query","schema":{"type":"string"}},{"name":"eventId","in":"query","description":"Provider event ID.","schema":{"type":"string"}}],"responses":{"200":{"description":"Merged Cricket live snapshot"},"403":{"description":"cricket-live module required"}},"x-livefeed-public":true}},"/api/v1/cricket/feed/stream":{"get":{"summary":"Cricket Pro realtime SSE stream","description":"Persistent push connection backed by one shared upstream poller. Emits `status`, `snapshot`, `cricket_live` and heartbeat events. Send the API key using `x-api-key`, Bearer authorization or the `apiKey` query parameter for browser EventSource clients.","parameters":[{"name":"snapshotLimit","in":"query","schema":{"type":"integer","default":25,"minimum":1,"maximum":100}}],"responses":{"200":{"description":"Server-Sent Events stream"},"403":{"description":"cricket-live module required"}},"x-livefeed-public":true}},"/api/v1/cricket/feed/results":{"get":{"summary":"Cricket Pro verified results","description":"Uses EntitySport verified results as primary and marks API-Cricket fallback records explicitly. Every result has betradarId: an official ID when available or a stable LiveFeed fallback identified by idSource=livefeedapi. Event-level settlement is exposed; individual special-market settlement requires the applicable customer market rules.","parameters":[{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date"}},{"name":"eventId","in":"query","description":"Provider event ID.","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"verifiedOnly","in":"query","schema":{"type":"boolean","default":true}},{"name":"includeDetails","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Normalized Cricket results and settlement state. With includeDetails=true, includes players and per-innings scorecard data when supplied by the provider.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CricketDetailedResult"}},"meta":{"type":"object"}}}}}},"403":{"description":"cricket-results module required"}},"x-livefeed-public":true}},"/api/v1/cricket/leagues":{"get":{"summary":"Cricket competitions","description":"Returns the Cricket competitions covered by the active provider subscription.","responses":{"200":{"description":"Normalized Cricket competitions"},"403":{"description":"cricket module required"}},"x-livefeed-public":true}},"/api/v1/cricket/events":{"get":{"summary":"Cricket prematch events and completed results","description":"Returns normalized Cricket fixtures and results. Matched events retain the canonical BetRadar ID from the GDA prematch database.","parameters":[{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date"}},{"name":"leagueId","in":"query","schema":{"type":"string"}},{"name":"eventId","in":"query","description":"API Cricket event ID.","schema":{"type":"string"}},{"name":"includeDetails","in":"query","description":"Includes scorecard, ball-by-ball, wickets, innings totals and lineups.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Normalized Cricket fixtures and results"},"403":{"description":"cricket module required"}},"x-livefeed-public":true}},"/api/v1/cricket/live":{"get":{"summary":"Cricket livescore, scorecard and ball-by-ball","description":"Returns current Cricket matches with normalized innings, player scorecards, ball-by-ball comments, wickets and settlement readiness.","parameters":[{"name":"leagueId","in":"query","schema":{"type":"string"}},{"name":"eventId","in":"query","description":"API Cricket event ID.","schema":{"type":"string"}},{"name":"includeDetails","in":"query","schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Normalized live Cricket data"},"403":{"description":"cricket module required"}},"x-livefeed-public":true}},"/api/v1/cricket/closures":{"get":{"summary":"Verified Cricket closures and event results","description":"EntitySport verification source. Completed, abandoned, no-result and cancelled matches remain pending until verified=true. Per-market settlement still requires the applicable market rules.","parameters":[{"name":"status","in":"query","description":"EntitySport match status. Omit to request both completed (2) and terminal exceptional states (4).","schema":{"type":"integer","enum":[2,4]}},{"name":"verifiedOnly","in":"query","schema":{"type":"boolean","default":true}},{"name":"perPage","in":"query","schema":{"type":"integer","default":20,"maximum":100}},{"name":"page","in":"query","schema":{"type":"integer","default":1}}],"responses":{"200":{"description":"Normalized verified Cricket closures"},"403":{"description":"cricket module required"}},"x-livefeed-public":true}},"/api/v1/cricket/closures/{entitySportMatchId}":{"get":{"summary":"EntitySport Cricket closure detail","description":"Returns status, verification state, result type, winning team, scores, DLS information and normalized settlement state.","parameters":[{"name":"entitySportMatchId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Normalized Cricket closure detail"},"403":{"description":"cricket module required"}},"x-livefeed-public":true}},"/api/v1/live/status":{"get":{"summary":"Live WebSocket ingestion status","responses":{"200":{"description":"Live status"}},"x-livefeed-public":true}},"/api/v1/unified/status":{"get":{"summary":"Unified Delivery status","description":"Standard transport for every authenticated customer. Payloads remain filtered by the customer's existing package, modules, sports, leagues, nations and market depth.","responses":{"200":{"description":"Unified transport health, sequence and retention status"},"401":{"description":"Missing or invalid API key"}},"x-livefeed-public":true}},"/api/v1/unified/uof-compatibility":{"get":{"summary":"UOF Compatibility connection profile","description":"Returns the authenticated customer's AMQP host, port, bookmaker ID, vhost, exchange and API host. The messaging password and x-access-token are the customer's personal API key.","responses":{"200":{"description":"UOF connection profile and gateway health"},"401":{"description":"Missing or invalid API key"}},"x-livefeed-public":true}},"/v1/users/whoami.xml":{"get":{"summary":"UOF-compatible bookmaker details","description":"XML endpoint used by UOF consumers during startup. Authenticate with x-access-token set to the LiveFeedAPI customer API key.","responses":{"200":{"description":"UOF bookmaker_details XML"},"401":{"description":"Invalid x-access-token"}},"x-livefeed-public":true}},"/v1/descriptions/producers.xml":{"get":{"summary":"UOF-compatible producer catalogue","description":"Returns Live, Prematch and Premium Cricket producer definitions in XML.","responses":{"200":{"description":"UOF producers XML"},"401":{"description":"Invalid x-access-token"}},"x-livefeed-public":true}},"/v1/descriptions/{language}/markets.xml":{"get":{"summary":"UOF-compatible market descriptions","description":"Dynamic market and outcome catalogue generated only from markets distributed to the authenticated customer.","parameters":[{"name":"language","in":"path","required":true,"schema":{"type":"string","default":"en"}}],"responses":{"200":{"description":"UOF market_descriptions XML"},"401":{"description":"Invalid x-access-token"}},"x-livefeed-public":true}},"/api/v1/unified/snapshot":{"get":{"summary":"Entitlement-filtered unified snapshot","description":"Returns the enabled Prematch, Live and Cricket products in one message contract. This JSON transport is UOF-inspired but is not a drop-in AMQP/XML UOF endpoint.","parameters":[{"name":"products","in":"query","description":"Comma-separated values: prematch, live, cricket-prematch, cricket-live.","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500}},{"name":"sportId","in":"query","schema":{"type":"integer"}},{"name":"leagueId","in":"query","schema":{"type":"integer"}},{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Current unified snapshot and entitlement metadata"},"401":{"description":"Missing or invalid API key"}},"x-livefeed-public":true}},"/api/v1/unified/recovery":{"get":{"summary":"Recover missed unified messages","description":"Returns retained messages after the supplied sequence. When resyncRequired is true, discard local state and load a fresh snapshot.","parameters":[{"name":"afterSequence","in":"query","schema":{"type":"integer","minimum":0,"default":0}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":5000,"default":1000}}],"responses":{"200":{"description":"Entitlement-filtered recovery messages and cursor metadata"},"401":{"description":"Missing or invalid API key"}},"x-livefeed-public":true}},"/api/v1/unified/stream":{"get":{"summary":"Unified realtime SSE stream","description":"Emits fixture_change, odds_change, bet_stop, bet_settlement, rollback, cancellation, alive and snapshot_complete messages. Content follows the customer's existing entitlements.","parameters":[{"name":"afterSequence","in":"query","schema":{"type":"integer","minimum":0,"default":0}},{"name":"recoveryLimit","in":"query","schema":{"type":"integer","minimum":1,"maximum":5000,"default":1000}},{"name":"apiKey","in":"query","description":"For EventSource clients that cannot set headers.","schema":{"type":"string"}}],"responses":{"200":{"description":"SSE unified message stream","content":{"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"Missing or invalid API key"}},"x-livefeed-public":true}},"/api/v1/live/events":{"get":{"summary":"Recent live snapshots","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50}},{"name":"includeRaw","in":"query","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Recent live records"}},"x-livefeed-public":true}},"/api/v1/live/stream":{"get":{"summary":"Live push stream via Server-Sent Events","description":"Requires `live:stream` scope. Emits `status`, `snapshot` and `live` events. API key can be sent as `x-api-key`, bearer token or `apiKey` query parameter for browser EventSource clients.","parameters":[{"name":"snapshotLimit","in":"query","schema":{"type":"integer","default":25}},{"name":"includeRaw","in":"query","schema":{"type":"boolean","default":false}},{"name":"apiKey","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"SSE stream","content":{"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"Missing or invalid API key"},"403":{"description":"Missing live:stream scope"},"429":{"description":"Rate limit exceeded"}},"x-livefeed-public":true}},"/api/v1/live/betradar/{betradarId}":{"get":{"summary":"Find live snapshot by BetRadar ID","parameters":[{"name":"betradarId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Live snapshot"}},"x-livefeed-public":true}},"/api/v1/live/provider/{providerEventId}":{"get":{"summary":"Find live snapshot by provider event ID","parameters":[{"name":"providerEventId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Live snapshot"}},"x-livefeed-public":true}},"/api/v1/matches/betradar/{betradarId}":{"get":{"summary":"Combined prematch and live view by BetRadar ID","parameters":[{"name":"betradarId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Combined match"}},"x-livefeed-public":true}},"/api/v1/taxonomy/leagues":{"get":{"summary":"List leagues","parameters":[{"name":"sportId","in":"query","schema":{"type":"number"}},{"name":"nationId","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","default":500}}],"responses":{"200":{"description":"Leagues"}},"x-livefeed-public":true}},"/api/v1/taxonomy/nations":{"get":{"summary":"List nations with flag URLs","parameters":[{"name":"sportId","in":"query","schema":{"type":"number"}},{"name":"code","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","default":500}}],"responses":{"200":{"description":"Nations"}},"x-livefeed-public":true}},"/api/v1/streaming/status":{"get":{"summary":"Streaming provider and playback status","description":"Operational state without credentials or secret player parameters.","responses":{"200":{"description":"Configured, ready, healthy, degraded or unavailable status"},"403":{"description":"Streaming module not enabled"}},"x-livefeed-public":true}},"/api/v1/streaming/events":{"get":{"summary":"List authorized streaming events","parameters":[{"name":"sport","in":"query","schema":{"type":"string"}},{"name":"online","in":"query","schema":{"type":"boolean"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500}}],"responses":{"200":{"description":"Normalized playable events"},"403":{"description":"Streaming module not enabled"}},"x-livefeed-public":true}},"/api/v1/streaming/player/{streamId}":{"get":{"summary":"Open an authorized streaming player","parameters":[{"name":"streamId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect to provider player"},"404":{"description":"Stream not available"}},"x-livefeed-public":true}},"/api/v1/football-data/status":{"get":{"summary":"Football player-data and predictions provider status","description":"Operational status of the supplemental football source. It is not primary for odds, live closures or settlement.","responses":{"200":{"description":"Provider and cache status"},"403":{"description":"Neither football-enrichment nor predictions module is enabled"}},"x-livefeed-public":true}},"/api/v1/football-data/reports/status":{"get":{"summary":"Supplemental football report provider status","description":"Reports configuration and health without exposing provider credentials. Requires football-enrichment or results.","responses":{"200":{"description":"Supplemental report provider status"},"403":{"description":"Required module not enabled"}},"x-livefeed-public":true}},"/api/v1/football-data/live":{"get":{"summary":"List football events covered by supplemental player data","description":"Compact covered-event list used for safe team/time matching. Requires football-enrichment.","responses":{"200":{"description":"Covered live events"},"403":{"description":"football-enrichment module not enabled"}},"x-livefeed-public":true}},"/api/v1/football-data/events/{providerEventId}":{"get":{"summary":"Football match player data and spatial enrichment","description":"Returns named goals, assists, cards, substitutions, lineups, player statistics, shotmap/xG, momentum, average positions and optional model prediction. Arena3D's external iframe is not redistributed; spatial inputs are suitable for the GDA tracker.","parameters":[{"name":"providerEventId","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Observed player and spatial data"},"403":{"description":"Required commercial module not enabled"},"404":{"description":"Provider event not found"}},"x-livefeed-public":true}},"/api/v1/football-data/predictions":{"get":{"summary":"Football model predictions","description":"Model probabilities for match result, expected goals, totals, BTTS, likely score, draw-no-bet and corners. These are not official odds or results.","parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"date_from","in":"query","schema":{"type":"string","format":"date"}},{"name":"date_to","in":"query","schema":{"type":"string","format":"date"}},{"name":"min_confidence","in":"query","schema":{"type":"number","minimum":0,"maximum":1}},{"name":"recommended","in":"query","schema":{"type":"boolean"}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":200}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Predictions marked MODEL_PREDICTION_NOT_OFFICIAL_ODDS_OR_RESULT"},"403":{"description":"predictions module not enabled"}},"x-livefeed-public":true}},"/api/v1/assets/flags":{"get":{"summary":"List available flag assets","description":"Requires `assets:read` and the commercial `flags` module.","responses":{"200":{"description":"Flags"},"403":{"description":"Missing flags module or scope"}},"x-livefeed-public":true}},"/api/v1/assets/flags/{code}":{"get":{"summary":"Get a flag image","description":"Requires `assets:read` and the commercial `flags` module.","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"WebP flag image"},"403":{"description":"Missing flags module or scope"}},"x-livefeed-public":true}},"/api/v1/assets/teams":{"get":{"summary":"List available team badge assets","description":"Returns team logos/scudetti from assets/teams. Requires `assets:read` and the commercial `team-assets` module.","responses":{"200":{"description":"Team badge assets"},"403":{"description":"Missing team-assets module or scope"}},"x-livefeed-public":true}},"/api/v1/assets/teams/{providerTeamId}":{"get":{"summary":"Get a team badge image","description":"Looks for a file named with the provider team id/key in assets/teams, supporting webp, png, svg, jpg and jpeg.","parameters":[{"name":"providerTeamId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Team badge image"},"403":{"description":"Missing team-assets module or scope"},"404":{"description":"Badge not found"}},"x-livefeed-public":true}},"/api/v1/betbuilder/config":{"get":{"summary":"Get the client's BetBuilder configuration","description":"Requires scope `betbuilder:read` and module `betbuilder`.","responses":{"200":{"description":"Limits, exclusive odds bands and pricing mode"},"403":{"description":"BetBuilder not enabled"}},"x-livefeed-public":true}},"/api/v1/betbuilder/filter":{"post":{"summary":"Filter candidate BetBuilder selections","description":"Call after every selection. Candidates that conflict by outcome, implied line, result band, explicit provider conflict or configured odds band are returned with `disabled: true` and reason codes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"selected":{"type":"array","items":{"$ref":"#/components/schemas/BetBuilderSelection"}},"candidates":{"type":"array","items":{"$ref":"#/components/schemas/BetBuilderSelection"}}}}}}},"responses":{"200":{"description":"Candidate availability and incompatibility reasons"},"403":{"description":"BetBuilder not enabled"}},"x-livefeed-public":true}},"/api/v1/betbuilder/quote":{"post":{"summary":"Validate and price a BetBuilder","description":"Returns independent multiplication only for selections from different events. Same-event combinations return `correlation_provider_required`; their reference product must not be offered as a final price.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["selections"],"properties":{"selections":{"type":"array","minItems":2,"maxItems":10,"items":{"$ref":"#/components/schemas/BetBuilderSelection"}}}}}}},"responses":{"200":{"description":"Validation, conflicts and pricing status"},"403":{"description":"BetBuilder not enabled"}},"x-livefeed-public":true}}}}