Sideline Exchange/
Dashboard →

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

SurfaceWho uses itWhat it does
POST /v1/observationsSources: platforms, feeds, published schedulesPush up to 1,000 observations per batch, idempotently.
GET /v1/fixtures, GET /v1/changesConsumersRead canonical entities with provenance; sync deltas with a cursor.
GET /v1/teams/{id}/calendar.icsFamiliesA 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.