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.