Skip to content
Product Documentation

List complete MSF revisions after a scope-bound cursor.

GET
/v1/games/{game_id}/{dataset}/changes
curl --request GET \
--url 'https://api.betflux.ai/v1/games/example/example/changes?cursor=example' \
--header 'Authorization: Bearer <token>'

Pages stop at revision boundaries. Send the first page’s high_water_revision as until_revision on every later page to hold that high-water mark fixed. For a key whose history window ends before the head (the demo key’s sample month), high_water_revision is the last revision that key may read. A cursor for another dataset or scope is a 400. Served only where MSF serving is enabled: GET /v1/datasets lists the MSF datasets available, and elsewhere every MSF route answers 404.

game_id
required
string
dataset
required
string
cursor
required

A snapshot or changes cursor; revisions after it are listed.

string

A snapshot or changes cursor; revisions after it are listed.

limit

Most revisions to list, 1–500 (default 100).

string

Most revisions to list, 1–500 (default 100).

until_revision

Highest revision to list: the first page’s high_water_revision. Defaults to the current head.

string

Highest revision to list: the first page’s high_water_revision. Defaults to the current head.

Revision listing.

Media typeapplication/json
object
dataset
required
string
Allowed values: game-state plays player-stats team-stats injuries
scope
required
One of:
object
kind
required
string
Allowed values: game
game_id
required
string
>= 1 characters
schema_version
required
string
>= 1 characters
stream_epoch
required
string
>= 1 characters
high_water_revision
required
integer
revisions
required
Array<object>
object
dataset
required
string
Allowed values: game-state plays player-stats team-stats injuries
scope
required
One of:
object
kind
required
string
Allowed values: game
game_id
required
string
>= 1 characters
schema_version
required
string
>= 1 characters
stream_epoch
required
string
>= 1 characters
revision
required
integer
revision_kind
required
string
Allowed values: patch append replace
is_baseline
required
boolean
history_origin
required
string
Allowed values: captured reconstructed
source_observation
required
object
source_revision
required
string
>= 1 characters
source_updated_at
required
string format: date-time
request_started_at
required
string format: date-time
timestamp_basis
required
string
Allowed values: source request_start unverified
source_played_status
string | null
source_schedule_status
string | null
materialized_at
required
string format: date-time
status
required
string
Allowed values: provisional verified
coverage
required
object
state
required
string
Allowed values: complete legacy_partial degraded
coverage_start
required
string | null format: date-time
coverage_end
required
string | null format: date-time
gaps
required
Array<string>
pending_source_revision
required
string | null
files
required
Array<object>
object
rows
required
integer
sha256
required
string
/^[a-f0-9]{64}$/
url
required
string
>= 1 characters
row_count
required
integer
cursor
required
string
>= 1 characters
cursor
required
string
>= 1 characters
poll_after
required
integer
> 0
freshness
required
object
newest_applied_source_updated_at
required

Newest independently evidenced source version applied to serving state; null when no checkpoint evidence is published.

string | null format: date-time
last_changed_at
required

Time of the last publication containing data changes; null when change history is not evidenced.

string | null format: date-time
latest_request_started_at
required

Latest independently observed source request start, which does not prove request completion.

string | null format: date-time
last_pull_success_observed_at
required

Latest pull completion evidenced by source pull state; separate from source update time.

string | null format: date-time
last_normalized_at
required

Latest normalization evidenced by a retained normalize receipt; null when unavailable.

string | null format: date-time
health_observed_at
required

Time this independent health evidence was observed; null when health evidence is unavailable.

string | null format: date-time
Example
{
"dataset": "game-state",
"scope": {
"kind": "game"
},
"revisions": [
{
"dataset": "game-state",
"scope": {
"kind": "game"
},
"revision_kind": "patch",
"history_origin": "captured",
"source_observation": {
"timestamp_basis": "source"
},
"status": "provisional",
"coverage": {
"state": "complete"
}
}
]
}

Validation failed — unknown or invalid query parameter, or a malformed range (problem type validation-error).

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}

Missing, malformed, or unrecognized API key (problem type invalid-key).

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}

The key is valid, but the account has no active subscription (problem type subscription-required). The response includes upgrade_url.

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}

API key revoked or suspended (problem type key-disabled), or a game or league revision outside the key’s history window (problem type history-restricted).

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}

Unknown MSF dataset, unknown game, an uncovered league, or nothing published yet (problem type not-yet-available).

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}

Stream reset (problem type stream-reset); fetch the replacement snapshot.

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}

Cursor expired (problem type cursor-expired); fetch a new snapshot.

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}

Rate limit, monthly row quota, or ops throttle — the problem type distinguishes rate-limited, quota-exhausted, and throttled.

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}

Temporary failure resolving the game id; retry shortly.

Media typeapplication/problem+json

RFC 9457 problem details. Dispatch on the stable type URI (https://api.betflux.ai/problems/*), never on the English title.

object
type
required

Stable problem type URI.

string
title
required

Short human-readable summary.

string
status
required

HTTP status code.

integer
detail

Explanation specific to this occurrence.

string
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example"
}