Start here
What Sideline Exchange is
One canonical model for youth sports schedules, one surface sources push to, one surface everyone reads from — with every field attributed to the observation that won it.
Every club platform, team app and calendar aggregator rebuilds the same fragile plumbing: scraping tournament sites, integrating partner APIs, breaking on redesigns, asking families to re-key the same schedule into five systems. Sideline Exchange is where the data lives instead. You integrate once and get everything.
The model separates what sources said from what the hub believes. Sources send observations — "GotSport says match 4471 kicks off at 14:00Z". The hub resolves each observation to a canonical entity and applies it field by field under a conflict policy. Nothing is silently overwritten: when two sources disagree, the more authoritative one wins that field, and the fixture records exactly which observation each value came from.
The two surfaces
| Surface | Who uses it | What it does |
|---|---|---|
POST /v1/observations | Sources: platforms, feeds, published schedules | Push up to 1,000 observations per batch, idempotently. |
GET /v1/fixtures, GET /v1/changes | Consumers | Read canonical entities with provenance; sync deltas with a cursor. |
GET /v1/teams/{id}/calendar.ics | Families | A public iCalendar feed any calendar app subscribes to. |
Test and live
Every endpoint exists in both modes. The key decides: sk_test_… writes to an isolated, resettable partition; sk_live_… touches production data. Build the whole integration in test mode, then swap the key.