Summary
QRC is a Unicode-based TCP/IP control protocol for Q-SYS audio/video cores. Client connects to port 1710 and sends JSON-RPC 2.0 null-terminated commands. Requires user credentials created in Q-SYS Designer software. Supports named control get/set, component control, change group polling, mixer control, loop player, and snapshot save/load.
Transport
protocols:
- tcp
addressing:
port: 1710
auth:
type: logon # Logon method requires User/Password; credentials created in Q-SYS Designer Users admin
Traits
# inferred from source:
# - queryable: Control.Get, Component.Get, StatusGet return values
# - levelable: gain, delay, mute controls present
# - routable: mixer crosspoint control present
# - snapshotable: Snapshot.Load/Save present
traits:
- queryable
- levelable
- routable
- snapshotable
Actions
# Connection / session management
- id: logon
label: Logon
kind: action
params:
- name: User
type: string
description: Username
- name: Password
type: string
description: Password
- id: noop
label: NoOp
kind: action
params: []
# Status
- id: status_get
label: StatusGet
kind: query
params: []
response:
Platform: Core model string
State: Idle | Active | Standby
DesignName: string
DesignCode: GUID string
IsRedundant: boolean
IsEmulator: boolean
# Control - named controls
- id: control_get
label: Control.Get
kind: query
params:
- name: controls
type: array
description: Array of Named Control strings
response:
- Name: string
Value: number | string | boolean
String: string
- id: control_set
label: Control.Set
kind: action
params:
- name: Name
type: string
description: Named Control name
- name: Value
type: any
description: New value
- name: Ramp
type: number
description: Optional ramp time in seconds
# Component control
- id: component_get
label: Component.Get
kind: query
params:
- name: Name
type: string
description: Named Component name
- name: Controls
type: array
description: Array of control names
- id: component_get_controls
label: Component.GetControls
kind: query
params:
- name: Name
type: string
description: Named Component name
response:
- Name: string
Type: Boolean | Float | String
Value: any
ValueMin: number
ValueMax: number
String: string
Position: number
Direction: Read/Write | Read only | Write only
- id: component_set
label: Component.Set
kind: action
params:
- name: Name
type: string
description: Named Component name
- name: Controls
type: array
description: Array of control value objects
- name: ResponseValues
type: boolean
description: Optional - return new values
- id: component_get_components
label: Component.GetComponents
kind: query
params: []
response:
- ID: string
Name: string
Type: string
Properties: array
Controls: null
ControlSource: number
# Change groups - max 4 per session
- id: change_group_add_control
label: ChangeGroup.AddControl
kind: action
params:
- name: Id
type: string
description: Change group ID
- name: Controls
type: array
description: Array of Named Control names
- id: change_group_add_component_control
label: ChangeGroup.AddComponentControl
kind: action
params:
- name: Id
type: string
description: Change group ID
- name: Component
type: object
description: "{ Name: string, Controls: array }"
- id: change_group_remove
label: ChangeGroup.Remove
kind: action
params:
- name: Id
type: string
description: Change group ID
- name: Controls
type: array
description: Array of control names
- id: change_group_poll
label: ChangeGroup.Poll
kind: query
params:
- name: Id
type: string
description: Change group ID
- id: change_group_destroy
label: ChangeGroup.Destroy
kind: action
params:
- name: Id
type: string
description: Change group ID
- id: change_group_invalidate
label: ChangeGroup.Invalidate
kind: action
params:
- name: Id
type: string
description: Change group ID
- id: change_group_clear
label: ChangeGroup.Clear
kind: action
params:
- name: Id
type: string
description: Change group ID
- id: change_group_auto_poll
label: ChangeGroup.AutoPoll
kind: action
params:
- name: Id
type: string
description: Change group ID
- name: Rate
type: number
description: Polling interval in seconds
# Mixer - string syntax: * | num | num-num | !negation
- id: mixer_set_cross_point_gain
label: Mixer.SetCrossPointGain
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Inputs
type: string
description: Input channel spec
- name: Outputs
type: string
description: Output channel spec
- name: Value
type: number
description: Gain in dB
- name: Ramp
type: number
description: Optional ramp time in seconds
- id: mixer_set_cross_point_delay
label: Mixer.SetCrossPointDelay
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Inputs
type: string
description: Input channel spec
- name: Outputs
type: string
description: Output channel spec
- name: Value
type: number
description: Delay in ms
- name: Ramp
type: number
description: Optional ramp time in seconds
- id: mixer_set_cross_point_mute
label: Mixer.SetCrossPointMute
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Inputs
type: string
description: Input channel spec
- name: Outputs
type: string
description: Output channel spec
- name: Value
type: boolean
- id: mixer_set_cross_point_solo
label: Mixer.SetCrossPointSolo
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Inputs
type: string
description: Input channel spec
- name: Outputs
type: string
description: Output channel spec
- name: Value
type: boolean
- id: mixer_set_input_gain
label: Mixer.SetInputGain
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Inputs
type: string
description: Input channel spec
- name: Value
type: number
description: Gain in dB
- name: Ramp
type: number
description: Optional ramp time in seconds
- id: mixer_set_input_mute
label: Mixer.SetInputMute
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Inputs
type: string
description: Input channel spec
- name: Value
type: boolean
- id: mixer_set_input_solo
label: Mixer.SetInputSolo
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Inputs
type: string
description: Input channel spec
- name: Value
type: boolean
- id: mixer_set_output_gain
label: Mixer.SetOutputGain
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Outputs
type: string
description: Output channel spec
- name: Value
type: number
description: Gain in dB
- name: Ramp
type: number
description: Optional ramp time in seconds
- id: mixer_set_output_mute
label: Mixer.SetOutputMute
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Outputs
type: string
description: Output channel spec
- name: Value
type: boolean
- id: mixer_set_cue_mute
label: Mixer.SetCueMute
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Cues
type: string
description: Cue spec
- name: Value
type: boolean
- id: mixer_set_cue_gain
label: Mixer.SetCueGain
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Cues
type: string
description: Cue spec
- name: Value
type: number
description: Gain in dB
- name: Ramp
type: number
description: Optional ramp time in seconds
- id: mixer_set_input_cue_enable
label: Mixer.SetInputCueEnable
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Cues
type: string
description: Cue spec
- name: Inputs
type: string
description: Input channel spec
- name: Value
type: boolean
- id: mixer_set_input_cue_afl
label: Mixer.SetInputCueAfl
kind: action
params:
- name: Name
type: string
description: Mixer name
- name: Cues
type: string
description: Cue spec
- name: Inputs
type: string
description: Input channel spec
- name: Value
type: boolean
# Loop Player
- id: loop_player_start
label: LoopPlayer.Start
kind: action
params:
- name: Name
type: string
description: Loop Player name
- name: StartTime
type: number
description: Time of day in seconds
- name: Files
type: array
description: Array of file specs
- name: Loop
type: boolean
- name: Log
type: boolean
- id: loop_player_stop
label: LoopPlayer.Stop
kind: action
params:
- name: Name
type: string
description: Loop Player name
- name: Outputs
type: array
description: Array of output numbers
- name: Log
type: boolean
- id: loop_player_cancel
label: LoopPlayer.Cancel
kind: action
params:
- name: Name
type: string
description: Loop Player name
- name: Outputs
type: array
description: Array of output numbers
- name: Log
type: boolean
# Snapshot
- id: snapshot_load
label: Snapshot.Load
kind: action
params:
- name: Name
type: string
description: Snapshot bank name
- name: Bank
type: integer
description: Snapshot number (1-based)
- name: Ramp
type: number
description: Optional ramp time in seconds
- id: snapshot_save
label: Snapshot.Save
kind: action
params:
- name: Name
type: string
description: Snapshot bank name
- name: Bank
type: integer
description: Snapshot number (1-based)
Feedbacks
# Unsolicited events:
- id: engine_status
type: object
description: Sent on connect and on any inventory status change
fields:
State: Idle | Active | Standby
DesignName: string
DesignCode: GUID string
IsRedundant: boolean
IsEmulator: boolean
# Error codes returned in JSON-RPC error objects:
- id: error_code
type: enum
values:
- -32700 # Parse error
- -32600 # Invalid request
- -32601 # Method not found
- -32602 # Invalid params
- -32603 # Server error
- -32604 # Core on standby (redundant config)
- 2 # Invalid Page Request ID
- 3 # Bad Page Request
- 4 # Missing file
- 5 # Change Groups exhausted
- 6 # Unknown change group
- 7 # Unknown component name
- 8 # Unknown control
- 9 # Illegal mixer channel index
- 10 # Logon required
Variables
# Any Named Control or Component Control is a variable.
# The source does not enumerate a fixed variable list - controls are
# defined in the Q-SYS design file and accessed via Control.Get/Set.
# UNRESOLVED: enumerate specific variable names - determined by design
Events
# EngineStatus - sent unsolicited on connect and on inventory change
# LoopPlayer.Error - sent when a loop player job fails (includes RefId)
# UNRESOLVED: full event list not documented in source
Macros
# UNRESOLVED: no explicit multi-step macros documented in source
Safety
confirmation_required_for: []
interlocks:
- description: In redundant Core configuration, commands return code -32604 (Core on Standby) when received by the non-active Core. All control must target the active Core.
# UNRESOLVED: power-on sequencing, fault recovery procedures not documented in source
Notes
- All QRC commands must be null-terminated (zero character after escape).
idin JSON-RPC requests is returned verbatim in responses — can be any number.- Change groups: maximum 4 groups, unlimited controls per group.
- Mixer string syntax supports:
*(all),1 2 3(list),1-6(range),!negation(exclude). - Null character termination requirement is a CRITICAL implementation detail.
Provenance
source_domains:
- help.qsys.com
source_urls:
- https://help.qsys.com/q-sys_10.0/Content/External_Control_APIs/QRC/QRC_Commands.htm
retrieved_at: 2026-05-13T16:00:00.000Z
last_checked_at: 2026-06-02T22:13:23.235Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T22:13:23.235Z
matched_actions: 35
action_count: 35
confidence: medium
summary: "All 35 spec actions traced to source (dip-safe re-verify). (8 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "specific Core model numbers not enumerated in source"
- "firmware version compatibility not stated"
- "enumerate specific variable names - determined by design"
- "full event list not documented in source"
- "no explicit multi-step macros documented in source"
- "power-on sequencing, fault recovery procedures not documented in source"
- "voltage/current/power specs not in source"
- "specific model numbers not enumerated beyond \"Core\" family reference"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0