Summary
BluOS-based network audio player controlled via HTTP GET requests over TCP/IP on port 11000. Responses are UTF-8 encoded XML. Supports playback control, volume management, play queue operations, preset recall, content browsing, player grouping, direct input selection, Bluetooth mode configuration, doorbell chime playback, and soft reboot.
Transport
protocols:
- http
addressing:
base_url: "http://{player_ip}:11000"
port: 11000
auth:
type: none # inferred: no auth procedure in source
Traits
traits:
- powerable # inferred: reboot command present
- queryable # inferred: /Status, /SyncStatus queries present
- levelable # inferred: volume control commands present
- routable # inferred: input selection and player grouping commands present
Actions
actions:
- id: play
label: Play
kind: action
command: "/Play"
params:
- name: seek
type: integer
description: "Jump to position in seconds within current track"
- name: id
type: integer
description: "Track ID in queue to play"
- name: url
type: string
description: "URL-encoded stream URL to play (selects input when sourced from /RadioBrowse?service=Capture)"
- id: pause
label: Pause
kind: action
command: "/Pause"
params:
- name: toggle
type: integer
description: "Set to 1 to toggle current pause state"
- id: stop
label: Stop
kind: action
command: "/Stop"
params: []
- id: skip
label: Skip
kind: action
command: "/Skip"
params: []
- id: back
label: Back
kind: action
command: "/Back"
params: []
- id: shuffle
label: Set Shuffle
kind: action
command: "/Shuffle?state={state}"
params:
- name: state
type: integer
description: "0 to disable shuffle, 1 to enable shuffle"
- id: repeat
label: Set Repeat
kind: action
command: "/Repeat?state={state}"
params:
- name: state
type: integer
description: "0 = repeat queue, 1 = repeat track, 2 = repeat off"
- id: volume_set
label: Set Volume (level 0-100)
kind: action
command: "/Volume?level={level}&tell_slaves={tell_slaves}"
params:
- name: level
type: integer
description: "Absolute volume level 0-100"
- name: tell_slaves
type: integer
description: "0 = this player only, 1 = all grouped players"
- id: volume_set_db
label: Set Volume (absolute dB)
kind: action
command: "/Volume?abs_db={db}&tell_slaves={tell_slaves}"
params:
- name: db
type: number
description: "Absolute volume in dB (typically -80..0)"
- name: tell_slaves
type: integer
description: "0 = this player only, 1 = all grouped players"
- id: volume_set_db_delta
label: Set Volume (relative dB delta)
kind: action
command: "/Volume?db={delta_db}&tell_slaves={tell_slaves}"
params:
- name: delta_db
type: number
description: "Relative volume change in dB (positive or negative; typical increment is 2 dB)"
- name: tell_slaves
type: integer
description: "0 = this player only, 1 = all grouped players"
- id: volume_up
label: Volume Up
kind: action
command: "/Volume?db={delta_db}"
params:
- name: delta_db
type: number
description: "Positive dB delta (typical 2)"
- id: volume_down
label: Volume Down
kind: action
command: "/Volume?db={delta_db}"
params:
- name: delta_db
type: number
description: "Negative dB delta (typical -2)"
- id: mute_on
label: Mute On
kind: action
command: "/Volume?mute=1"
params: []
- id: mute_off
label: Mute Off
kind: action
command: "/Volume?mute=0"
params: []
- id: volume_query
label: Query Volume
kind: query
command: "/Volume"
params: []
- id: status_query
label: Playback Status Query
kind: query
command: "/Status"
params:
- name: timeout
type: integer
description: "Long-poll duration in seconds (recommended 100, min 10)"
- name: etag
type: string
description: "etag from previous /Status response for long-polling"
- id: sync_status_query
label: Player/Group Sync Status Query
kind: query
command: "/SyncStatus"
params:
- name: timeout
type: integer
description: "Long-poll duration in seconds (recommended 180)"
- name: etag
type: string
description: "etag from previous /SyncStatus response"
- id: playlist_query
label: List Play Queue
kind: query
command: "/Playlist"
params:
- name: length
type: integer
description: "Set to 1 to return only top-level attributes (no track details)"
- name: start
type: integer
description: "First queue entry index (0-based) for pagination"
- name: end
type: integer
description: "Last queue entry index for pagination"
- id: track_delete
label: Delete Track
kind: action
command: "/Delete?id={id}"
params:
- name: id
type: integer
description: "Position of track to delete from queue"
- id: track_move
label: Move Track
kind: action
command: "/Move?new={new}&old={old}"
params:
- name: new
type: integer
description: "New position in queue"
- name: old
type: integer
description: "Current position in queue"
- id: queue_clear
label: Clear Queue
kind: action
command: "/Clear"
params: []
- id: queue_save
label: Save Queue
kind: action
command: "/Save?name={name}"
params:
- name: name
type: string
description: "Name for the saved playlist"
- id: presets_list
label: List Presets
kind: query
command: "/Presets"
params: []
- id: preset_load
label: Load Preset
kind: action
command: "/Preset?id={id}"
params:
- name: id
type: string
description: "Preset ID number, or +1 for next, or -1 for previous"
- id: browse
label: Browse Content
kind: query
command: "/Browse?key={key}&withContextMenuItems={withContextMenuItems}"
params:
- name: key
type: string
description: "Browse key from previous response for navigation (URL-encoded)"
- name: withContextMenuItems
type: integer
description: "Set to 1 to include inline context menu"
- id: browse_top
label: Top-Level Browse
kind: query
command: "/Browse"
params: []
- id: search
label: Search Content
kind: query
command: "/Browse?key={key}&q={q}"
params:
- name: key
type: string
description: "Search key (searchKey) from browse response (URL-encoded)"
- name: q
type: string
description: "Search string"
- id: radio_browse
label: Browse Capture Inputs / Hub Inputs
kind: query
command: "/RadioBrowse?service=Capture"
params: []
- id: radio_action
label: Streaming Radio Action (generic)
kind: action
command: "/Action?service={service}&{action_param}={id}"
params:
- name: service
type: string
description: "Service name (e.g. Slacker)"
- name: action_param
type: string
description: "Action parameter name from <action> element (skip, back, love, ban)"
- name: id
type: string
description: "Track/action id from <action> element"
- id: radio_skip
label: Streaming Radio Skip
kind: action
command: "/Action?service={service}&skip={id}"
params:
- name: service
type: string
description: "Service name (e.g. Slacker)"
- name: id
type: string
description: "Track id from <action> url attribute"
- id: radio_back
label: Streaming Radio Back
kind: action
command: "/Action?service={service}&back={id}"
params:
- name: service
type: string
description: "Service name"
- name: id
type: string
description: "Track id from <action> url attribute"
- id: radio_love
label: Streaming Radio Love (favorite)
kind: action
command: "/Action?service={service}&love={id}"
params:
- name: service
type: string
description: "Service name"
- name: id
type: string
description: "Track id"
- id: radio_ban
label: Streaming Radio Ban (dislike + skip)
kind: action
command: "/Action?service={service}&ban={id}"
params:
- name: service
type: string
description: "Service name"
- name: id
type: string
description: "Track id"
- id: settings_query
label: Query Player Settings
kind: query
command: "/Settings?id=capture&schemaVersion=32"
params: []
- id: group_add
label: Add Player to Group (single)
kind: action
command: "/AddSlave?slave={slave}&port={port}&group={group}"
params:
- name: slave
type: string
description: "IP address of secondary player"
- name: port
type: integer
description: "Port of secondary player"
- name: group
type: string
description: "Optional group name"
- id: group_add_multi
label: Add Players to Group (multi)
kind: action
command: "/AddSlave?slaves={slaves}&ports={ports}"
params:
- name: slaves
type: string
description: "Comma-separated IP addresses"
- name: ports
type: string
description: "Comma-separated ports"
- id: group_remove
label: Remove Player from Group (single)
kind: action
command: "/RemoveSlave?slave={slave}&port={port}"
params:
- name: slave
type: string
description: "IP address of secondary player to remove"
- name: port
type: integer
description: "Port of secondary player"
- id: group_remove_multi
label: Remove Players from Group (multi)
kind: action
command: "/RemoveSlave?slaves={slaves}&ports={ports}"
params:
- name: slaves
type: string
description: "Comma-separated IP addresses"
- name: ports
type: string
description: "Comma-separated ports"
- id: input_select
label: Select Input (URL from Capture)
kind: action
command: "/Play?url={url}"
params:
- name: url
type: string
description: "URL value from /RadioBrowse?service=Capture response"
- id: input_select_index
label: Select Input (Index, fw 3.8.0-4.2.0)
kind: action
command: "/Play?inputIndex={inputIndex}"
params:
- name: inputIndex
type: integer
description: "1-based index from /Settings capture response (Bluetooth excluded)"
- id: input_select_type_index
label: Select Input (Type-Index, fw 4.2.0+)
kind: action
command: "/Play?inputTypeIndex={inputTypeIndex}"
params:
- name: inputTypeIndex
type: string
description: "Format type-index, e.g. spdif-1, analog-1, arc-1, earc-1, phono-1, coax-1, computer-1, aesebu-1, balanced-1, microphone-1, bluetooth-1"
- id: doorbell
label: Play Doorbell Chime
kind: action
command: "/Doorbell?play={play}"
params:
- name: play
type: integer
description: "Always 1 to play doorbell"
- id: bluetooth_mode
label: Set Bluetooth Mode
kind: action
command: "/audiomodes?bluetoothAutoplay={bluetoothAutoplay}"
params:
- name: bluetoothAutoplay
type: integer
description: "0=Manual, 1=Automatic, 2=Guest, 3=Disabled"
- id: reboot
label: Reboot Player
kind: action
command: "/reboot" # POST
method: POST
params:
- name: yes
type: string
description: "Any value to confirm reboot"
Feedbacks
feedbacks:
- id: playback_status
type: xml
description: "Full playback status from /Status including state, track info, volume, shuffle, repeat, sleep, alarm, battery, group info, syncStat, etag"
- id: sync_status
type: xml
description: "Player and group status from /SyncStatus including volume, grouping, model/brand info, master/slave topology, zone info, mac, etag"
- id: volume_status
type: xml
description: "Volume level from /Volume response including db, mute state, offsetDb, etag, muteDb, muteVolume"
- id: playlist_status
type: xml
description: "Play queue info from /Playlist including track list (with albumid, service, artistid, songid, id, title, art, alb), shuffle state, length, id, modified"
- id: playlist_summary
type: xml
description: "Queue top-level attributes only (no song details) from /Playlist?length=1"
- id: presets_list
type: xml
description: "List of presets from /Presets response with prid, name, id, url, image"
- id: browse_result
type: xml
description: "Content browse/search results from /Browse response with items, categories, searchKey, nextKey, parentKey, contextMenu"
- id: browse_error
type: xml
description: "Error response enclosed in <error> root element with <message> and zero or more <detail> text nodes"
- id: capture_inputs
type: xml
description: "Input list from /RadioBrowse?service=Capture including local inputs and HUB remote inputs with inputType, id, URL, image, serviceType"
- id: doorbell_status
type: xml
description: "Doorbell chime status from /Doorbell response with enable, volume, chime attributes"
- id: shuffle_response
type: xml
description: "Playlist state after /Shuffle: name, modified, length, shuffle, id"
- id: repeat_response
type: xml
description: "Playlist state after /Repeat: length, id, repeat"
- id: delete_response
type: xml
description: "Track deletion confirmation: <deleted>position</deleted>"
- id: move_response
type: xml
description: "Track move confirmation: <moved>moved</moved>"
- id: clear_response
type: xml
description: "Queue clear confirmation: <playlist modified length id/>"
- id: save_response
type: xml
description: "Save queue confirmation: <saved><entries>count</entries></saved>"
- id: preset_load_response
type: xml
description: "Preset load confirmation: <loaded service><entries>count</entries></loaded> for playlists, or <state>stream</state> for radio"
- id: group_add_response
type: xml
description: "Group add confirmation: <addSlave><slave port id/></addSlave>"
- id: settings_capture
type: xml
description: "Capture settings menu groups (Bluetooth, Analog Input, Optical Input, etc.) from /Settings?id=capture&schemaVersion=32"
- id: skip_response
type: xml
description: "Skip confirmation: <id>trackid</id>"
- id: back_response
type: xml
description: "Back confirmation: <id>trackid</id>"
- id: play_state_response
type: xml
description: "Play confirmation: <state>play|stream|pause|stop</state>"
- id: pause_state_response
type: xml
description: "Pause confirmation: <state>pause</state>"
- id: stop_state_response
type: xml
description: "Stop confirmation: <state>stop</state>"
- id: radio_action_ack
type: xml
description: "Streaming radio action ack: <skip/>, <back/>, or <love> with skip attribute and notification text"
Variables
variables:
- id: volume
type: integer
min: 0
max: 100
description: "Player volume level percentage; -1 means fixed volume"
- id: volume_db
type: number
description: "Volume level in dB scale (typically -80..0)"
- id: mute
type: enum
values: ["0", "1"]
description: "0 = unmuted, 1 = muted"
- id: shuffle_state
type: enum
values: ["0", "1"]
description: "0 = shuffle off, 1 = shuffle on"
- id: repeat_state
type: enum
values: ["0", "1", "2"]
description: "0 = repeat queue, 1 = repeat track, 2 = repeat off"
- id: playback_state
type: enum
values: ["play", "pause", "stop", "stream", "connecting"]
description: "Current player state (play and stream are equivalent)"
- id: bluetooth_autoplay
type: enum
values: ["0", "1", "2", "3"]
description: "Bluetooth source mode: 0=Manual, 1=Automatic, 2=Guest, 3=Disabled"
- id: doorbell_volume
type: integer
description: "Volume level for doorbell chime playback"
Events
# UNRESOLVED: no unsolicited push notification mechanism documented; long-polling via /Status?timeout&etag is the only documented change-detection mechanism
Macros
# UNRESOLVED: no multi-step macro sequences documented in source
Safety
confirmation_required_for:
- reboot
interlocks: []
# UNRESOLVED: no safety warnings or interlock procedures found in source
Notes
- All commands are HTTP GET requests except
/rebootwhich is HTTP POST. - Responses are UTF-8 encoded XML.
- Long polling supported on
/Statusand/SyncStatusviatimeoutandetagparameters. Recommended/Statustimeout 100s,/SyncStatus180s. - When not long-polling, restrict polling to at most one request every 30 seconds. When long-polling, never make two consecutive requests for the same resource less than 1 second apart.
- Player discovery via mDNS (services
musc.tcp,musp.tcp,muss.tcp,mush.tcp,musz.tcp,remote-web-ui.tcp,sovi-mfg.tcp,sovi-keypad.tcp) or LSDP (UDP port 11430, big-endian binary, packet magicLSDP, protocol version 1). - CI580 multi-zone player uses ports 11000, 11010, 11020, 11030 for nodes 1-4.
/Volume?mute=1mutes;/Volume?mute=0unmutes (counterintuitive: 1=mute).- Volume range is configurable via BluOS Controller app, typically -80..0 dB.
- Input selection has three API variants:
/Play?url=(always works),/Play?inputIndex=N(fw 3.8.0-4.2.0),/Play?inputTypeIndex=type-N(fw 4.2.0+). Supported input types include spdif, analog, coax, bluetooth, arc, earc, phono, computer, aesebu, balanced, microphone. - Grouped secondary players proxy many requests (
/Status, playback control, play queue, content browse/search) to the primary player internally. /RadioBrowse?service=Capturereturns both local inputs and remote HUB inputs (hub<ip-port>-input<N>ids).- LSDP startup packets: 7 packets at t=[0,1,2,3,5,7,10]s + 0-250ms jitter; main announce period 57s + 0-6s jitter; query response delay 0-750ms.
- LSDP class IDs: 0x0001=BluOS Player (
_musc._tcp), 0x0002=BluOS Server (_muss._tcp), 0x0003=BluOS Player secondary in multi-zone (_musp._tcp), 0x0004=sovi-mfg, 0x0005=sovi-keypad, 0x0006=BluOS Player pair slave (_musz._tcp), 0x0007=Remote Web App (_remote-web-ui._tcp), 0x0008=BluOS Hub (_mush._tcp), 0xFFFF=all classes. - Streaming radio actions return
<skip/>,<back/>, or<love>1</love>/<love skip="1">0</love>(ban) responses; root or notification attribute for user-facing messages.
Provenance
source_domains:
- bluos.io
source_urls:
- https://bluos.io/wp-content/uploads/2025/06/BluOS-Custom-Integration-API_v1.7.pdf
- https://bluos.io/wp-content/uploads/2025/05/BluOS_Crestron_Unified_Driver_Package_v1.6.0.zip
- https://bluos.io/wp-content/uploads/2025/11/BluOS_Control4_Driver_Package_v4.0.0.zip
- https://bluos.io/wp-content/uploads/2026/04/BluOS_RTI_Driver_Package_2.60.zip
- https://bluos.io/downloads/
retrieved_at: 2026-05-21T13:44:13.781Z
last_checked_at: 2026-07-21T23:32:29.657Z
Verification Summary
verdict: verified
checked_at: 2026-07-21T23:32:29.657Z
matched_actions: 44
action_count: 44
confidence: medium
summary: "All 44 spec actions map to documented BluOS HTTP endpoints with matching params; coverage exceeds the floor. (10 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "/AddFavourite?service=...&albumid=... (context-menu example only)"
- "/Add?service=...&playnow=...&where=... (context-menu example only)"
- "exact Audacy model hardware features (which inputs, display, etc.) not stated in source — doc covers all BluOS players generically"
- "no unsolicited push notification mechanism documented; long-polling via /Status?timeout&etag is the only documented change-detection mechanism"
- "no multi-step macro sequences documented in source"
- "no safety warnings or interlock procedures found in source"
- "firmware version compatibility ranges not stated for specific Audacy model"
- "exact Audacy-specific hardware inputs (optical, analog, HDMI ARC, etc.) not specified in source"
- "error response formats only partially documented (error root element mentioned for Browse)"
- "maximum concurrent connection limits not stated"
- "Add/RemoveFavourite endpoints referenced in browse contextMenu examples but not documented as standalone commands"
- "/Add?service=...&albumid=...&playnow=...&where=...` referenced in browse contextMenu but not documented as standalone action"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0