# SPDX-License-Identifier: LicenseRef-NativeMindNONC # Freedome media server — GraphQL SDL v1 (02e §6). Transport: POST/GET /api/v1/graphql; subscriptions over graphql-ws # (`graphql-transport-ws` sub-protocol) on the same path; GraphiQL off by default. Depth ≤ 10, complexity budget per # scope. Shared scalars / directives / Event: graphql/common.graphql (conventions there). Query / Mutation fields are # 1:1 with the non-binary REST operationIds (parity.yaml); every field carries @auth with the OpenAPI x-scope # (`anon` = anonymous, `any` = any authenticated principal). Subscriptions cover the topic tree of events/topics.yaml # (typed fields + the generic `events` with + / # wildcards). schema { query: Query mutation: Mutation subscription: Subscription } # --------------------------------------------------------------------------------------------------------------- # Enums (open: UNKNOWN) enum HealthStatus { OK DEGRADED DOWN UNKNOWN } enum JobStatus { QUEUED RUNNING AWAITING_INPUT SUCCEEDED FAILED CANCELLED UNKNOWN } enum PlayerStatus { IDLE LOADING PLAYING PAUSED STOPPED ERROR UNKNOWN } enum EngineStatus { UP DEGRADED DOWN INCOMPATIBLE UNKNOWN } enum AudioMode { DIGITAL HYBRID COMBINED UNKNOWN } enum AssetStatus { UPLOADING PROCESSING READY FAILED UNKNOWN } enum AssetType { VIDEO IMAGE AUDIO ZELIM BORANKO COMICS REALTIME STREAM DOME OTHER UNKNOWN } enum Role { GUEST OPERATOR ADMIN SUPERADMIN UNKNOWN } enum PairingStatus { PENDING APPROVED DENIED EXPIRED UNKNOWN } enum AudioPresetKind { PROGRAMME PATTERN SESSION UNKNOWN } enum LogLevel { TRACE DEBUG INFO WARN ERROR UNKNOWN } enum SessionStatus { STARTING RUNNING PAUSED FINISHED STOPPED FAILED UNKNOWN } enum GatewayDirection { INBOUND OUTBOUND CONVERTER UNKNOWN } # --------------------------------------------------------------------------------------------------------------- # Discovery, system "GET /info (schemas/api/1.0/info.schema.json)." type ServerInfo { product: String! serverVersion: String! contractVersion: String instanceId: UUID! name: String apiVersions: [String!]! legacyProfile: Boolean "transports (rest, graphql, ws, socketio, osc ports)" transports: JSON auth: JSON venues: JSON capabilities: JSON links: JSON } type Health { status: HealthStatus! checks: JSON } type SystemStatus { host: JSON! temperatures: JSON disks: JSON uptimeSec: Float! serviceUptimeSec: Float versions: JSON! } type LogEntry { seq: Int ts: DateTime! level: LogLevel! target: String message: String! fields: JSON traceId: String } "Effective configuration; secrets are always \"***\"." type Config { revision: Int! values: JSON! redacted: [String!] restartRequired: [String!] } type UpdateStatus { status: String! current: JSON available: JSON jobId: UUID checkedAt: DateTime } type PowerAccepted { action: String! at: DateTime! } type ClockStatus { source: String! offsetMs: Float jitterMs: Float masterId: String locked: Boolean! } type Node { id: DocId! name: String role: String! status: String! address: String engines: [String!] clock: ClockStatus lastSeen: DateTime } "Long-running operation (schemas/api/1.0/job.schema.json)." type Job { id: UUID! kind: String! status: JobStatus! progress: Float message: String createdAt: DateTime! updatedAt: DateTime finishedAt: DateTime result: JSON problem: Problem links: JSON } # --------------------------------------------------------------------------------------------------------------- # Auth type Principal { subject: String! kind: String! name: String role: Role! scopes: [String!]! origin: String expiresAt: DateTime } type Tokens { accessToken: String! tokenType: String! expiresIn: Int! refreshToken: String refreshExpiresIn: Int scopes: [String!] principal: Principal } type Pairing { pairingId: UUID! status: PairingStatus! code: String qr: String app: String deviceName: String role: Role expiresAt: DateTime! tokens: Tokens } type User { id: UUID! username: String! displayName: String role: Role! disabled: Boolean revision: Int! createdAt: DateTime! updatedAt: DateTime lastLoginAt: DateTime } type ApiKey { id: String! name: String! role: Role! scopes: [String!]! prefix: String createdBy: String createdAt: DateTime! expiresAt: DateTime lastUsedAt: DateTime revokedAt: DateTime } type ApiKeyCreated { key: ApiKey! "fdk_ token — returned only here, once." token: String! } # --------------------------------------------------------------------------------------------------------------- # Venues, displays, output, calibration "Venue = .dome venue manifest + server fields (schemas/api/1.0/venue.schema.json)." type Venue { id: DocId! revision: Int! status: String! default: Boolean activeShowId: DocId "dome/1.1 #/$defs/meta" meta: JSON! "dome/1.1 #/$defs/dome" dome: JSON! displays: [Display!]! "dome/1.1 #/$defs/calibration" calibration: JSON "dome/1.1 #/$defs/audio (speaker layout)" speakerLayout: JSON compat: JSON createdAt: DateTime updatedAt: DateTime output: Output! @auth(scope: "playback:read") players: [Player!]! @auth(scope: "playback:read") player(playerId: DocId! = "main"): Player @auth(scope: "playback:read") audio: AudioState @auth(scope: "playback:read") activeShow: Show @auth(scope: "content:read") calibrationJobs(status: JobStatus): [CalibrationJob!]! } type DisplayState { online: Boolean! power: String shutter: String signal: Boolean temperatureC: Float "display/#/$defs/testPattern or null" pattern: JSON lastSeen: DateTime capabilities: [String!] faults: [String!] } type Display { id: DocId! venueId: DocId! revision: Int! "the .dome display entry (dome/1.1 #/$defs/display)" config: JSON! state: DisplayState! } type Output { brightness: Float! volume: Float! gainDb: Float mute: Boolean blackout: Boolean! rotation: Float lighting: Boolean ndi: JSON } type CalibrationJob { id: UUID! venueId: DocId! kind: String! status: JobStatus! progress: Float displays: [DocId!] speakers: [DocId!] steps: JSON currentStep: String awaiting: JSON errors: JSON result: JSON problem: Problem createdAt: DateTime! updatedAt: DateTime } # --------------------------------------------------------------------------------------------------------------- # Shows, playback type ShowWarning { code: String! detail: String! pointer: String } "Show = .dome show manifest + server fields (schemas/api/1.0/show.schema.json)." type Show { id: DocId! revision: Int! status: String meta: JSON! "dome/1.1 #/$defs/asset[]" assets: JSON! "dome/1.1 #/$defs/show" show: JSON! compat: JSON warnings: [ShowWarning!] createdAt: DateTime updatedAt: DateTime "REST URL of the .dome export (binary content is REST-only)" exportUrl: String! } type ShowSummary { id: DocId! revision: Int! meta: JSON! status: String assetCount: Int duration: Float updatedAt: DateTime } type MatrixCell { matrixId: DocId row: DocId! column: DocId! } type Player { id: DocId! venueId: DocId! name: String status: PlayerStatus! showId: DocId playlistId: DocId timelineId: DocId matrixCell: MatrixCell itemIndex: Int assetId: DocId position: Float! duration: Float rate: Float loop: Boolean volume: Float opacity: Float brightness: Float rotation: Float pending: Boolean scheduledAt: DateTime error: Problem revision: Int! updatedAt: DateTime } type PlayerPosition { venueId: DocId! playerId: DocId! position: Float! duration: Float rate: Float timecode: String } type CueActionResult { do: String! status: String! problem: Problem } type CueFired { cueId: DocId! showId: DocId! firedAt: DateTime! actions: [CueActionResult!] } type ActiveShow { venueId: DocId! showId: DocId warnings: [ShowWarning!] } type Parameter { path: String! type: String! "number | boolean | string" value: JSON! min: Float max: Float unit: String values: [String!] readOnly: Boolean description: String } # --------------------------------------------------------------------------------------------------------------- # Assets, uploads type Thumbnail { size: Int! url: String! } type Asset { id: DocId! name: String! type: AssetType! src: String "stream assets fed by a live source (asset.schema.json #/$defs/texture)" texture: JSON mediaType: String sha256: String size: Float status: AssetStatus! problem: Problem progress: Float "dome/1.1 #/$defs/mapping" mapping: JSON "probe data (asset.schema.json #/$defs/media)" media: JSON thumbnails: [Thumbnail!] tags: [String!] usedBy: [DocId!] revision: Int! createdAt: DateTime! updatedAt: DateTime "REST URL of the content (Range, ETag = sha256)" contentUrl: String! } type Upload { id: UUID! length: Float! offset: Float! status: String! metadata: JSON! assetId: DocId problem: Problem expiresAt: DateTime createdAt: DateTime! } type CountBytes { count: Int! bytes: Float! } type StorageStats { totalBytes: Float! usedBytes: Float! freeBytes: Float! quotaBytes: Float assets: CountBytes uploads: CountBytes byType: JSON } # --------------------------------------------------------------------------------------------------------------- # Audio type AudioEngineRef { status: String! version: String } type AudioState { venueId: DocId! mode: AudioMode! masterGainDb: Float! mute: Boolean! anantasound: AudioEngineRef anantadigital: AudioEngineRef layoutRevision: Int revision: Int! } type EqBand { type: String! frequencyHz: Float! gainDb: Float q: Float enabled: Boolean } type AudioZone { id: DocId! name: String speakers: [DocId!]! gainDb: Float! delayMs: Float eq: [EqBand!] mute: Boolean! revision: Int! } type AudioDevice { id: DocId! kind: String! name: String config: JSON state: JSON! } type AudioDeviceTestResult { deviceId: DocId! ok: Boolean! latencyMs: Float detail: String problem: Problem } type AudioPreset { id: DocId! kind: AudioPresetKind! title: JSON revision: Int! "ananta/1.0 programme | pattern | session document" document: JSON! sha256: String updatedAt: DateTime } type AudioPresetSummary { id: DocId! kind: AudioPresetKind! title: JSON revision: Int! } type AudioTargets { devices: [DocId!] zones: [DocId!] speakers: [DocId!] } type AudioSession { id: UUID! venueId: DocId! presetId: DocId! status: SessionStatus! engines: [String!] position: Float duration: Float itemIndex: Int targets: AudioTargets problem: Problem startedAt: DateTime! endedAt: DateTime } type GeneratorSettings { signal: String! frequencies: [Float!] gainDb: Float durationS: Float targets: AudioTargets } type AudioAnalysisState { venueId: DocId! enabled: Boolean! status: String! problem: Problem engine: String sampleRate: Int blockSize: Int "audio-reactive.schema.json #/$defs/input" inputs: JSON! } type AudioReactiveState { venueId: DocId! enabled: Boolean! status: String! problem: Problem activeSceneId: DocId intensity: Float! stats: JSON "gateway.schema.json #/$defs/resolumeStatus" resolume: JSON } type AudioReactiveScene { id: DocId! title: JSON! description: JSON revision: Int! "audio-reactive.schema.json #/$defs/mapping" mappings: JSON! } type TextureSource { id: DocId! transport: String! sender: String! application: String status: String! width: Int height: Int fps: Float pixelFormat: String assetId: DocId node: String lastSeen: DateTime } type GeneratorState { running: Boolean! settings: GeneratorSettings startedAt: DateTime } # --------------------------------------------------------------------------------------------------------------- # Engines, gateways, apps, clients, scenarios, devices type Engine { name: String! status: EngineStatus! version: String protocol: String endpoint: String nodes: [DocId!] backend: String backends: [String!] capabilities: JSON metrics: JSON problem: Problem since: DateTime } type Gateway { id: DocId! name: String direction: GatewayDirection! protocol: String! vendor: String enabled: Boolean! status: String! docsOnly: Boolean listeners: JSON peers: JSON config: JSON allowCidrs: [String!] problem: Problem stats: JSON "protocol resolume: gateway.schema.json #/$defs/resolumeStatus" resolume: JSON } type GatewayTestResult { gatewayId: DocId! ok: Boolean! latencyMs: Float remoteVersion: String detail: String problem: Problem } type AppPayload { id: UUID! app: String! kind: String! schema: String data: JSON publishedBy: String expiresAt: DateTime! } type Client { id: UUID! app: String! appVersion: String deviceName: String! platform: String capabilities: [String!]! principal: String commandsTopic: String registeredAt: DateTime! lastSeen: DateTime } type ClientCommand { command: String! params: JSON expiresAt: DateTime } type Scenario { id: String! version: String! api: String! title: JSON! description: JSON enabled: Boolean! "JSON Schema of the start parameters" paramsSchema: JSON! capabilities: [String!]! minRole: Role sessions: Int } type ScenarioSession { id: UUID! venueId: DocId! scenarioId: String! scenarioVersion: String status: SessionStatus! params: JSON! owner: String progress: Float phase: String message: String problem: Problem startedAt: DateTime! endedAt: DateTime } type ScenarioLogEntry { seq: Int! ts: DateTime! level: String! message: String! fields: JSON } type Device { id: DocId! serial: String product: String variant: String! hwRevision: String agentVersion: String protocolVersion: String capabilities: [String!] address: String! paired: Boolean! displayId: DocId state: JSON! } type DevicePairingStarted { deviceId: DocId! expiresAt: DateTime! codeLength: Int } # --------------------------------------------------------------------------------------------------------------- # Inputs (= JSON Schema request bodies, schemas/api/1.0) input TestPatternInput { kind: String! params: JSON face: Int } input DisplayPowerInput { on: Boolean shutter: String } input OutputPatch { brightness: Float volume: Float gainDb: Float mute: Boolean blackout: Boolean rotation: Float lighting: Boolean ndi: JSON } input CalibrationJobInput { kind: String! displays: [DocId!] speakers: [DocId!] options: JSON } input CalibrationCaptureInput { uploadId: UUID! stepId: DocId } input ClientInfoInput { app: String appVersion: String deviceName: String } input SessionInput { username: String! password: String! client: ClientInfoInput } input PairingInput { app: String! deviceName: String! requestedRole: Role } input PairingApprovalInput { approve: Boolean = true role: Role ttlSec: Int } input UserInput { username: String! displayName: String password: String! role: Role! disabled: Boolean } input UserPatch { displayName: String password: String role: Role disabled: Boolean } input ApiKeyInput { name: String! role: Role! scopes: [String!] expiresAt: DateTime } input UpdateInput { channel: String version: String uploadId: UUID components: [String!] } input PowerInput { confirm: Boolean! delaySec: Int reason: String } input ImportTargetInput { kind: String id: DocId replace: Boolean activate: Boolean } input ImportInput { uploadId: UUID url: String assetId: DocId format: String! target: ImportTargetInput options: JSON } input MatrixCellInput { matrixId: DocId row: DocId! column: DocId! } input PlayInput { showId: DocId playlistId: DocId itemIndex: Int timelineId: DocId matrixCell: MatrixCellInput assetId: DocId position: Float at: DateTime loop: Boolean } input SeekInput { position: Float marker: DocId normalized: Float at: DateTime } input PlayerPatch { rate: Float loop: Boolean volume: Float opacity: Float brightness: Float rotation: Float } input AssetInput { uploadId: UUID url: String fallbackUrl: String id: DocId name: String type: AssetType mapping: JSON tags: [String!] sha256: String } input AssetPatch { name: String type: AssetType mapping: JSON tags: [String!] } input AudioPatch { mode: AudioMode masterGainDb: Float mute: Boolean } input EqBandInput { type: String! frequencyHz: Float! gainDb: Float q: Float enabled: Boolean } input AudioZoneInput { name: String speakers: [DocId!]! gainDb: Float delayMs: Float eq: [EqBandInput!] mute: Boolean } input AudioZonePatch { name: String speakers: [DocId!] gainDb: Float delayMs: Float eq: [EqBandInput!] mute: Boolean } input AudioDevicePatch { name: String gainDb: Float mute: Boolean config: JSON } input AudioDeviceTestInput { kind: String frequencyHz: Float gainDb: Float durationS: Float } input AudioTargetsInput { devices: [DocId!] zones: [DocId!] speakers: [DocId!] } input AudioSessionInput { presetId: DocId! gainDb: Float targets: AudioTargetsInput at: DateTime loop: Boolean } input AudioAnalysisInput { enabled: Boolean! "audio-reactive.schema.json #/$defs/input" inputs: JSON! } input AudioReactivePatch { enabled: Boolean activeSceneId: DocId intensity: Float } input AudioReactiveSceneInput { title: JSON! description: JSON mappings: JSON! } input GeneratorInput { signal: String! frequencies: [Float!] gainDb: Float durationS: Float targets: AudioTargetsInput } input SourcePositionInput { azimuth: Float! elevation: Float! distance: Float rampMs: Float } input GatewayPatch { enabled: Boolean config: JSON allowCidrs: [String!] } input OscArgInput { type: String! value: JSON } input SendOscInput { target: DocId! address: String! args: [OscArgInput!] } input AppPayloadInput { kind: String! schema: String data: JSON! ttlSec: Int venueId: DocId playerId: DocId } input ClientInput { app: String! appVersion: String deviceName: String! platform: String capabilities: [String!] } input TelemetrySampleInput { ts: DateTime! sensor: String! values: [Float!]! unit: String } input ScenarioSessionInput { scenarioId: String! params: JSON at: DateTime } # --------------------------------------------------------------------------------------------------------------- # Relay connections type VenueEdge { cursor: String! node: Venue! } type VenueConnection { edges: [VenueEdge!]! nodes: [Venue!]! pageInfo: PageInfo! } type DisplayEdge { cursor: String! node: Display! } type DisplayConnection { edges: [DisplayEdge!]! nodes: [Display!]! pageInfo: PageInfo! } type CalibrationJobEdge { cursor: String! node: CalibrationJob! } type CalibrationJobConnection { edges: [CalibrationJobEdge!]! nodes: [CalibrationJob!]! pageInfo: PageInfo! } type PairingEdge { cursor: String! node: Pairing! } type PairingConnection { edges: [PairingEdge!]! nodes: [Pairing!]! pageInfo: PageInfo! } type UserEdge { cursor: String! node: User! } type UserConnection { edges: [UserEdge!]! nodes: [User!]! pageInfo: PageInfo! } type ApiKeyEdge { cursor: String! node: ApiKey! } type ApiKeyConnection { edges: [ApiKeyEdge!]! nodes: [ApiKey!]! pageInfo: PageInfo! } type LogEntryEdge { cursor: String! node: LogEntry! } type LogEntryConnection { edges: [LogEntryEdge!]! nodes: [LogEntry!]! pageInfo: PageInfo! } type NodeEdge { cursor: String! node: Node! } type NodeConnection { edges: [NodeEdge!]! nodes: [Node!]! pageInfo: PageInfo! } type ShowSummaryEdge { cursor: String! node: ShowSummary! } type ShowSummaryConnection { edges: [ShowSummaryEdge!]! nodes: [ShowSummary!]! pageInfo: PageInfo! } type PlayerEdge { cursor: String! node: Player! } type PlayerConnection { edges: [PlayerEdge!]! nodes: [Player!]! pageInfo: PageInfo! } type ParameterEdge { cursor: String! node: Parameter! } type ParameterConnection { edges: [ParameterEdge!]! nodes: [Parameter!]! pageInfo: PageInfo! } type AssetEdge { cursor: String! node: Asset! } type AssetConnection { edges: [AssetEdge!]! nodes: [Asset!]! pageInfo: PageInfo! } type AudioZoneEdge { cursor: String! node: AudioZone! } type AudioZoneConnection { edges: [AudioZoneEdge!]! nodes: [AudioZone!]! pageInfo: PageInfo! } type AudioDeviceEdge { cursor: String! node: AudioDevice! } type AudioDeviceConnection { edges: [AudioDeviceEdge!]! nodes: [AudioDevice!]! pageInfo: PageInfo! } type AudioPresetSummaryEdge { cursor: String! node: AudioPresetSummary! } type AudioPresetSummaryConnection { edges: [AudioPresetSummaryEdge!]! nodes: [AudioPresetSummary!]! pageInfo: PageInfo! } type AudioSessionEdge { cursor: String! node: AudioSession! } type AudioSessionConnection { edges: [AudioSessionEdge!]! nodes: [AudioSession!]! pageInfo: PageInfo! } type EngineEdge { cursor: String! node: Engine! } type EngineConnection { edges: [EngineEdge!]! nodes: [Engine!]! pageInfo: PageInfo! } type AudioReactiveSceneEdge { cursor: String! node: AudioReactiveScene! } type AudioReactiveSceneConnection { edges: [AudioReactiveSceneEdge!]! nodes: [AudioReactiveScene!]! pageInfo: PageInfo! } type TextureSourceEdge { cursor: String! node: TextureSource! } type TextureSourceConnection { edges: [TextureSourceEdge!]! nodes: [TextureSource!]! pageInfo: PageInfo! } type GatewayEdge { cursor: String! node: Gateway! } type GatewayConnection { edges: [GatewayEdge!]! nodes: [Gateway!]! pageInfo: PageInfo! } type ClientEdge { cursor: String! node: Client! } type ClientConnection { edges: [ClientEdge!]! nodes: [Client!]! pageInfo: PageInfo! } type ScenarioEdge { cursor: String! node: Scenario! } type ScenarioConnection { edges: [ScenarioEdge!]! nodes: [Scenario!]! pageInfo: PageInfo! } type ScenarioSessionEdge { cursor: String! node: ScenarioSession! } type ScenarioSessionConnection { edges: [ScenarioSessionEdge!]! nodes: [ScenarioSession!]! pageInfo: PageInfo! } type ScenarioLogEntryEdge { cursor: String! node: ScenarioLogEntry! } type ScenarioLogEntryConnection { edges: [ScenarioLogEntryEdge!]! nodes: [ScenarioLogEntry!]! pageInfo: PageInfo! } type DeviceEdge { cursor: String! node: Device! } type DeviceConnection { edges: [DeviceEdge!]! nodes: [Device!]! pageInfo: PageInfo! } type JobEdge { cursor: String! node: Job! } type JobConnection { edges: [JobEdge!]! nodes: [Job!]! pageInfo: PageInfo! } # --------------------------------------------------------------------------------------------------------------- "Reads — one field per non-binary GET operation." type Query { info: ServerInfo! @auth(scope: "anon") health: Health! @auth(scope: "anon") ready: Health! @auth(scope: "anon") venues(first: Int, after: String): VenueConnection! @auth(scope: "info:read") venue(venueId: DocId! = "default"): Venue @auth(scope: "info:read") displays(venueId: DocId! = "default", first: Int, after: String): DisplayConnection! @auth(scope: "info:read") display(venueId: DocId! = "default", displayId: DocId!): Display @auth(scope: "info:read") output(venueId: DocId! = "default"): Output @auth(scope: "playback:read") calibration(venueId: DocId! = "default"): JSON @auth(scope: "info:read") calibrationJobs(venueId: DocId! = "default", status: JobStatus, first: Int, after: String): CalibrationJobConnection! @auth(scope: "info:read") calibrationJob(venueId: DocId! = "default", jobId: UUID!): CalibrationJob @auth(scope: "info:read") pairings(first: Int, after: String): PairingConnection! @auth(scope: "users:manage") pairing(pairingId: UUID!): Pairing @auth(scope: "anon") me: Principal @auth(scope: "any") users(first: Int, after: String, q: String): UserConnection! @auth(scope: "users:manage") user(userId: UUID!): User @auth(scope: "users:manage") apiKeys(first: Int, after: String): ApiKeyConnection! @auth(scope: "keys:manage") apiKey(keyId: String!): ApiKey @auth(scope: "keys:manage") system: SystemStatus! @auth(scope: "system:read") logs(first: Int, after: String, since: DateTime, level: LogLevel): LogEntryConnection! @auth(scope: "system:read") config: Config! @auth(scope: "system:read") updateStatus: UpdateStatus! @auth(scope: "system:read") nodes(first: Int, after: String): NodeConnection! @auth(scope: "info:read") node(nodeId: DocId!): Node @auth(scope: "info:read") shows(first: Int, after: String, q: String, tag: String, sort: String): ShowSummaryConnection! @auth(scope: "content:read") show(showId: DocId!): Show @auth(scope: "content:read") playlist(showId: DocId!, itemId: DocId!): JSON @auth(scope: "content:read") timeline(showId: DocId!, itemId: DocId!): JSON @auth(scope: "content:read") cue(showId: DocId!, itemId: DocId!): JSON @auth(scope: "content:read") trigger(showId: DocId!, itemId: DocId!): JSON @auth(scope: "content:read") matrix(showId: DocId!): JSON @auth(scope: "content:read") players(venueId: DocId! = "default", first: Int, after: String): PlayerConnection! @auth(scope: "playback:read") player(venueId: DocId! = "default", playerId: DocId! = "main"): Player @auth(scope: "playback:read") activeShow(venueId: DocId! = "default"): ActiveShow @auth(scope: "playback:read") parameters(venueId: DocId! = "default", prefix: String, first: Int, after: String): ParameterConnection! @auth(scope: "playback:read") parameter(venueId: DocId! = "default", path: String!): Parameter @auth(scope: "playback:read") upload(uploadId: UUID!): Upload @auth(scope: "content:write") assets(first: Int, after: String, type: AssetType, tag: String, status: AssetStatus, q: String, sort: String): AssetConnection! @auth(scope: "content:read") asset(assetId: DocId!): Asset @auth(scope: "content:read") storageStats: StorageStats! @auth(scope: "content:read") audio(venueId: DocId! = "default"): AudioState @auth(scope: "playback:read") speakerLayout(venueId: DocId! = "default"): JSON @auth(scope: "info:read") audioZones(venueId: DocId! = "default", first: Int, after: String): AudioZoneConnection! @auth(scope: "playback:read") audioZone(venueId: DocId! = "default", zoneId: DocId!): AudioZone @auth(scope: "playback:read") audioDevices(venueId: DocId! = "default", kind: String, first: Int, after: String): AudioDeviceConnection! @auth(scope: "playback:read") audioDevice(venueId: DocId! = "default", deviceId: DocId!): AudioDevice @auth(scope: "playback:read") audioPresets(venueId: DocId! = "default", kind: AudioPresetKind, first: Int, after: String): AudioPresetSummaryConnection! @auth(scope: "content:read") audioPreset(venueId: DocId! = "default", presetId: DocId!): AudioPreset @auth(scope: "content:read") audioSessions(venueId: DocId! = "default", first: Int, after: String): AudioSessionConnection! @auth(scope: "playback:read") audioSession(venueId: DocId! = "default", sessionId: UUID!): AudioSession @auth(scope: "playback:read") generator(venueId: DocId! = "default"): GeneratorState @auth(scope: "playback:read") audioAnalysis(venueId: DocId! = "default"): AudioAnalysisState @auth(scope: "playback:read") audioReactive(venueId: DocId! = "default"): AudioReactiveState @auth(scope: "playback:read") audioReactiveScenes(venueId: DocId! = "default", first: Int, after: String): AudioReactiveSceneConnection! @auth(scope: "content:read") audioReactiveScene(venueId: DocId! = "default", sceneId: DocId!): AudioReactiveScene @auth(scope: "content:read") textureSources(venueId: DocId! = "default", first: Int, after: String): TextureSourceConnection! @auth(scope: "playback:read") engines(first: Int, after: String): EngineConnection! @auth(scope: "info:read") engine(name: String!): Engine @auth(scope: "info:read") gateways(first: Int, after: String): GatewayConnection! @auth(scope: "gateways:manage") gateway(gatewayId: DocId!): Gateway @auth(scope: "gateways:manage") clients(first: Int, after: String): ClientConnection! @auth(scope: "system:read") events(topics: [String!]!, sinceSeq: Int, first: Int, after: String): EventConnection! @auth(scope: "events:subscribe") scenarios(first: Int, after: String): ScenarioConnection! @auth(scope: "content:read") scenario(scenarioId: String!): Scenario @auth(scope: "content:read") scenarioSessions(venueId: DocId! = "default", first: Int, after: String): ScenarioSessionConnection! @auth(scope: "playback:read") scenarioSession(venueId: DocId! = "default", sessionId: UUID!): ScenarioSession @auth(scope: "playback:read") scenarioSessionLog(venueId: DocId! = "default", sessionId: UUID!, first: Int, after: String): ScenarioLogEntryConnection! @auth(scope: "playback:read") devices(first: Int, after: String): DeviceConnection! @auth(scope: "info:read") device(deviceId: DocId!): Device @auth(scope: "info:read") jobs(first: Int, after: String, kind: String, status: JobStatus): JobConnection! @auth(scope: "any") job(jobId: UUID!): Job @auth(scope: "any") } "Commands — field name = REST operationId." type Mutation { createVenue(venue: JSON!): Venue! @auth(scope: "venues:write") putVenue(venueId: DocId!, venue: JSON!, ifMatch: Int, createOnly: Boolean): Venue! @auth(scope: "venues:write") patchVenue(venueId: DocId! = "default", patch: JSON!, ifMatch: Int!): Venue! @auth(scope: "venues:write") deleteVenue(venueId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "venues:write") activateVenue(venueId: DocId!): Venue! @auth(scope: "venues:write") patchDisplay(venueId: DocId! = "default", displayId: DocId!, patch: JSON!, ifMatch: Int!): Display! @auth(scope: "venues:write") identifyDisplay(venueId: DocId! = "default", displayId: DocId!, durationS: Float): Boolean! @auth(scope: "displays:control") setTestPattern(venueId: DocId! = "default", displayId: DocId!, pattern: TestPatternInput!): DisplayState! @auth(scope: "displays:control") setDisplayPower(venueId: DocId! = "default", displayId: DocId!, input: DisplayPowerInput!): DisplayState! @auth(scope: "displays:control") patchOutput(venueId: DocId! = "default", patch: OutputPatch!): Output! @auth(scope: "playback:control") startCalibrationJob(venueId: DocId! = "default", input: CalibrationJobInput!): CalibrationJob! @auth(scope: "calibration:run") submitCalibrationCapture(venueId: DocId! = "default", jobId: UUID!, input: CalibrationCaptureInput!): CalibrationJob! @auth(scope: "calibration:run") applyCalibrationJob(venueId: DocId! = "default", jobId: UUID!): CalibrationJob! @auth(scope: "calibration:run") cancelCalibrationJob(venueId: DocId! = "default", jobId: UUID!): CalibrationJob! @auth(scope: "calibration:run") createSession(input: SessionInput!): Tokens! @auth(scope: "anon") deleteSession: Boolean! @auth(scope: "any") refreshSession(refreshToken: String!): Tokens! @auth(scope: "anon") exchangeCloudToken(subjectToken: String!, client: ClientInfoInput): Tokens! @auth(scope: "anon") createPairing(input: PairingInput!): Pairing! @auth(scope: "anon") approvePairing(pairingId: UUID!, input: PairingApprovalInput): Pairing! @auth(scope: "users:manage") createUser(input: UserInput!): User! @auth(scope: "users:manage") patchUser(userId: UUID!, patch: UserPatch!, ifMatch: Int!): User! @auth(scope: "users:manage") deleteUser(userId: UUID!, ifMatch: Int!): Boolean! @auth(scope: "users:manage") createApiKey(input: ApiKeyInput!): ApiKeyCreated! @auth(scope: "keys:manage") deleteApiKey(keyId: String!): Boolean! @auth(scope: "keys:manage") clearLogs: Boolean! @auth(scope: "system:admin") putConfig(values: JSON!, ifMatch: Int!): Config! @auth(scope: "system:admin") runDiagnostics(checks: [String!]): Job! @auth(scope: "system:read") createBackup(include: [String!], note: String): Job! @auth(scope: "system:admin") restoreBackup(uploadId: UUID!, confirm: Boolean!): Job! @auth(scope: "system:admin") startUpdate(input: UpdateInput): Job! @auth(scope: "system:admin") rebootSystem(input: PowerInput!): PowerAccepted! @auth(scope: "system:admin") shutdownSystem(input: PowerInput!): PowerAccepted! @auth(scope: "system:admin") createShow(show: JSON!): Show! @auth(scope: "content:write") putShow(showId: DocId!, show: JSON!, ifMatch: Int, createOnly: Boolean): Show! @auth(scope: "content:write") patchShow(showId: DocId!, patch: JSON!, ifMatch: Int!): Show! @auth(scope: "content:write") deleteShow(showId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "content:write") putPlaylist(showId: DocId!, itemId: DocId!, playlist: JSON!, ifMatch: Int!): JSON! @auth(scope: "content:write") deletePlaylist(showId: DocId!, itemId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "content:write") putTimeline(showId: DocId!, itemId: DocId!, timeline: JSON!, ifMatch: Int!): JSON! @auth(scope: "content:write") deleteTimeline(showId: DocId!, itemId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "content:write") putCue(showId: DocId!, itemId: DocId!, cue: JSON!, ifMatch: Int!): JSON! @auth(scope: "content:write") deleteCue(showId: DocId!, itemId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "content:write") putTrigger(showId: DocId!, itemId: DocId!, trigger: JSON!, ifMatch: Int!): JSON! @auth(scope: "content:write") deleteTrigger(showId: DocId!, itemId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "content:write") putMatrix(showId: DocId!, matrix: JSON!, ifMatch: Int!): JSON! @auth(scope: "content:write") startImport(input: ImportInput!): Job! @auth(scope: "content:write") patchPlayer(venueId: DocId! = "default", playerId: DocId! = "main", patch: PlayerPatch!): Player! @auth(scope: "playback:control") play(venueId: DocId! = "default", playerId: DocId! = "main", input: PlayInput): Player! @auth(scope: "playback:control") pause(venueId: DocId! = "default", playerId: DocId! = "main"): Player! @auth(scope: "playback:control") resume(venueId: DocId! = "default", playerId: DocId! = "main"): Player! @auth(scope: "playback:control") stop(venueId: DocId! = "default", playerId: DocId! = "main"): Player! @auth(scope: "playback:control") next(venueId: DocId! = "default", playerId: DocId! = "main"): Player! @auth(scope: "playback:control") previous(venueId: DocId! = "default", playerId: DocId! = "main"): Player! @auth(scope: "playback:control") seek(venueId: DocId! = "default", playerId: DocId! = "main", input: SeekInput!): Player! @auth(scope: "playback:control") fireCue(venueId: DocId! = "default", cueId: DocId!, showId: DocId): CueFired! @auth(scope: "playback:control") setActiveShow(venueId: DocId! = "default", showId: DocId, autoplay: Boolean = false): ActiveShow! @auth(scope: "playback:control") setParameter(venueId: DocId! = "default", path: String!, value: JSON!, fadeSec: Float): Parameter! @auth(scope: "playback:control") createAsset(input: AssetInput!): Asset! @auth(scope: "content:write") patchAsset(assetId: DocId!, patch: AssetPatch!, ifMatch: Int!): Asset! @auth(scope: "content:write") deleteAsset(assetId: DocId!, ifMatch: Int!, force: Boolean = false): Boolean! @auth(scope: "content:write") patchAudio(venueId: DocId! = "default", patch: AudioPatch!): AudioState! @auth(scope: "audio:control") putSpeakerLayout(venueId: DocId! = "default", layout: JSON!, ifMatch: Int!): JSON! @auth(scope: "venues:write") putAudioZone(venueId: DocId! = "default", zoneId: DocId!, input: AudioZoneInput!, ifMatch: Int, createOnly: Boolean): AudioZone! @auth(scope: "audio:control") patchAudioZone(venueId: DocId! = "default", zoneId: DocId!, patch: AudioZonePatch!): AudioZone! @auth(scope: "audio:control") deleteAudioZone(venueId: DocId! = "default", zoneId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "audio:control") patchAudioDevice(venueId: DocId! = "default", deviceId: DocId!, patch: AudioDevicePatch!): AudioDevice! @auth(scope: "audio:control") testAudioDevice(venueId: DocId! = "default", deviceId: DocId!, input: AudioDeviceTestInput): AudioDeviceTestResult! @auth(scope: "audio:control") putAudioPreset(venueId: DocId! = "default", presetId: DocId!, kind: AudioPresetKind!, document: JSON!, ifMatch: Int, createOnly: Boolean): AudioPreset! @auth(scope: "content:write") deleteAudioPreset(venueId: DocId! = "default", presetId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "content:write") startAudioSession(venueId: DocId! = "default", input: AudioSessionInput!): AudioSession! @auth(scope: "audio:control") stopAudioSession(venueId: DocId! = "default", sessionId: UUID!): Boolean! @auth(scope: "audio:control") setGenerator(venueId: DocId! = "default", input: GeneratorInput!): GeneratorState! @auth(scope: "audio:control") stopGenerator(venueId: DocId! = "default"): Boolean! @auth(scope: "audio:control") setAudioAnalysis(venueId: DocId! = "default", input: AudioAnalysisInput!): AudioAnalysisState! @auth(scope: "audio:control") patchAudioReactive(venueId: DocId! = "default", patch: AudioReactivePatch!): AudioReactiveState! @auth(scope: "playback:control") putAudioReactiveScene(venueId: DocId! = "default", sceneId: DocId!, input: AudioReactiveSceneInput!, ifMatch: Int, createOnly: Boolean): AudioReactiveScene! @auth(scope: "content:write") deleteAudioReactiveScene(venueId: DocId! = "default", sceneId: DocId!, ifMatch: Int!): Boolean! @auth(scope: "content:write") setSourcePosition(venueId: DocId! = "default", sourceId: DocId!, input: SourcePositionInput!): Boolean! @auth(scope: "audio:control") setComputeBackend(backend: String!): Engine! @auth(scope: "system:admin") restartEngine(name: String!): Job! @auth(scope: "system:admin") patchGateway(gatewayId: DocId!, patch: GatewayPatch!, ifMatch: Int!): Gateway! @auth(scope: "gateways:manage") testGateway(gatewayId: DocId!): GatewayTestResult! @auth(scope: "gateways:manage") sendOsc(input: SendOscInput!): Boolean! @auth(scope: "gateways:manage") publishAppPayload(app: String!, input: AppPayloadInput!): AppPayload! @auth(scope: "apps:publish") clearAppPayloads(app: String!): Boolean! @auth(scope: "apps:publish") registerClient(input: ClientInput!): Client! @auth(scope: "any") unregisterClient(clientId: UUID!): Boolean! @auth(scope: "any") postClientTelemetry(clientId: UUID!, samples: [TelemetrySampleInput!]!): Boolean! @auth(scope: "any") patchScenario(scenarioId: String!, enabled: Boolean!): Scenario! @auth(scope: "system:admin") startScenarioSession(venueId: DocId! = "default", input: ScenarioSessionInput!): ScenarioSession! @auth(scope: "playback:control") pauseScenarioSession(venueId: DocId! = "default", sessionId: UUID!): ScenarioSession! @auth(scope: "playback:control") resumeScenarioSession(venueId: DocId! = "default", sessionId: UUID!): ScenarioSession! @auth(scope: "playback:control") stopScenarioSession(venueId: DocId! = "default", sessionId: UUID!): ScenarioSession! @auth(scope: "playback:control") beginDevicePairing(deviceId: DocId!): DevicePairingStarted! @auth(scope: "venues:write") confirmDevicePairing(deviceId: DocId!, code: String!): Device! @auth(scope: "venues:write") unpairDevice(deviceId: DocId!): Boolean! @auth(scope: "venues:write") bindDevice(deviceId: DocId!, displayId: DocId, ifMatch: Int!): Device! @auth(scope: "venues:write") cancelJob(jobId: UUID!): Job! @auth(scope: "any") } "Topic tree (events/topics.yaml): typed fields + generic `events` with + / # wildcards." type Subscription { events(topics: [String!]!, sinceSeq: Int): Event! @auth(scope: "events:subscribe") systemHealth: Health! @auth(scope: "info:read") "name = `visual` also matches node-qualified engines `visual@` (prefix before `@`); absent = all engines" engineChanged(name: String): Engine! @auth(scope: "info:read") nodeChanged(nodeId: DocId): Node! @auth(scope: "info:read") venueChanged(venueId: DocId! = "default"): Venue! @auth(scope: "info:read") outputChanged(venueId: DocId! = "default"): Output! @auth(scope: "playback:read") playerChanged(venueId: DocId! = "default", playerId: DocId! = "main"): Player! @auth(scope: "playback:read") playerPosition(venueId: DocId! = "default", playerId: DocId! = "main", hz: Float = 4): PlayerPosition! @auth(scope: "playback:read") cueFired(venueId: DocId! = "default"): CueFired! @auth(scope: "playback:read") parameterChanged(venueId: DocId! = "default", prefix: String): Parameter! @auth(scope: "playback:read") displayChanged(venueId: DocId! = "default", displayId: DocId): Display! @auth(scope: "info:read") calibrationJobChanged(jobId: UUID!): CalibrationJob! @auth(scope: "info:read") audioChanged(venueId: DocId! = "default"): AudioState! @auth(scope: "playback:read") audioSessionChanged(venueId: DocId! = "default", sessionId: UUID): AudioSession! @auth(scope: "playback:read") scenarioSessionChanged(venueId: DocId! = "default", sessionId: UUID): ScenarioSession! @auth(scope: "playback:read") showChanged(showId: DocId): Event! @auth(scope: "content:read") assetChanged(assetId: DocId): Asset! @auth(scope: "content:read") uploadProgress(uploadId: UUID!): Upload! @auth(scope: "content:write") jobChanged(jobId: UUID!): Job! @auth(scope: "any") gatewayChanged(gatewayId: DocId): Gateway! @auth(scope: "gateways:manage") appPayload(app: String!): AppPayload! @auth(scope: "info:read") clientCommand(clientId: UUID!): ClientCommand! @auth(scope: "any") deviceChanged(deviceId: DocId): Device! @auth(scope: "info:read") }