The interchange layer for youth sports schedules
Sources push schedule observations once. Sideline Exchange resolves them into one canonical schedule — with provenance on every field — that every app, calendar and website reads.
Built on OYSS, an open Apache-2.0 spec — the payload on the right is one of its conformance vectors.
{
"source": "gotsport",
"sent_at": "2027-03-28T19:02:11Z",
"observations": [
{
"type": "fixture",
"external_id": "evt/88213/match/4471",
"observed_at": "2027-03-28T19:02:11Z",
"confidence": 0.98,
"data": {
"kind": "game",
"sport": "soccer",
"competition": {
"external_id": "evt/88213",
"name": "Dallas Cup 2027"
},
"division": {
"external_id": "evt/88213/div/U13BG",
"name": "U13 Boys Gold"
},
"stage": {
"external_id": "evt/88213/div/U13BG/pool/B",
"name": "Pool B"
},
"start": "2027-04-10T14:00:00Z",
"end": "2027-04-10T15:20:00Z",
"time_zone": "America/Chicago",
"time_status": "confirmed",
"status": "scheduled",
"venue": {
"external_id": "venue/77",
"name": "MoneyGram Soccer Park",
"field": "Field 7"
},
"sides": [
{
"role": "home",
"team": {
"external_id": "team/40312",
"name": "Lakeside FC 2014B Blue"
}
},
{
"role": "away",
"team": {
"external_id": "team/40877",
"name": "Riverbend SC 14B Red"
}
}
],
"url": "https://system.gotsport.com/org_event/events/88213/schedules?match=4471"
}
}
]
}…and what everyone else sees
Rendered live by the embed package from the payload above. Clubs are fictional; the pipeline is not.
One schedule, whoever writes it
A tournament platform, a league site and a club spreadsheet all describe the same game. The hub turns their competing claims into a single answer — and shows its work.
Sources push observations
Platforms POST batches. Leagues and clubs hand over an iCal or CSV URL, or let the hub watch a schedule page. Every payload is stored raw before anything touches it.
The hub resolves and applies
Identity resolution matches teams and games across sources; conflicts are settled by source rank, then recency, then confidence. Nothing is hand-edited — a correction is just an observation from a ranked source.
Everyone reads one schedule
Canonical fixtures over a fast API with ETags, delta sync from a cursor, signed webhooks, and embeds. Each field carries the observation that won it.
{
"provenance": {
"start": { "source": "gotsport", "confidence": 0.98 },
"venue.field": { "source": "web:dallascup.com", "confidence": 0.71 }
},
"version": 7
}Schedules API
Canonical fixtures, with receipts
Read teams, competitions and fixtures the way the network agrees they are. Every response carries an ETag; every field names its winning observation, so "where did this time come from?" is an API answer, not a support ticket.
- Scoped reads by team, competition or venue
- Conditional requests — unchanged answers cost a 304
- Test and live modes, with resettable test data

Supply & Feeds
Become a source without writing code
An iCal URL, a CSV by URL or upload, or a schedule page the hub watches on a cadence — with drift detection that holds suspicious scrapes for review instead of publishing them.
- iCal and CSV connectors with per-run reports
- Layout drift detection on watched pages
- Every run raw-archived and replayable

Events & Sync
Keep a season in sync with one cursor
Signed webhooks nudge you when anything changes; GET /v1/changes is the truth you reconcile against. Deliveries retry with per-subscription fairness, and a dead endpoint disables itself instead of clogging the pipeline.
- HMAC-signed deliveries with attempt history
- Delta sync that never re-serves what you have
- Redeliver any event from the console

Calendar Embeds
A schedule on any website
A drop-in widget backed by browser-safe publishable keys, and public iCal feeds any phone can subscribe to. The schedule below is the real package rendering the hero payload.
- One script tag, no build step
- Publishable keys are read-only by construction
- iCal feeds for every team
This is the live widget, not a screenshot.
Built for the integration team of one
An open spec, an embeddable calendar widget, test mode with resettable data, signed webhooks, delta sync and an API explorer in the dashboard. Push a batch in five minutes; keep a season in sync with one cursor.
curl https://api.sidelineexchange.com/v1/fixtures \
-H "Authorization: Bearer sk_test_..." \
-d team=tm_01hz... \
-G
# 200 OK · ETag: "fx-v7-..." — send it back, pay a 304 next timeIndependent by design
Sideline Exchange is not owned by, funded by, or affiliated with any sports platform. Every platform integrates on identical terms — the same spec, the same rate limits, the same rules for whose data wins a conflict. An interchange only works if nobody owns the scales.
Read the independence pledge