{"openapi":"3.0.3","info":{"title":"sOU Workspace and Creator Integration API","version":"1.0.0","description":"External workspace and organization-bound HUD creator integrations, managed at /account/api-keys. Creator operations require a separate CreatorKey and a current explicit Publisher grant. Workspace keys cannot upload HUDs. Does not control live casting. Desktop sync is approximately every 15 seconds; incoming changes wait during active output. See /docs/workspace-api for workflows, schemas, conflicts, limits and key management."},"servers":[{"url":"/api/v1/integration"}],"security":[{"WorkspaceKey":[]}],"paths":{"/workspaces/{workspace}/snapshot":{"get":{"operationId":"getWorkspaceSnapshot","summary":"Read all typed collections, including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Collections from one workspace snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceSnapshot"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/changes":{"post":{"operationId":"applyWorkspaceChanges","summary":"Atomically apply changes grouped by entity type.","description":"At least one change is required across the named collections. At most 5000 changes in total. All identities must be unique within their collection. Revisions and references must all match; no partial commit. Deletions use deleted:true and omitted or null data.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceChanges"}}}},"responses":{"200":{"description":"Full typed snapshot after commit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceSnapshot"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/media/check":{"post":{"operationId":"checkWorkspaceMedia","summary":"Find missing content-addressed images without changing data.","description":"Requires the account to currently have Editor/Manager role; a read-only key is sufficient. 400000 body bytes, at most 5000 distinct names.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckMedia"}}}},"responses":{"200":{"description":"Only missing names.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaPresence"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/media/{name}":{"parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-f0-9]{64}\\.(png|jpg|gif)$"}}],"get":{"operationId":"downloadWorkspaceMedia","summary":"Download one workspace image.","responses":{"200":{"description":"Image bytes.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Image not found."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"uploadWorkspaceMedia","summary":"Upload an image before referencing it in entities.","description":"Requires read/write key and Editor/Manager. Maximum 4 MiB. Name is lowercase SHA-256 of exact bytes plus .png/.jpg/.gif. Use the document value /cast-media/{name}. Existing identical hashes may be reused.","requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"204":{"description":"Stored in this workspace."},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/teams":{"get":{"operationId":"listTeams","summary":"List teams including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeamResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/teams/{id}":{"get":{"operationId":"getTeam","summary":"Read one team or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writeTeam","summary":"Create, replace or restore one team.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteTeam"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteTeam","summary":"Mark one team deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/players":{"get":{"operationId":"listPlayers","summary":"List players including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PlayerResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/players/{id}":{"get":{"operationId":"getPlayer","summary":"Read one player or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{17}$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writePlayer","summary":"Create, replace or restore one player.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{17}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WritePlayer"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deletePlayer","summary":"Mark one player deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9]{17}$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/competitions":{"get":{"operationId":"listCompetitions","summary":"List competitions including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CompetitionResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/competitions/{id}":{"get":{"operationId":"getCompetition","summary":"Read one competition or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitionResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writeCompetition","summary":"Create, replace or restore one competition.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteCompetition"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitionResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteCompetition","summary":"Mark one competition deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitionResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/seasons":{"get":{"operationId":"listSeasons","summary":"List seasons including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SeasonResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/seasons/{id}":{"get":{"operationId":"getSeason","summary":"Read one season or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writeSeason","summary":"Create, replace or restore one season.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteSeason"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteSeason","summary":"Mark one season deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeasonResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/sections":{"get":{"operationId":"listSections","summary":"List sections including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SectionResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/sections/{id}":{"get":{"operationId":"getSection","summary":"Read one section or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writeSection","summary":"Create, replace or restore one section.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteSection"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteSection","summary":"Mark one section deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/maps":{"get":{"operationId":"listMaps","summary":"List maps including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MapResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/maps/{id}":{"get":{"operationId":"getMap","summary":"Read one map or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writeMap","summary":"Create, replace or restore one map.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteMap"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteMap","summary":"Mark one map deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/map-pools":{"get":{"operationId":"listMapPools","summary":"List map-pools including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MapPoolResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/map-pools/{id}":{"get":{"operationId":"getMapPool","summary":"Read one mapPool or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapPoolResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writeMapPool","summary":"Create, replace or restore one mapPool.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteMapPool"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapPoolResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteMapPool","summary":"Mark one mapPool deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapPoolResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/matches":{"get":{"operationId":"listMatchs","summary":"List matches including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MatchResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/matches/{id}":{"get":{"operationId":"getMatch","summary":"Read one match or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writeMatch","summary":"Create, replace or restore one match.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteMatch"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteMatch","summary":"Mark one match deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/startup-configs":{"get":{"operationId":"listStartupConfigs","summary":"List startup-configs including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StartupConfigResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/startup-configs/{id}":{"get":{"operationId":"getStartupConfig","summary":"Read one startupConfig or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartupConfigResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writeStartupConfig","summary":"Create, replace or restore one startupConfig.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WriteStartupConfig"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartupConfigResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteStartupConfig","summary":"Mark one startupConfig deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartupConfigResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/panel-templates":{"get":{"operationId":"listPanelTemplates","summary":"List panel-templates including tombstones.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Typed collection with per-entity revisions.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PanelTemplateResource"}}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/workspaces/{workspace}/panel-templates/{id}":{"get":{"operationId":"getPanelTemplate","summary":"Read one panelTemplate or its tombstone.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"responses":{"200":{"description":"Typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelTemplateResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"writePanelTemplate","summary":"Create, replace or restore one panelTemplate.","description":"Requires write scope and Editor/Manager role. expectedRevision is 0 for creation, otherwise the last read revision (including tombstones). data replaces the entity; its identity must match the path. Omitted optional fields take desktop defaults. Maximum 8 MiB request and 256000 serialized data characters.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WritePanelTemplate"}}}},"responses":{"200":{"description":"Committed typed resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelTemplateResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"409":{"description":"Stale revision or database conflict; reload and reconcile."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deletePanelTemplate","summary":"Mark one panelTemplate deleted; retain its revision.","description":"Requires write scope and Editor/Manager role. Referenced entities cannot be deleted without removing dependencies; use /changes for dependent changes. No physical deletion.","parameters":[{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Tombstone with null data and incremented revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PanelTemplateResource"}}}},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong workspace, insufficient key scope, or current workspace role."},"404":{"description":"Identity has never existed."},"409":{"description":"Stale revision or database conflict."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/organizations/{organization}/huds":{"get":{"operationId":"listCreatorHuds","summary":"List HUDs owned by the bound organization.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreatorHud"}}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"post":{"operationId":"createCreatorHud","summary":"Create a HUD entry in the bound organization.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorHudCreate"}}}},"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorHud"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/organizations/{organization}/huds/{hud}":{"get":{"operationId":"getCreatorHud","summary":"Read one owned HUD, including its package identity.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorHud"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/organizations/{organization}/huds/{hud}/details":{"get":{"operationId":"getCreatorHudDetails","summary":"Read editable localized HUD details and media references.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HudDetails"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"put":{"operationId":"setCreatorHudDetails","summary":"Replace localized HUD text and links using the last read revision.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetHudDetails"}}}},"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HudDetails"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}},"description":"Metadata belongs to the HUD, outside .souhud packages. Description, terms and license contain Markdown source, up to 8000 characters per field; raw HTML is untrusted. All new fields are currently optional. Every translated populated field requires its en equivalent. On update, omitted or null terms/license preserve existing values for retained language rows; send an empty string to clear them. An omitted language row is removed completely. Absolute HTTP(S) URLs only, without credentials. Replacing texts preserves media. Maximum 512 KiB JSON; 256 distinct normalized language tags. Reload after conflicts; never blindly retry writes."}},"/organizations/{organization}/huds/{hud}/media/{language}/{kind}":{"post":{"operationId":"uploadCreatorHudMedia","summary":"Add a gallery image or replace the preview/demo for one language.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"language","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":63,"description":"BCP 47 language tag, normalized to lowercase. Each populated translated field or media kind requires an English en counterpart."}},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["preview","gallery","demo"]}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}},{"name":"Content-Disposition","in":"header","required":false,"schema":{"type":"string"},"description":"Required for demo: attachment; filename=\u0022demo.mp4\u0022. File must have .mp4 extension."}],"requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"video/mp4":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HudDetails"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}},"description":"Send raw bytes. Preview: at least 1920 x 900 px, at most 5000000 bytes. Gallery: multiple images, each at least 1920 x 900 px and at most 10000000 bytes. Demo: MP4 video only, at most 50000000 bytes. Upload en for each media kind before another language. Images are decoded and dimensions checked; MP4 container and video sample structure are validated. Media changes increment the shared details revision. Current minimum gallery count is zero; three is a future requirement."}},"/organizations/{organization}/huds/{hud}/media/{media}":{"get":{"operationId":"getCreatorHudMedia","summary":"Read one owned HUD media file.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"media","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Media bytes with the validated image or MP4 content type.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"delete":{"operationId":"deleteCreatorHudMedia","summary":"Remove one media reference using the last read details revision.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"media","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"expectedRevision","in":"query","required":true,"schema":{"type":"integer","format":"int64","minimum":0}}],"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HudDetails"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/organizations/{organization}/huds/{hud}/grants":{"get":{"operationId":"listCreatorHudGrants","summary":"List all workspace grants and pending access requests for this HUD.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HudGrant"}}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}},"/organizations/{organization}/huds/{hud}/requests":{"get":{"operationId":"listCreatorHudRequests","summary":"List actual unhandled workspace access requests.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/HudGrant"}}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}},"description":"Returns only requested=true and approved=false. Historical unapproved records, denied requests and revoked grants are excluded. Never use all approved=false records as a pending-request queue."}},"/organizations/{organization}/huds/{hud}/grants/{workspace}":{"put":{"operationId":"setCreatorHudGrant","summary":"Approve/deny a request, grant direct access without a request, or revoke access.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"workspace","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetHudGrant"}}}},"responses":{"204":{"description":"Workspace grant saved; request marked handled."},"400":{"description":"Malformed JSON, invalid schema, reference, identity, or document kind."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Insufficient creator key scope or missing current Publisher permission."},"404":{"description":"HUD is outside the bound organization or workspace does not exist."},"409":{"description":"Concurrent change; read the current grants before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}},"description":"Send approved:true to approve an existing request or directly grant an existing workspace access without a prior request. Send approved:false to deny/revoke. Each decision clears requested. Requires read/write CreatorKey and a current explicit Publisher grant for the bound organization. It does not install a package or change running output. Existing subscriptions remain bound to the HUD, not one release."}},"/organizations/{organization}/huds/{hud}/releases":{"get":{"operationId":"listCreatorReleases","summary":"List all versions and review states of an owned HUD.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CreatorRelease"}}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}},"post":{"operationId":"uploadCreatorRelease","summary":"Upload a new immutable .souhud package version for an existing owned HUD.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorRelease"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}},"description":"Send raw .souhud ZIP bytes, no multipart wrapper. Maximum 128 MiB compressed and uncompressed total, at most 4096 ZIP entries, hud.json at most 64000 bytes. Uses the existing package validator: apiVersion 2; runtime blazor-wasm/web/lhm; valid entryPoint under wwwroot; version X.Y.Z with optional lowercase prerelease; stable globally unique package id. Existing versions cannot be overwritten, including rejected or pending versions. Updates require a new version. Uploads by accounts with creator trust are automatically approved after successful package validation; other uploads enter pending for regular review. Trust is account-bound, revocable, and does not grant Publisher rights or change existing review states. Keys cannot grant trust or make review decisions. Uploads do not change subscriptions, grants, listing, installed HUDs or running output. On response loss, inspect the release list and compare version and SHA-256 before retrying."}},"/organizations/{organization}/huds/{hud}/releases/{release}":{"get":{"operationId":"getCreatorRelease","summary":"Read upload status and the review note for one owned version.","security":[{"CreatorKey":[]}],"parameters":[{"name":"organization","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"hud","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"release","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Organization-scoped creator resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatorRelease"}}}},"400":{"description":"Malformed JSON, unsupported fields, missing English counterpart or invalid HUD content."},"401":{"description":"Missing, invalid, expired, revoked key or disabled account; WWW-Authenticate: Bearer."},"403":{"description":"Wrong organization, insufficient creator key scope or missing current explicit Publisher permission."},"404":{"description":"HUD, media or release not found within the bound organization."},"409":{"description":"Stale details revision, immutable version, package identity or concurrent database conflict; inspect the current state before retrying."},"413":{"description":"Request body exceeds the endpoint limit."},"415":{"description":"Unsupported media type. Packages require application/octet-stream; listing media require their validated image or MP4 type."},"429":{"description":"120 requests per minute per key owner; shared across their keys. Retry after the Retry-After interval.","headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds until retry (60)."}}},"500":{"description":"Unexpected server failure; do not assume a write failed. Reload and reconcile before retrying."}}}}},"components":{"securitySchemes":{"CreatorKey":{"type":"http","scheme":"bearer","bearerFormat":"sou_hud_\u003Cid\u003E_\u003Csecret\u003E","description":"Separate organization-bound creator key from /account/api-keys. Requires current explicit Publisher permission on every operation. Never a workspace or desktop key."},"WorkspaceKey":{"type":"http","scheme":"bearer","bearerFormat":"sou_ws_\u003Cid\u003E_\u003Csecret\u003E","description":"Workspace-bound API key from your account, not an OAuth desktop token. Send only in Authorization; never in a URL."}},"schemas":{"team":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"shortName":{"type":"string","maxLength":16},"logo":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"},"faceitId":{"type":"string","nullable":true},"dachcsId":{"type":"string","nullable":true}},"required":["id","name"]},"player":{"type":"object","additionalProperties":false,"properties":{"steamId":{"type":"string","pattern":"^[0-9]{17}$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"teamId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"avatar":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"},"isCoach":{"type":"boolean"}},"required":["steamId","name"]},"competition":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"logo":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg)$"},"sponsors":{"type":"array","items":{"$ref":"#/components/schemas/Sponsor"}}},"required":["id","name"]},"season":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"competitionId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},"required":["id","name","competitionId"]},"section":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"competitionId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"seasonId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"parentId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"kind":{"type":"integer","format":"int32","minimum":1,"maximum":6,"description":"1 Region, 2 Division, 3 Phase, 4 Group, 5 Round, 6 Other. Default 6."}},"required":["id","name","competitionId"]},"map":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"gameName":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[a-z0-9_][a-z0-9_/-]*$"},"logo":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"},"background":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"}},"required":["id","name","gameName"]},"mapPool":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"mapIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"uniqueItems":true}},"required":["id","name"]},"match":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"startsAt":{"type":"string","format":"date-time","nullable":true},"competitionId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"seasonId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"competitionSectionId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"competitionRound":{"type":"string","nullable":true,"maxLength":100},"faceitId":{"type":"string","nullable":true},"dachcsId":{"type":"string","nullable":true},"teamA":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"teamB":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"bestOf":{"type":"integer","format":"int32","minimum":1,"enum":[1,3,5,7],"default":3},"mapPoolId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"winsA":{"type":"integer","format":"int32","minimum":0},"winsB":{"type":"integer","format":"int32","minimum":0},"mapIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"uniqueItems":true},"mapResults":{"type":"array","items":{"$ref":"#/components/schemas/MapResult"},"nullable":true},"vetos":{"type":"array","items":{"$ref":"#/components/schemas/Veto"}}},"required":["id","name","teamA","teamB"]},"startupConfig":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"content":{"type":"string","maxLength":250000}},"required":["id","name","content"]},"panelTemplate":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"hudId":{"type":"string","minLength":1},"version":{"type":"string","minLength":1},"values":{"type":"object","additionalProperties":true}},"required":["id","hudId","version","values"]},"Sponsor":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"image":{"type":"string","nullable":false,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"}},"required":["id","name","image"]},"Veto":{"type":"object","additionalProperties":false,"properties":{"mapId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"type":{"type":"integer","format":"int32","minimum":0,"maximum":3,"description":"0 Unknown, 1 Pick, 2 Ban, 3 Decider."},"teamId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true}},"required":["mapId","type"]},"MapResult":{"type":"object","additionalProperties":false,"properties":{"mapId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"status":{"type":"integer","format":"int32","minimum":1,"maximum":3,"default":1,"description":"1 Pending, 2 Live, 3 Completed."},"scoreA":{"type":"integer","format":"int32","minimum":0,"nullable":true},"scoreB":{"type":"integer","format":"int32","minimum":0,"nullable":true}},"required":["mapId"]},"TeamResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"shortName":{"type":"string","maxLength":16},"logo":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"},"faceitId":{"type":"string","nullable":true},"dachcsId":{"type":"string","nullable":true}},"required":["id","name"],"nullable":true}},"required":["id","revision","deleted","data"]},"WriteTeam":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/team"}},"required":["expectedRevision","data"]},"TeamChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/team"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"PlayerResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{17}$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"steamId":{"type":"string","pattern":"^[0-9]{17}$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"teamId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"avatar":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"},"isCoach":{"type":"boolean"}},"required":["steamId","name"],"nullable":true}},"required":["id","revision","deleted","data"]},"WritePlayer":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/player"}},"required":["expectedRevision","data"]},"PlayerChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{17}$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/player"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^[0-9]{17}$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"CompetitionResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"logo":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg)$"},"sponsors":{"type":"array","items":{"$ref":"#/components/schemas/Sponsor"}}},"required":["id","name"],"nullable":true}},"required":["id","revision","deleted","data"]},"WriteCompetition":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/competition"}},"required":["expectedRevision","data"]},"CompetitionChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/competition"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"SeasonResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"competitionId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"}},"required":["id","name","competitionId"],"nullable":true}},"required":["id","revision","deleted","data"]},"WriteSeason":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/season"}},"required":["expectedRevision","data"]},"SeasonChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/season"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"SectionResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"competitionId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"seasonId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"parentId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"kind":{"type":"integer","format":"int32","minimum":1,"maximum":6,"description":"1 Region, 2 Division, 3 Phase, 4 Group, 5 Round, 6 Other. Default 6."}},"required":["id","name","competitionId"],"nullable":true}},"required":["id","revision","deleted","data"]},"WriteSection":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/section"}},"required":["expectedRevision","data"]},"SectionChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/section"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"MapResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"gameName":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[a-z0-9_][a-z0-9_/-]*$"},"logo":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"},"background":{"type":"string","nullable":true,"pattern":"^/cast-media/[a-f0-9]{64}\\.(png|jpg|gif)$"}},"required":["id","name","gameName"],"nullable":true}},"required":["id","revision","deleted","data"]},"WriteMap":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/map"}},"required":["expectedRevision","data"]},"MapChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/map"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"MapPoolResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"mapIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"uniqueItems":true}},"required":["id","name"],"nullable":true}},"required":["id","revision","deleted","data"]},"WriteMapPool":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/mapPool"}},"required":["expectedRevision","data"]},"MapPoolChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/mapPool"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"MatchResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"startsAt":{"type":"string","format":"date-time","nullable":true},"competitionId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"seasonId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"competitionSectionId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"competitionRound":{"type":"string","nullable":true,"maxLength":100},"faceitId":{"type":"string","nullable":true},"dachcsId":{"type":"string","nullable":true},"teamA":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"teamB":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"bestOf":{"type":"integer","format":"int32","minimum":1,"enum":[1,3,5,7],"default":3},"mapPoolId":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$","nullable":true},"winsA":{"type":"integer","format":"int32","minimum":0},"winsB":{"type":"integer","format":"int32","minimum":0},"mapIds":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"uniqueItems":true},"mapResults":{"type":"array","items":{"$ref":"#/components/schemas/MapResult"},"nullable":true},"vetos":{"type":"array","items":{"$ref":"#/components/schemas/Veto"}}},"required":["id","name","teamA","teamB"],"nullable":true}},"required":["id","revision","deleted","data"]},"WriteMatch":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/match"}},"required":["expectedRevision","data"]},"MatchChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/match"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"StartupConfigResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"content":{"type":"string","maxLength":250000}},"required":["id","name","content"],"nullable":true}},"required":["id","revision","deleted","data"]},"WriteStartupConfig":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/startupConfig"}},"required":["expectedRevision","data"]},"StartupConfigChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/startupConfig"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"PanelTemplateResource":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"revision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean"},"data":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"hudId":{"type":"string","minLength":1},"version":{"type":"string","minLength":1},"values":{"type":"object","additionalProperties":true}},"required":["id","hudId","version","values"],"nullable":true}},"required":["id","revision","deleted","data"]},"WritePanelTemplate":{"type":"object","additionalProperties":false,"properties":{"expectedRevision":{"type":"integer","format":"int64","minimum":0},"data":{"$ref":"#/components/schemas/panelTemplate"}},"required":["expectedRevision","data"]},"PanelTemplateChange":{"anyOf":[{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[false]},"data":{"$ref":"#/components/schemas/panelTemplate"}},"required":["id","expectedRevision","data"]},{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9_-]\u002B$"},"expectedRevision":{"type":"integer","format":"int64","minimum":0},"deleted":{"type":"boolean","enum":[true]},"data":{"type":"object","nullable":true,"enum":[null]}},"required":["id","expectedRevision","deleted"]}]},"WorkspaceChanges":{"type":"object","additionalProperties":false,"properties":{"teams":{"type":"array","items":{"$ref":"#/components/schemas/TeamChange"},"maxItems":5000},"players":{"type":"array","items":{"$ref":"#/components/schemas/PlayerChange"},"maxItems":5000},"competitions":{"type":"array","items":{"$ref":"#/components/schemas/CompetitionChange"},"maxItems":5000},"seasons":{"type":"array","items":{"$ref":"#/components/schemas/SeasonChange"},"maxItems":5000},"sections":{"type":"array","items":{"$ref":"#/components/schemas/SectionChange"},"maxItems":5000},"maps":{"type":"array","items":{"$ref":"#/components/schemas/MapChange"},"maxItems":5000},"mapPools":{"type":"array","items":{"$ref":"#/components/schemas/MapPoolChange"},"maxItems":5000},"matches":{"type":"array","items":{"$ref":"#/components/schemas/MatchChange"},"maxItems":5000},"startupConfigs":{"type":"array","items":{"$ref":"#/components/schemas/StartupConfigChange"},"maxItems":5000},"panelTemplates":{"type":"array","items":{"$ref":"#/components/schemas/PanelTemplateChange"},"maxItems":5000}},"minProperties":1},"WorkspaceSnapshot":{"type":"object","additionalProperties":false,"properties":{"teams":{"type":"array","items":{"$ref":"#/components/schemas/TeamResource"}},"players":{"type":"array","items":{"$ref":"#/components/schemas/PlayerResource"}},"competitions":{"type":"array","items":{"$ref":"#/components/schemas/CompetitionResource"}},"seasons":{"type":"array","items":{"$ref":"#/components/schemas/SeasonResource"}},"sections":{"type":"array","items":{"$ref":"#/components/schemas/SectionResource"}},"maps":{"type":"array","items":{"$ref":"#/components/schemas/MapResource"}},"mapPools":{"type":"array","items":{"$ref":"#/components/schemas/MapPoolResource"}},"matches":{"type":"array","items":{"$ref":"#/components/schemas/MatchResource"}},"startupConfigs":{"type":"array","items":{"$ref":"#/components/schemas/StartupConfigResource"}},"panelTemplates":{"type":"array","items":{"$ref":"#/components/schemas/PanelTemplateResource"}}},"required":["teams","players","competitions","seasons","sections","maps","mapPools","matches","startupConfigs","panelTemplates"]},"CheckMedia":{"type":"object","additionalProperties":false,"properties":{"names":{"type":"array","items":{"type":"string","pattern":"^[a-f0-9]{64}\\.(png|jpg|gif)$"},"description":"At most 5000 distinct names, 400000 body bytes; duplicates ignored."}},"required":["names"]},"MediaPresence":{"type":"object","additionalProperties":false,"properties":{"missing":{"type":"array","items":{"type":"string"}}},"required":["missing"]},"HudTranslationInput":{"type":"object","additionalProperties":false,"properties":{"language":{"type":"string","minLength":1,"maxLength":63,"description":"BCP 47 language tag, normalized to lowercase. Each populated translated field or media kind requires an English en counterpart."},"description":{"type":"string","nullable":true,"maxLength":8000,"description":"Markdown source stored verbatim, including indentation and line breaks; whitespace-only values are empty. Raw HTML is not trusted or executed."},"author":{"type":"string","nullable":true,"maxLength":200},"authorUrl":{"type":"string","nullable":true,"maxLength":2048},"imprintUrl":{"type":"string","nullable":true,"maxLength":2048},"privacyUrl":{"type":"string","nullable":true,"maxLength":2048},"terms":{"type":"string","nullable":true,"maxLength":8000,"description":"Markdown source stored verbatim, including indentation and line breaks; whitespace-only values are empty. Raw HTML is not trusted or executed. On update, null or an omitted value preserves the existing field in a retained language row; an explicit empty string clears it. Omitting a language row removes all of its text fields."},"license":{"type":"string","nullable":true,"maxLength":8000,"description":"Markdown source stored verbatim, including indentation and line breaks; whitespace-only values are empty. Raw HTML is not trusted or executed. On update, null or an omitted value preserves the existing field in a retained language row; an explicit empty string clears it. Omitting a language row removes all of its text fields."}},"required":["language"]},"HudMedia":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","format":"uuid"},"language":{"type":"string","minLength":1,"maxLength":63,"description":"BCP 47 language tag, normalized to lowercase. Each populated translated field or media kind requires an English en counterpart."},"kind":{"type":"string","enum":["preview","gallery","demo"]},"contentType":{"type":"string"},"length":{"type":"integer","format":"int64","minimum":1},"width":{"type":"integer","format":"int32","minimum":1,"nullable":true},"height":{"type":"integer","format":"int32","minimum":1,"nullable":true},"position":{"type":"integer","format":"int32","minimum":0}},"required":["id","language","kind","contentType","length","width","height","position"]},"HudTranslation":{"type":"object","additionalProperties":false,"properties":{"language":{"type":"string","minLength":1,"maxLength":63,"description":"BCP 47 language tag, normalized to lowercase. Each populated translated field or media kind requires an English en counterpart."},"description":{"type":"string","nullable":true,"maxLength":8000,"description":"Markdown source stored verbatim, including indentation and line breaks; whitespace-only values are empty. Raw HTML is not trusted or executed."},"author":{"type":"string","nullable":true,"maxLength":200},"authorUrl":{"type":"string","nullable":true,"maxLength":2048},"imprintUrl":{"type":"string","nullable":true,"maxLength":2048},"privacyUrl":{"type":"string","nullable":true,"maxLength":2048},"terms":{"type":"string","nullable":true,"maxLength":8000,"description":"Markdown source stored verbatim, including indentation and line breaks; whitespace-only values are empty. Raw HTML is not trusted or executed. On update, null or an omitted value preserves the existing field in a retained language row; an explicit empty string clears it. Omitting a language row removes all of its text fields."},"license":{"type":"string","nullable":true,"maxLength":8000,"description":"Markdown source stored verbatim, including indentation and line breaks; whitespace-only values are empty. Raw HTML is not trusted or executed. On update, null or an omitted value preserves the existing field in a retained language row; an explicit empty string clears it. Omitting a language row removes all of its text fields."},"preview":{"anyOf":[{"$ref":"#/components/schemas/HudMedia"},{"type":"object","nullable":true,"enum":[null]}]},"gallery":{"type":"array","items":{"$ref":"#/components/schemas/HudMedia"}},"demo":{"anyOf":[{"$ref":"#/components/schemas/HudMedia"},{"type":"object","nullable":true,"enum":[null]}]}},"required":["language","description","author","authorUrl","imprintUrl","privacyUrl","preview","gallery","demo"]},"HudDetails":{"type":"object","additionalProperties":false,"properties":{"revision":{"type":"integer","format":"int64","minimum":0},"translations":{"type":"array","items":{"$ref":"#/components/schemas/HudTranslation"}}},"required":["revision","translations"]},"SetHudDetails":{"type":"object","additionalProperties":false,"properties":{"revision":{"type":"integer","format":"int64","minimum":0},"translations":{"type":"array","items":{"$ref":"#/components/schemas/HudTranslationInput"},"maxItems":256}},"required":["revision","translations"]},"CreatorHudCreate":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"visibility":{"type":"string","enum":["private","open","approval"]},"translations":{"type":"array","items":{"$ref":"#/components/schemas/HudTranslationInput"},"nullable":true,"maxItems":256}},"required":["name","visibility"]},"CreatorHud":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","format":"uuid"},"organizationId":{"type":"string","format":"uuid"},"packageId":{"type":"string","nullable":true},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"\\S"},"visibility":{"type":"string","enum":["private","open","approval"]},"listed":{"type":"boolean"}},"required":["id","organizationId","packageId","name","visibility","listed"]},"CreatorRelease":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","format":"uuid"},"hudId":{"type":"string","format":"uuid"},"version":{"type":"string"},"hash":{"type":"string","pattern":"^[a-f0-9]{64}$"},"state":{"type":"string","enum":["pending","approved","rejected"]},"review":{"type":"string","nullable":true}},"required":["id","hudId","version","hash","state","review"]},"HudGrant":{"type":"object","additionalProperties":false,"properties":{"hudId":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"approved":{"type":"boolean"},"selectedReleaseId":{"type":"string","format":"uuid","nullable":true},"requested":{"type":"boolean"}},"required":["hudId","workspaceId","approved","selectedReleaseId","requested"]},"SetHudGrant":{"type":"object","additionalProperties":false,"properties":{"approved":{"type":"boolean"}},"required":["approved"]}}}}