Data modelling
From Fixture to Ground Ball: A Lacrosse Data Model That Holds Up
17 July 2026 · 6 min read
Good sports data should feel familiar to someone who knows the game and predictable to someone writing code.
The event hierarchy
A competition contains seasons. A season contains scheduled events, which may represent a weekend, venue stop or tournament block. An event contains fixtures.
In Lacrosse API, a fixture maps to one team-versus-team game and one scoring match, with both team participants attached by canonical ID.
That hierarchy makes common questions straightforward:
- A team schedule:
GET /v1/teams/{id}/fixtures - Games at an event:
GET /v1/fixtures?event_id=... - Current board:
GET /v1/fixtures/{id}/live - Team sides:
GET /v1/matches/{id}/participants
Observations are state; plays are events
An observation is a point-in-time scoreboard state: period, clock, score and goal totals. Observations are useful for reconstructing what the board showed.
A play is an ordered event: a goal, shot, faceoff, ground ball, turnover, penalty or timeout. Plays are useful for timelines and event-driven analysis.
Do not make one object impersonate the other. A late correction can update a scoreboard observation without inventing a new play, while one play can change several values on the board.
Stats have a declared grain
Player and team stat rows exist at game and season grain. A box-score row should identify its match, team and player. A season line should identify its season and aggregation scope.
Common lacrosse metrics include goals, assists, points, shots, shots on goal, ground balls, caused turnovers, turnovers, faceoff wins and attempts, saves, penalties and penalty minutes. Coverage can vary, so null retains its literal meaning: not reliably supplied.
Rosters move
A roster is time-aware. Transactions retain their date, type, source team and destination team. That lets a consumer answer “who is on the roster now?” without erasing how the player arrived there.
Explore the complete league model and endpoint map.
More from the blog
- Preserving Score and Goal Totals Across PLL Data
30 July 2026 · 4 min read
- Building a Lacrosse Live Centre: Snapshot, Stream, Resync
24 July 2026 · 7 min read
- Using Lacrosse Odds Without Losing Provenance
10 July 2026 · 5 min read