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.

POST /v1/observations
{
  "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

Loading schedule…

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.

1

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.

2

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.

3

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.

Every field names the observation that won
{
  "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
Learn more
The dashboard explorer showing a fixture with per-field provenance

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
Learn more
The feeds console listing connectors and their last runs

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
Learn more
The events console with delivery attempts and redelivery

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
Learn more

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 time

Independent 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