Overview
The public developer surface is a bearer-authenticated REST API for synchronizing tournament data, assigning work to scoring tables, and inspecting connection state.
Start with a personal developer key for direct testing, then move to OAuth app installs when you need multi-account access or rotating refresh tokens. The v1 surface covers Broadcasts and Rosters alongside legacy player lists, teams, tables, matches, connection state, and webhooks.
Implementation notes
- Every response includes OpenScoreboard-Request-ID for request correlation.
- Authenticated responses expose RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset headers.
- Collection endpoints support limit and cursor pagination when the underlying route advertises it.
Endpoints
OpenAPI/openapiDownload the OpenAPI document
Fetch the canonical v1 schema for generated clients, contract checks, or API explorer tooling.
- This endpoint does not require authentication.
- It includes the same path list that is currently wired into the app router.
curl https://your-domain.example/api/v1/openapiconst response = await fetch("https://your-domain.example/api/v1/openapi");
const schema = await response.json();
console.log(schema.openapi, Object.keys(schema.paths));/connectionInspect the active connection
Confirm which app, connection, scopes, and token expiry are attached to the bearer token you are using.
curl https://your-domain.example/api/v1/connection \
-H "Authorization: Bearer osb_test_your_key_here"const baseURL = "https://your-domain.example/api/v1";
const apiKey = "osb_test_your_key_here";
async function api(path, init = {}) {
const response = await fetch(`${baseURL}${path}`, {
...init,
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
"OpenScoreboard-Request-ID": "demo-request-001",
...(init.headers || {})
}
});
const body = await response.json();
if (!response.ok) {
throw new Error(body.error?.message || "Request failed");
}
return body.data;
}
const connection = await api("/connection");
console.log(connection.connectionID, connection.scopes);