From the field · built & run live on 2026-07-19

TxLINE / TxODDS feedback

Not a wishlist — every item below is something we actually hit while running StreakBlink's live Final market against the real 2026 World Cup Final, in production, in real time.

What worked

The data was genuinely rich and real

Full match feed — possession, cards, corners, shots, VAR review, player-level goal attribution in the final box score. Live 1X2 odds tracked match events tightly enough that we used odds movement as an independent cross-check against the scores feed more than once tonight.

Auth was simple and reliable

Guest JWT + API token, straightforward to integrate, held up under load for hours of live polling without incident.

What cost us real hours

GameState never updates

It stayed the literal string "scheduled" for the entire match, pre-kickoff through full-time. The real match-phase signal is StatusId, undocumented anywhere we found — we mapped it empirically: 1=pre, 2=1st half, 3=halftime, 4=2nd half, 6=waiting-extra-time, 7=ET1, 9=ET2, 100=finalised.

Goal overturns don't look like "cancelled"

A VAR-overturned goal isn't flagged on the goal record itself. The feed emits a separate, later record — Action:"action_discarded" — whose Id matches the original event's Id. Scanning the goal event for cancel-shaped keywords (the obvious first approach) will never catch this; it requires whole-feed Id-correlation. This cost us a real public misreport before we found the mechanism.

The free-tier snapshot endpoint is inconsistent per request

Near-simultaneous requests to the same snapshot endpoint returned visibly different record sets — almost certainly different backend nodes at different lag. This caused a real user-facing bug (a public market flapping between states) until we started fetching multiple times per request and merging.

Three different shapes for "which side"

A goal event's scorer field is a bare numeric Participant (1/2, home/away index) — distinct from the ParticipantId/TeamId numeric-ID convention used elsewhere in the same feed, and distinct again from the string Team/Side convention.

Recommendations

  • Document the StatusId enum — it's the real source of truth for match phase.
  • Document the discard/overturn mechanism explicitly — it's Id-correlated across records, not a same-record flag.
  • Make the free-tier snapshot endpoint consistent across backend nodes, or document that it isn't and multi-fetch-merge is the expected pattern.
  • A changelog or schema reference for the Action vocabulary would have saved real hours — we were reverse-engineering live, during the event we were building for.
  • An official SDK — similar to 0xPulsePlay/txline-kit (txline-kit.0xpulseplay.com) — that encoded these conventions would have saved most of tonight's debugging.
Back to the StreakBlink story