List a live game's line segments (manifest + position cursor).
const url = 'https://api.betflux.ai/v1/games/example/sportsbook-lines/segments';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.betflux.ai/v1/games/example/sportsbook-lines/segments \ --header 'Authorization: Bearer <token>'Until a game settles, its sportsbook-lines data is published as an append-only series of Parquet segments plus a current board (adr-0037). This route returns the manifest with a URL per segment; every segment URL carries ?rows= (the listed row count) — fetch listed URLs verbatim. The final artifact replaces all of it the moment it lands: once rows.parquet exists this route answers 404 with reason: "final_available" and the dataset route’s URL under final.
Pass cursor from the previous response to get only what is new: segments above the cursor’s seq, plus the cursor’s own segment when it has grown, carrying from_row so you read rows [from_row, rows). Fully-consumed segments are omitted, the response cursor echoes the request when nothing is new, and it is "0:0" while no segment exists yet.
A cursor must name a position the log still holds: 0:0, or a segment seq with at least rows rows. Anything else means the live log was rebuilt since the cursor was minted (a version bump, lost state) and answers 409 live-cursor-reset — list again without a cursor. A cursor this route returned never 409s while the log stands.
The cursor is a position, not a timestamp, on purpose: a slower operator’s file lands after a faster one’s later-stamped rows, so a later segment can end earlier than the one before it and a timestamp would silently drop rows.
Live rows are provisional — the final build may revise them. Cached 5 s at the edge; no rows are debited for the listing itself.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Public game id (e.g. NBA_GSW_MIA_20250408, case-insensitive).
Public game id (e.g. NBA_GSW_MIA_20250408, case-insensitive).
Query Parameters
Section titled “Query Parameters”Opaque position cursor from a previous /segments response.
Opaque position cursor from a previous /segments response.
Responses
Section titled “Responses”The live manifest, with a URL per segment and per board file, and the cursor to pass next time.
object
object
object
object
/v1/games/{game_id}/sportsbook-lines/segments/{seq}?rows={rows} — fetch it verbatim; the rows it carries is this entry’s rows.
Rows of this segment the cursor already consumed; read rows [from_row, rows).
object
object
Position of everything listed; the request cursor echoed when nothing is new; “0:0” when no segment exists yet.
Example
{ "dataset": "sportsbook-lines"}Validation failed — unknown or invalid query parameter, or a malformed range (problem type validation-error).
RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.
object
Stable problem type URI.
Short human-readable summary.
HTTP status code.
Explanation specific to this occurrence.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example"}Missing, malformed, or unrecognized API key (problem type invalid-key).
RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.
object
Stable problem type URI.
Short human-readable summary.
HTTP status code.
Explanation specific to this occurrence.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example"}The key has no entitled tier — subscription lapsed or absent (problem type subscription-required; the body carries an upgrade_url).
RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.
object
Stable problem type URI.
Short human-readable summary.
HTTP status code.
Explanation specific to this occurrence.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example"}API key revoked or suspended (problem type key-disabled), or the requested range exceeds the tier’s history window (history-restricted).
RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.
object
Stable problem type URI.
Short human-readable summary.
HTTP status code.
Explanation specific to this occurrence.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example"}Unresolvable game id, a league outside the dataset’s coverage, or no live artifacts for the game. reason is final_available when the game has settled (fetch final, the dataset route) and no_live_artifact when it has not started being tracked.
RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.
object
Stable problem type URI.
Short human-readable summary.
HTTP status code.
Explanation specific to this occurrence.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example"}The cursor names a position the live log no longer holds — the log was rebuilt since the cursor was minted (problem type live-cursor-reset, with game_id). List again without a cursor. Never cached; nothing debited.
object
Example
{ "type": "https://api.betflux.ai/problems/live-cursor-reset", "status": 409}Rate limit, monthly row quota, or ops throttle — the problem type distinguishes rate-limited, quota-exhausted, and throttled.
RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.
object
Stable problem type URI.
Short human-readable summary.
HTTP status code.
Explanation specific to this occurrence.
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example"}