{"openapi":"3.1.0","info":{"title":"Layer One Competition Viewer API","version":"1.0.0","description":"Anonymous, read-only JSON for viewer apps. No API key or cookies. Cross-origin GET/OPTIONS supported. Poll every five seconds, back off on errors, and interpolate timers locally. Responses use no-store. [Quickstart](/docs/api). Add mock=true for a static offline sample. Scores expose the active revision; only finalized matches affect official standings. Outcomes are authoritative even when totals suggest otherwise (e.g. disqualification). Cash Out v1 payloads expose chip locations, penalties, and disqualifications; unknown versions retain their schema key/version with a null payload."},"servers":[{"url":"/","description":"This website"}],"security":[],"tags":[{"name":"Competition Viewer"}],"paths":{"/api/v1/competitions/{competition}/full":{"get":{"operationId":"getCompetitionFull","tags":["Competition Viewer"],"summary":"Get the full competition","description":"A consistent, complete public snapshot: roster, matches with active scores, standings, awards, active/completed brackets, and timer state. Draft schedules, cancelled matches, unfinished scoring workspaces, and private account data are excluded. No pagination or silent truncation.","parameters":[{"name":"competition","in":"path","required":true,"schema":{"type":"string"},"example":"live","description":"Existing competition ID from a viewer URL, or live. Live prefers the latest-starting ongoing event, otherwise latest started, otherwise earliest upcoming. Equal starts use newest creation for ongoing/past, oldest creation for upcoming."},{"name":"mock","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false"},"example":"true","description":"Exactly mock=true bypasses the backend and ignores the competition selector. Returns the fixed sample-competition dataset, including a fixed generatedAt. Omit for real data."}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"# Replace localhost with your website origin; remove mock for real data.\ncurl --get 'http://localhost:3000/api/v1/competitions/live/full' \\\n  --data-urlencode 'mock=true'"},{"lang":"JavaScript","source":"// Run in a browser on the website, or replace location.origin.\nconst url = new URL('/api/v1/competitions/live/full', location.origin);\nurl.search = new URLSearchParams({ mock: 'true' }).toString();\nconst controller = new AbortController();\nlet delay = 5000;\nasync function poll() {\n  try {\n    const response = await fetch(url, {\n      credentials: 'omit', cache: 'no-store',\n      signal: controller.signal,\n    });\n    if (response.status === 400 || response.status === 404) {\n      console.error(await response.json());\n      return; // Fix the selector/ticker before retrying.\n    }\n    if (!response.ok) throw new Error('Temporarily unavailable');\n    const snapshot = await response.json();\n    console.log(snapshot); // Update your viewer here.\n    delay = 5000;\n  } catch (error) {\n    if (controller.signal.aborted) return;\n    console.error(error);\n    delay = Math.min(delay * 2, 60000);\n  }\n  if (!controller.signal.aborted) setTimeout(poll, delay);\n}\npoll();\n// Call controller.abort() when leaving the viewer.\n// Remove mock from url.searchParams to use real competition data."},{"lang":"Python","source":"import json\nimport os\nimport time\nfrom urllib.parse import urlencode\nfrom urllib.request import urlopen\nfrom urllib.error import HTTPError, URLError\n\nbase = os.environ.get('BASE_URL', 'http://localhost:3000')\nparams = {'mock': 'true'}  # Remove mock for real data.\nurl = base.rstrip('/') + '/api/v1/competitions/live/full?' + urlencode(params)\ndelay = 5\nwhile True:\n    try:\n        with urlopen(url, timeout=15) as response:\n            snapshot = json.load(response)\n        print(snapshot)  # Update your viewer here.\n        delay = 5\n    except HTTPError as error:\n        if error.code in (400, 404):\n            raise  # Fix the selector/ticker before retrying.\n        delay = min(delay * 2, 60)\n    except (URLError, TimeoutError):\n        delay = min(delay * 2, 60)\n    time.sleep(delay)"}],"responses":{"200":{"description":"Public competition snapshot. All timestamps are Unix milliseconds; unavailable fields are null.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullSnapshot"},"examples":{"sample":{"summary":"Static mock response","value":{"apiVersion":"1","generatedAt":1800000000000,"competitionId":"sample-competition","competition":{"competitionId":"sample-competition","title":"Sample Cash Out Open","startsAt":1799996400000,"endsAt":1800003600000,"locationAddress":"123 Example Avenue","descriptionMarkdown":"A **static sample** for building competition viewer apps.","gameId":"cashOut2026","awardsIntroMarkdown":"Sample awards","schedulePublishedAt":1799992800000},"entries":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null},{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null}],"matches":[{"matchId":"sample-match-1","displayName":"Qualification 1","matchNumber":1,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"finalized","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"competed","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"competed","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"competed","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"competed","isSurrogate":false}],"startedAt":1799999600000,"pausedAt":null,"completedAt":1799999735000,"finalizedAt":1799999740000,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":{"scoreRevisionId":"sample-score-1","redTotal":30,"blueTotal":27,"outcome":"redWin","hasBreakdown":true,"gameData":{"schemaKey":"cashOut2026","schemaVersion":1,"payload":{"red":{"ground":4,"lowBank":4,"highBank":4,"groundSafe":1,"elevatedSafe":1,"minorPenalties":0,"majorPenalties":0,"disqualified":false},"blue":{"ground":4,"lowBank":4,"highBank":4,"groundSafe":1,"elevatedSafe":1,"minorPenalties":1,"majorPenalties":0,"disqualified":false},"unscored":0}}}},{"matchId":"sample-match-2","displayName":"Qualification 2","matchNumber":2,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"paused","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":1799999800000,"pausedAt":1800000000000,"completedAt":null,"finalizedAt":null,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":null},{"matchId":"sample-match-3","displayName":"Qualification 3","matchNumber":3,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"scheduled","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":null},{"matchId":"sample-match-4","displayName":"Final · Game 1","matchNumber":4,"stage":"elimination","allianceSize":2,"countsTowardStandings":false,"status":"queued","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":"sample-bracket","bracketSide":"winners","bracketRound":1,"bracketSeries":1,"seriesGameNumber":1,"redEliminationAllianceId":"sample-alliance-1","blueEliminationAllianceId":"sample-alliance-2","score":null}],"standings":[{"entryId":"sample-entry-1","ticker":"ROBOT","teamName":"Robot Works","robotName":"Atlas","primaryPhotoUrl":null,"rank":1,"matchesPlayed":1,"wins":1,"losses":0,"ties":0,"rankingPoints":2,"tiebreakerScore":30,"offensivePowerRating":30},{"entryId":"sample-entry-2","ticker":"ROBOT","teamName":"Robot Works","robotName":"Scout","primaryPhotoUrl":null,"rank":2,"matchesPlayed":1,"wins":1,"losses":0,"ties":0,"rankingPoints":2,"tiebreakerScore":30,"offensivePowerRating":30},{"entryId":"sample-entry-4","ticker":"A&B","teamName":"Ampersand Builders","robotName":"Bolt","primaryPhotoUrl":null,"rank":3,"matchesPlayed":1,"wins":0,"losses":1,"ties":0,"rankingPoints":0,"tiebreakerScore":27,"offensivePowerRating":27},{"entryId":"sample-entry-3","ticker":"A&B","teamName":"Ampersand Builders","robotName":"Copper","primaryPhotoUrl":null,"rank":4,"matchesPlayed":1,"wins":0,"losses":1,"ties":0,"rankingPoints":0,"tiebreakerScore":27,"offensivePowerRating":27}],"currentMatches":[{"matchId":"sample-match-2","displayName":"Qualification 2","matchNumber":2,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"paused","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":1799999800000,"pausedAt":1800000000000,"completedAt":null,"finalizedAt":null,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":null}],"upcomingMatches":[{"matchId":"sample-match-3","displayName":"Qualification 3","matchNumber":3,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"scheduled","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":null},{"matchId":"sample-match-4","displayName":"Final · Game 1","matchNumber":4,"stage":"elimination","allianceSize":2,"countsTowardStandings":false,"status":"queued","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":"sample-bracket","bracketSide":"winners","bracketRound":1,"bracketSeries":1,"seriesGameNumber":1,"redEliminationAllianceId":"sample-alliance-1","blueEliminationAllianceId":"sample-alliance-2","score":null}],"nextMatch":{"matchId":"sample-match-4","displayName":"Final · Game 1","matchNumber":4,"stage":"elimination","allianceSize":2,"countsTowardStandings":false,"status":"queued","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":"sample-bracket","bracketSide":"winners","bracketRound":1,"bracketSeries":1,"seriesGameNumber":1,"redEliminationAllianceId":"sample-alliance-1","blueEliminationAllianceId":"sample-alliance-2","score":null},"awards":[{"awardId":"sample-award-gold","kind":"champion","title":"Champions / Gold Medalists","descriptionMarkdown":null,"displayOrder":1,"recipients":[]},{"awardId":"sample-award-silver","kind":"silver","title":"Silver Medalists","descriptionMarkdown":null,"displayOrder":2,"recipients":[]},{"awardId":"sample-award-bronze","kind":"bronze","title":"Bronze Medalists","descriptionMarkdown":null,"displayOrder":3,"recipients":[]},{"awardId":"sample-award-design","kind":"custom","title":"Design Award","descriptionMarkdown":"A thoughtful robot design.","displayOrder":4,"recipients":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null}]}],"presentation":{"mode":"paused","enteredAt":1800000000000,"generation":3,"matchId":"sample-match-2","cycleStartedAt":null,"goAt":null,"endsAt":null,"remainingMs":65000,"revealedAt":null,"autoAdvanceAt":null},"brackets":[{"bracketId":"sample-bracket","format":"single","allianceSize":2,"standardBestOf":1,"finalBestOf":3,"status":"active","alliances":[{"allianceId":"sample-alliance-1","seed":1,"members":[{"station":1,"entry":{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null}},{"station":2,"entry":{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null}}]},{"allianceId":"sample-alliance-2","seed":2,"members":[{"station":1,"entry":{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null}},{"station":2,"entry":{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null}}]}],"matchIds":["sample-match-4"],"series":[{"side":"winners","round":1,"series":1,"isFinal":true,"sources":[{"kind":"seed","seed":1},{"kind":"seed","seed":2}],"label":"Final","bestOf":3,"matchIds":["sample-match-4"]}]}]}}}}}},"400":{"description":"Invalid competition ID or ticker","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"INVALID_COMPETITION","message":"Invalid competition ID or ticker"}}}}},"404":{"description":"Competition missing, or team not entered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"COMPETITION_NOT_FOUND","message":"Competition missing, or team not entered"}}}}},"503":{"description":"Backend unavailable; retry with exponential backoff","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"SERVICE_UNAVAILABLE","message":"Backend unavailable; retry with exponential backoff"}}}}}}}},"/api/v1/competitions/{competition}/my-team":{"get":{"operationId":"getCompetitionTeam","tags":["Competition Viewer"],"summary":"Get my team's competition","description":"All registered robots for a ticker, their official robot ranks, deduplicated matches including opponents, upcoming matches, and awarded recipients. Presentation is the event-wide public timer state.","parameters":[{"name":"competition","in":"path","required":true,"schema":{"type":"string"},"example":"live","description":"Existing competition ID from a viewer URL, or live. Live prefers the latest-starting ongoing event, otherwise latest started, otherwise earliest upcoming. Equal starts use newest creation for ongoing/past, oldest creation for upcoming."},{"name":"mock","in":"query","required":false,"schema":{"type":"string","enum":["true","false"],"default":"false"},"example":"true","description":"Exactly mock=true bypasses the backend and ignores the competition selector. Returns the fixed sample-competition dataset, including a fixed generatedAt. Omit for real data."},{"name":"ticker","in":"query","required":true,"schema":{"type":"string","minLength":1},"example":"A&B","description":"Trimmed and uppercased. 1–5 characters: A–Z, 0–9, . & ! ? - _ *. URL-encode punctuation. Mock teams: ROBOT and A&B."}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"# Replace localhost with your website origin; remove mock for real data.\ncurl --get 'http://localhost:3000/api/v1/competitions/live/my-team' \\\n  --data-urlencode 'mock=true' \\\n  --data-urlencode 'ticker=A&B'"},{"lang":"JavaScript","source":"// Run in a browser on the website, or replace location.origin.\nconst url = new URL('/api/v1/competitions/live/my-team', location.origin);\nurl.search = new URLSearchParams({ mock: 'true', ticker: 'A&B' }).toString();\nconst controller = new AbortController();\nlet delay = 5000;\nasync function poll() {\n  try {\n    const response = await fetch(url, {\n      credentials: 'omit', cache: 'no-store',\n      signal: controller.signal,\n    });\n    if (response.status === 400 || response.status === 404) {\n      console.error(await response.json());\n      return; // Fix the selector/ticker before retrying.\n    }\n    if (!response.ok) throw new Error('Temporarily unavailable');\n    const snapshot = await response.json();\n    console.log(snapshot); // Update your viewer here.\n    delay = 5000;\n  } catch (error) {\n    if (controller.signal.aborted) return;\n    console.error(error);\n    delay = Math.min(delay * 2, 60000);\n  }\n  if (!controller.signal.aborted) setTimeout(poll, delay);\n}\npoll();\n// Call controller.abort() when leaving the viewer.\n// Remove mock from url.searchParams to use real competition data."},{"lang":"Python","source":"import json\nimport os\nimport time\nfrom urllib.parse import urlencode\nfrom urllib.request import urlopen\nfrom urllib.error import HTTPError, URLError\n\nbase = os.environ.get('BASE_URL', 'http://localhost:3000')\nparams = {'mock': 'true', 'ticker': 'A&B'}  # Remove mock for real data.\nurl = base.rstrip('/') + '/api/v1/competitions/live/my-team?' + urlencode(params)\ndelay = 5\nwhile True:\n    try:\n        with urlopen(url, timeout=15) as response:\n            snapshot = json.load(response)\n        print(snapshot)  # Update your viewer here.\n        delay = 5\n    except HTTPError as error:\n        if error.code in (400, 404):\n            raise  # Fix the selector/ticker before retrying.\n        delay = min(delay * 2, 60)\n    except (URLError, TimeoutError):\n        delay = min(delay * 2, 60)\n    time.sleep(delay)"}],"responses":{"200":{"description":"Public competition snapshot. All timestamps are Unix milliseconds; unavailable fields are null.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamSnapshot"},"examples":{"sample":{"summary":"Static mock response","value":{"apiVersion":"1","generatedAt":1800000000000,"competitionId":"sample-competition","competition":{"competitionId":"sample-competition","title":"Sample Cash Out Open","startsAt":1799996400000,"endsAt":1800003600000,"locationAddress":"123 Example Avenue","descriptionMarkdown":"A **static sample** for building competition viewer apps.","gameId":"cashOut2026","awardsIntroMarkdown":"Sample awards","schedulePublishedAt":1799992800000},"team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"entries":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null}],"matches":[{"matchId":"sample-match-1","displayName":"Qualification 1","matchNumber":1,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"finalized","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"competed","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"competed","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"competed","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"competed","isSurrogate":false}],"startedAt":1799999600000,"pausedAt":null,"completedAt":1799999735000,"finalizedAt":1799999740000,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":{"scoreRevisionId":"sample-score-1","redTotal":30,"blueTotal":27,"outcome":"redWin","hasBreakdown":true,"gameData":{"schemaKey":"cashOut2026","schemaVersion":1,"payload":{"red":{"ground":4,"lowBank":4,"highBank":4,"groundSafe":1,"elevatedSafe":1,"minorPenalties":0,"majorPenalties":0,"disqualified":false},"blue":{"ground":4,"lowBank":4,"highBank":4,"groundSafe":1,"elevatedSafe":1,"minorPenalties":1,"majorPenalties":0,"disqualified":false},"unscored":0}}}},{"matchId":"sample-match-2","displayName":"Qualification 2","matchNumber":2,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"paused","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":1799999800000,"pausedAt":1800000000000,"completedAt":null,"finalizedAt":null,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":null},{"matchId":"sample-match-3","displayName":"Qualification 3","matchNumber":3,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"scheduled","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":null},{"matchId":"sample-match-4","displayName":"Final · Game 1","matchNumber":4,"stage":"elimination","allianceSize":2,"countsTowardStandings":false,"status":"queued","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":"sample-bracket","bracketSide":"winners","bracketRound":1,"bracketSeries":1,"seriesGameNumber":1,"redEliminationAllianceId":"sample-alliance-1","blueEliminationAllianceId":"sample-alliance-2","score":null}],"standings":[{"entryId":"sample-entry-4","ticker":"A&B","teamName":"Ampersand Builders","robotName":"Bolt","primaryPhotoUrl":null,"rank":3,"matchesPlayed":1,"wins":0,"losses":1,"ties":0,"rankingPoints":0,"tiebreakerScore":27,"offensivePowerRating":27},{"entryId":"sample-entry-3","ticker":"A&B","teamName":"Ampersand Builders","robotName":"Copper","primaryPhotoUrl":null,"rank":4,"matchesPlayed":1,"wins":0,"losses":1,"ties":0,"rankingPoints":0,"tiebreakerScore":27,"offensivePowerRating":27}],"currentMatches":[{"matchId":"sample-match-2","displayName":"Qualification 2","matchNumber":2,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"paused","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":1799999800000,"pausedAt":1800000000000,"completedAt":null,"finalizedAt":null,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":null}],"upcomingMatches":[{"matchId":"sample-match-3","displayName":"Qualification 3","matchNumber":3,"stage":"qualification","allianceSize":2,"countsTowardStandings":true,"status":"scheduled","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":null,"bracketSide":null,"bracketRound":null,"bracketSeries":null,"seriesGameNumber":null,"redEliminationAllianceId":null,"blueEliminationAllianceId":null,"score":null},{"matchId":"sample-match-4","displayName":"Final · Game 1","matchNumber":4,"stage":"elimination","allianceSize":2,"countsTowardStandings":false,"status":"queued","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":"sample-bracket","bracketSide":"winners","bracketRound":1,"bracketSeries":1,"seriesGameNumber":1,"redEliminationAllianceId":"sample-alliance-1","blueEliminationAllianceId":"sample-alliance-2","score":null}],"nextMatch":{"matchId":"sample-match-4","displayName":"Final · Game 1","matchNumber":4,"stage":"elimination","allianceSize":2,"countsTowardStandings":false,"status":"queued","videoUrl":null,"red":[{"entryId":"sample-entry-1","robotId":"sample-robot-1","robotName":"Atlas","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-2","robotId":"sample-robot-2","robotName":"Scout","team":{"teamId":"sample-team-robot","name":"Robot Works","ticker":"ROBOT","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"blue":[{"entryId":"sample-entry-3","robotId":"sample-robot-3","robotName":"Copper","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":1,"participantStatus":"scheduled","isSurrogate":false},{"entryId":"sample-entry-4","robotId":"sample-robot-4","robotName":"Bolt","team":{"teamId":"sample-team-ab","name":"Ampersand Builders","ticker":"A&B","status":"active","logoUrl":null},"primaryPhotoUrl":null,"station":2,"participantStatus":"scheduled","isSurrogate":false}],"startedAt":null,"pausedAt":null,"completedAt":null,"finalizedAt":null,"bracketId":"sample-bracket","bracketSide":"winners","bracketRound":1,"bracketSeries":1,"seriesGameNumber":1,"redEliminationAllianceId":"sample-alliance-1","blueEliminationAllianceId":"sample-alliance-2","score":null},"awards":[],"presentation":{"mode":"paused","enteredAt":1800000000000,"generation":3,"matchId":"sample-match-2","cycleStartedAt":null,"goAt":null,"endsAt":null,"remainingMs":65000,"revealedAt":null,"autoAdvanceAt":null}}}}}}},"400":{"description":"Invalid competition ID or ticker","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"INVALID_TICKER","message":"Invalid competition ID or ticker"}}}}},"404":{"description":"Competition missing, or team not entered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"TEAM_NOT_ENTERED","message":"Competition missing, or team not entered"}}}}},"503":{"description":"Backend unavailable; retry with exponential backoff","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"error":{"code":"SERVICE_UNAVAILABLE","message":"Backend unavailable; retry with exponential backoff"}}}}}}}}},"components":{"schemas":{"ApiError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_COMPETITION","INVALID_TICKER","COMPETITION_NOT_FOUND","TEAM_NOT_ENTERED","SERVICE_UNAVAILABLE"]},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"Award":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"awardId":{"type":"string"},"kind":{"type":"string","enum":["champion","silver","bronze","custom"]},"title":{"type":"string"},"descriptionMarkdown":{"anyOf":[{"type":"string"},{"type":"null"}]},"displayOrder":{"type":"number"},"recipients":{"type":"array","items":{"$ref":"#/components/schemas/Entry"}}},"required":["awardId","kind","title","descriptionMarkdown","displayOrder","recipients"],"additionalProperties":false},"Bracket":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"bracketId":{"type":"string"},"format":{"type":"string","enum":["single","double"]},"allianceSize":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2}]},"standardBestOf":{"type":"number"},"finalBestOf":{"type":"number"},"status":{"type":"string","enum":["active","completed"]},"alliances":{"type":"array","items":{"type":"object","properties":{"allianceId":{"type":"string"},"seed":{"type":"number"},"members":{"type":"array","items":{"type":"object","properties":{"station":{"type":"number"},"entry":{"$ref":"#/components/schemas/Entry"}},"required":["station","entry"],"additionalProperties":false}}},"required":["allianceId","seed","members"],"additionalProperties":false}},"matchIds":{"type":"array","items":{"type":"string"}},"series":{"type":"array","items":{"type":"object","properties":{"side":{"type":"string","enum":["winners","losers","grandFinal"]},"round":{"type":"number"},"series":{"type":"number"},"isFinal":{"type":"boolean"},"sources":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","const":"seed"},"seed":{"type":"number"}},"required":["kind","seed"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"series"},"result":{"type":"string","enum":["winner","loser"]},"side":{"type":"string","enum":["winners","losers","grandFinal"]},"round":{"type":"number"},"series":{"type":"number"}},"required":["kind","result","side","round","series"],"additionalProperties":false}]}},"label":{"type":"string"},"bestOf":{"type":"number"},"matchIds":{"type":"array","items":{"type":"string"}}},"required":["side","round","series","isFinal","sources","label","bestOf","matchIds"],"additionalProperties":false}}},"required":["bracketId","format","allianceSize","standardBestOf","finalBestOf","status","alliances","matchIds","series"],"additionalProperties":false},"Competition":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"competitionId":{"type":"string"},"title":{"type":"string"},"startsAt":{"type":"number"},"endsAt":{"type":"number"},"locationAddress":{"type":"string"},"descriptionMarkdown":{"type":"string"},"gameId":{"type":"string","const":"cashOut2026"},"awardsIntroMarkdown":{"anyOf":[{"type":"string"},{"type":"null"}]},"schedulePublishedAt":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["competitionId","title","startsAt","endsAt","locationAddress","descriptionMarkdown","gameId","awardsIntroMarkdown","schedulePublishedAt"],"additionalProperties":false},"Entry":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"entryId":{"type":"string"},"robotId":{"type":"string"},"robotName":{"type":"string"},"team":{"$ref":"#/components/schemas/Team"},"primaryPhotoUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["entryId","robotId","robotName","team","primaryPhotoUrl"],"additionalProperties":false},"FullSnapshot":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"apiVersion":{"type":"string","const":"1"},"generatedAt":{"type":"number"},"competitionId":{"type":"string"},"competition":{"$ref":"#/components/schemas/Competition"},"entries":{"type":"array","items":{"$ref":"#/components/schemas/Entry"}},"matches":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"standings":{"type":"array","items":{"$ref":"#/components/schemas/Standing"}},"currentMatches":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"upcomingMatches":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"nextMatch":{"anyOf":[{"$ref":"#/components/schemas/Match"},{"type":"null"}]},"awards":{"type":"array","items":{"$ref":"#/components/schemas/Award"}},"presentation":{"$ref":"#/components/schemas/Presentation"},"brackets":{"type":"array","items":{"$ref":"#/components/schemas/Bracket"}}},"required":["apiVersion","generatedAt","competitionId","competition","entries","matches","standings","currentMatches","upcomingMatches","nextMatch","awards","presentation","brackets"],"additionalProperties":false},"GameData":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"schemaKey":{"type":"string"},"schemaVersion":{"type":"number"},"payload":{"anyOf":[{"type":"object","properties":{"red":{"type":"object","properties":{"ground":{"type":"integer","minimum":0,"maximum":9007199254740991},"lowBank":{"type":"integer","minimum":0,"maximum":9007199254740991},"highBank":{"type":"integer","minimum":0,"maximum":9007199254740991},"groundSafe":{"type":"integer","minimum":0,"maximum":9007199254740991},"elevatedSafe":{"type":"integer","minimum":0,"maximum":9007199254740991},"minorPenalties":{"type":"integer","minimum":0,"maximum":9007199254740991},"majorPenalties":{"type":"integer","minimum":0,"maximum":9007199254740991},"disqualified":{"type":"boolean"}},"required":["ground","lowBank","highBank","groundSafe","elevatedSafe","minorPenalties","majorPenalties","disqualified"],"additionalProperties":false},"blue":{"type":"object","properties":{"ground":{"type":"integer","minimum":0,"maximum":9007199254740991},"lowBank":{"type":"integer","minimum":0,"maximum":9007199254740991},"highBank":{"type":"integer","minimum":0,"maximum":9007199254740991},"groundSafe":{"type":"integer","minimum":0,"maximum":9007199254740991},"elevatedSafe":{"type":"integer","minimum":0,"maximum":9007199254740991},"minorPenalties":{"type":"integer","minimum":0,"maximum":9007199254740991},"majorPenalties":{"type":"integer","minimum":0,"maximum":9007199254740991},"disqualified":{"type":"boolean"}},"required":["ground","lowBank","highBank","groundSafe","elevatedSafe","minorPenalties","majorPenalties","disqualified"],"additionalProperties":false},"unscored":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["red","blue","unscored"],"additionalProperties":false},{"type":"null"}]}},"required":["schemaKey","schemaVersion","payload"],"additionalProperties":false},"Match":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"matchId":{"type":"string"},"displayName":{"type":"string"},"matchNumber":{"type":"number"},"stage":{"type":"string","enum":["practice","qualification","elimination"]},"allianceSize":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2}]},"countsTowardStandings":{"type":"boolean"},"status":{"type":"string","enum":["scheduled","queued","running","paused","completed","finalized"]},"videoUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"red":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"entryId":{"type":"string"},"robotId":{"type":"string"},"robotName":{"type":"string"},"team":{"$ref":"#/components/schemas/Team"},"primaryPhotoUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"station":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2}]},"participantStatus":{"type":"string","enum":["scheduled","competed","noShow","withdrawn","disqualified"]},"isSurrogate":{"type":"boolean"}},"required":["entryId","robotId","robotName","team","primaryPhotoUrl","station","participantStatus","isSurrogate"],"additionalProperties":false},{"type":"null"}]}},"blue":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"entryId":{"type":"string"},"robotId":{"type":"string"},"robotName":{"type":"string"},"team":{"$ref":"#/components/schemas/Team"},"primaryPhotoUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"station":{"anyOf":[{"type":"number","const":1},{"type":"number","const":2}]},"participantStatus":{"type":"string","enum":["scheduled","competed","noShow","withdrawn","disqualified"]},"isSurrogate":{"type":"boolean"}},"required":["entryId","robotId","robotName","team","primaryPhotoUrl","station","participantStatus","isSurrogate"],"additionalProperties":false},{"type":"null"}]}},"startedAt":{"anyOf":[{"type":"number"},{"type":"null"}]},"pausedAt":{"anyOf":[{"type":"number"},{"type":"null"}]},"completedAt":{"anyOf":[{"type":"number"},{"type":"null"}]},"finalizedAt":{"anyOf":[{"type":"number"},{"type":"null"}]},"bracketId":{"anyOf":[{"type":"string"},{"type":"null"}]},"bracketSide":{"anyOf":[{"type":"string","enum":["winners","losers","grandFinal"]},{"type":"null"}]},"bracketRound":{"anyOf":[{"type":"number"},{"type":"null"}]},"bracketSeries":{"anyOf":[{"type":"number"},{"type":"null"}]},"seriesGameNumber":{"anyOf":[{"type":"number"},{"type":"null"}]},"redEliminationAllianceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"blueEliminationAllianceId":{"anyOf":[{"type":"string"},{"type":"null"}]},"score":{"anyOf":[{"type":"object","properties":{"scoreRevisionId":{"type":"string"},"redTotal":{"type":"number"},"blueTotal":{"type":"number"},"outcome":{"type":"string","enum":["redWin","blueWin","tie","noContest"]},"hasBreakdown":{"type":"boolean"},"gameData":{"anyOf":[{"$ref":"#/components/schemas/GameData"},{"type":"null"}]}},"required":["scoreRevisionId","redTotal","blueTotal","outcome","hasBreakdown","gameData"],"additionalProperties":false},{"type":"null"}]}},"required":["matchId","displayName","matchNumber","stage","allianceSize","countsTowardStandings","status","videoUrl","red","blue","startedAt","pausedAt","completedAt","finalizedAt","bracketId","bracketSide","bracketRound","bracketSeries","seriesGameNumber","redEliminationAllianceId","blueEliminationAllianceId","score"],"additionalProperties":false},"Presentation":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["standings","hold","allianceSelection","bracket","champion","upcoming","countdown","live","paused","scoring","results"]},"enteredAt":{"type":"number"},"generation":{"type":"number"},"matchId":{"anyOf":[{"type":"string"},{"type":"null"}]},"cycleStartedAt":{"anyOf":[{"type":"number"},{"type":"null"}]},"goAt":{"anyOf":[{"type":"number"},{"type":"null"}]},"endsAt":{"anyOf":[{"type":"number"},{"type":"null"}]},"remainingMs":{"anyOf":[{"type":"number"},{"type":"null"}]},"revealedAt":{"anyOf":[{"type":"number"},{"type":"null"}]},"autoAdvanceAt":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["mode","enteredAt","generation","matchId","cycleStartedAt","goAt","endsAt","remainingMs","revealedAt","autoAdvanceAt"],"additionalProperties":false},{"type":"null"}]},"Standing":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"entryId":{"type":"string"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}]},"teamName":{"type":"string"},"robotName":{"type":"string"},"primaryPhotoUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"rank":{"type":"number"},"matchesPlayed":{"type":"number"},"wins":{"type":"number"},"losses":{"type":"number"},"ties":{"type":"number"},"rankingPoints":{"type":"number"},"tiebreakerScore":{"type":"number"},"offensivePowerRating":{"type":"number"}},"required":["entryId","ticker","teamName","robotName","primaryPhotoUrl","rank","matchesPlayed","wins","losses","ties","rankingPoints","tiebreakerScore","offensivePowerRating"],"additionalProperties":false},"Team":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"teamId":{"type":"string"},"name":{"type":"string"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["active","defunct"]},"logoUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["teamId","name","ticker","status","logoUrl"],"additionalProperties":false},"TeamSnapshot":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"apiVersion":{"type":"string","const":"1"},"generatedAt":{"type":"number"},"competitionId":{"type":"string"},"competition":{"$ref":"#/components/schemas/Competition"},"entries":{"type":"array","items":{"$ref":"#/components/schemas/Entry"}},"matches":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"standings":{"type":"array","items":{"$ref":"#/components/schemas/Standing"}},"currentMatches":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"upcomingMatches":{"type":"array","items":{"$ref":"#/components/schemas/Match"}},"nextMatch":{"anyOf":[{"$ref":"#/components/schemas/Match"},{"type":"null"}]},"awards":{"type":"array","items":{"$ref":"#/components/schemas/Award"}},"presentation":{"$ref":"#/components/schemas/Presentation"},"team":{"$ref":"#/components/schemas/Team"}},"required":["apiVersion","generatedAt","competitionId","competition","entries","matches","standings","currentMatches","upcomingMatches","nextMatch","awards","presentation","team"],"additionalProperties":false}}}}