Read standings into a sheet or site

Two doors. If the division is on a public dashboard, you don’t need a key at all. For private data, a read key does it.

No key: the public read API

Everything a public dashboard shows is also JSON — slugs are in the dashboard URL (/shared/<org>/<competition>/<division>):

public standings
curl https://seazn.club/api/v1/public/orgs/riverside/competitions/summer-league/divisions/mens-a/standings

With a read key: any division

private standings
# stages of a division
curl https://seazn.club/api/v1/divisions/$DIVISION_ID/stages \
  -H "Authorization: Bearer sc_your_key"

# standings snapshot of a stage
curl https://seazn.club/api/v1/stages/$STAGE_ID/standings \
  -H "Authorization: Bearer sc_your_key"

Google Sheets

Apps Script’s UrlFetchApp + a time-driven trigger keeps a sheet current:

Code.gs
function pullStandings() {
  const res = UrlFetchApp.fetch(
    "https://seazn.club/api/v1/stages/" + STAGE_ID + "/standings",
    { headers: { Authorization: "Bearer " + KEY } });
  const rows = JSON.parse(res.getContentText()).data.rows;
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.clearContents();
  sheet.appendRow(["Rank", "Entrant", "P", "Pts"]);
  rows.forEach(r => sheet.appendRow([r.rank, r.entrant_name, r.played, r.points]));
}

TypeScript

standings.ts
const res = await fetch(
  `https://seazn.club/api/v1/stages/${stageId}/standings`,
  { headers: { Authorization: `Bearer ${process.env.SEAZN_KEY}` } },
);
const body = await res.json();
if (!body.ok) throw new Error(body.error.message);
console.table(body.data.rows);

Prefer an iframe? Pro orgs can embed live standings directly — see the sharing panel on any division, no code beyond a copy-paste snippet.