Home

Results API

The Results API is a read-only JSON feed of finished varsity dual matches. Each entry gives the two schools, the date, and the players, status and set scores for every court. It is intended for news outlets and scoring sites that publish Vermont high school tennis results.

Which matches you'll see

Results include the names of student athletes, so each school decides where they are published. Every API key belongs to a news outlet, and coaches choose which outlets their team reports to. A match is included if either team reports to your outlet, and only after all seven courts are final.

Endpoints

GET /api/v1/dual-matches?season=2027
GET /api/v1/dual-matches?date=2027-04-20
GET /api/v1/dual-matches/{id}
GET /api/v1/sample/dual-matches

/dual-matches returns every match your key can see in the given season. Without season, it returns the current season. With date instead, it returns the matches played on that day in the same format. You can use season or date, but not both.

/dual-matches/{id} returns a single match, or a 404 if the match does not exist or is not yet final. /sample/dual-matches returns an invented season at real schools that covers every case, so you can build against it before real results are available.

Send your key in the Authorization header of every request:

curl -H "Authorization: Bearer YOUR_KEY" https://vthstennis.org/api/v1/dual-matches

Polling

Each season or date response is a complete snapshot, so compare it with your copy by id. A new id is a new match, a changed entry is a correction, and an id that no longer appears should be removed.

Every response includes an ETag. If you send it back in If-None-Match and nothing has changed, you get an empty 304 response. Polling every 5 to 15 minutes during the season is enough. Each key is limited to 120 requests per minute.

What an entry looks like

{
  "kind": "dual",
  "id": 4055,
  "matchDate": "2026-04-15",
  "gender": "boys",
  "complete": true,
  "location": "SBHS Courts",
  "home": { "orgIds": ["PS272"] },
  "visiting": { "orgIds": ["PS066"] },
  "updatedAt": "2026-04-15T21:40:11Z",
  "positions": [
    {
      "type": "singles",
      "position": 1,
      "status": "played",
      "winner": "home",
      "homePlayers": [{ "id": 2041, "name": "First Last", "utrId": null }],
      "visitingPlayers": [{ "id": 2187, "name": "First Last", "utrId": null }],
      "scores": [
        { "set_no": 1, "winner_score": 6, "loser_score": 1 },
        { "set_no": 2, "winner_score": 6, "loser_score": 2 }
      ]
    }
  ]
}

Schools are identified by their Vermont Agency of Education organization ID. The complete field reference, which covers retirements, defaults, walkovers and match tiebreaks, is sent with your key.

Request a key

Tell us who you are and how you plan to use the results. We usually reply by email within a few days.