Summary

HTTP-based control protocol for BluOS-powered players (Bluesound, NAD Electronics, DALI Loudspeakers product lines). The spec covers playback control, volume, queue management, presets, content browsing/search, player grouping, reboot, doorbell chimes, and direct input selection over TCP/IP using HTTP GET requests on port 11000.

Transport

protocols:
  - tcp
  - http
addressing:
  port: 11000
auth:
  type: none  # inferred: no auth procedure in source

Traits

- levelable  # inferred from volume/mute commands
- queryable  # inferred from /Status and /SyncStatus queries
- routable   # inferred from input selection commands
- powerable  # inferred from /reboot endpoint

Actions

- id: get_playback_status
  label: Get Playback Status
  kind: query
  command: "/Status"
  params: []

- id: get_sync_status
  label: Get Player and Group Sync Status
  kind: query
  command: "/SyncStatus"
  params: []

- id: set_volume_level
  label: Set Volume (Level)
  kind: action
  command: "/Volume?level={level}"
  params:
    - name: level
      type: integer
      description: Volume level 0-100

- id: set_volume_abs_db
  label: Set Volume (Absolute dB)
  kind: action
  command: "/Volume?abs_db={db}"
  params:
    - name: db
      type: number
      description: Volume in dB

- id: set_volume_relative_db
  label: Adjust Volume (Relative dB)
  kind: action
  command: "/Volume?db={delta-db}"
  params:
    - name: delta-db
      type: number
      description: Relative volume change in dB

- id: set_mute
  label: Set Mute
  kind: action
  command: "/Volume?mute={on_off}"
  params:
    - name: on_off
      type: integer
      description: 1 to mute, 0 to unmute

- id: volume_up
  label: Volume Up
  kind: action
  command: "/Volume?db=2"
  params: []

- id: volume_down
  label: Volume Down
  kind: action
  command: "/Volume?db=-2"
  params: []

- 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: play
  label: Play
  kind: action
  command: "/Play"
  params: []

- id: play_with_seek
  label: Play With Seek
  kind: action
  command: "/Play?seek={seconds}"
  params:
    - name: seconds
      type: integer
      description: Position in track to seek to

- id: play_with_seek_and_id
  label: Play With Seek and Track ID
  kind: action
  command: "/Play?seek={seconds}&id={trackid}"
  params:
    - name: seconds
      type: integer
      description: Position in track
    - name: trackid
      type: integer
      description: Track number in queue

- id: play_url
  label: Play Custom URL
  kind: action
  command: "/Play?url={encodedStreamURL}"
  params:
    - name: encodedStreamURL
      type: string
      description: URL-encoded stream URL

- id: pause
  label: Pause
  kind: action
  command: "/Pause"
  params: []

- id: pause_toggle
  label: Pause Toggle
  kind: action
  command: "/Pause?toggle=1"
  params: []

- id: stop
  label: Stop
  kind: action
  command: "/Stop"
  params: []

- id: skip
  label: Skip to Next Track
  kind: action
  command: "/Skip"
  params: []

- id: back
  label: Back to Previous Track
  kind: action
  command: "/Back"
  params: []

- id: set_shuffle
  label: Set Shuffle
  kind: action
  command: "/Shuffle?state={state}"
  params:
    - name: state
      type: integer
      description: 0 = off, 1 = on

- id: set_repeat
  label: Set Repeat
  kind: action
  command: "/Repeat?state={state}"
  params:
    - name: state
      type: integer
      description: 0 = repeat queue, 1 = repeat track, 2 = off

- id: streaming_action
  label: Streaming Radio Action
  kind: action
  command: "/Action?service={service-name}&{action-URL}"
  params:
    - name: service-name
      type: string
      description: Service name (e.g. Slacker)
    - name: action-URL
      type: string
      description: Action URL from /Status response (skip, love, ban, back)

- id: list_playlist
  label: List Play Queue
  kind: query
  command: "/Playlist"
  params: []

- id: get_playlist_status
  label: Get Play Queue Status
  kind: query
  command: "/Playlist?length=1"
  params: []

- id: get_playlist_page
  label: Get Play Queue Page
  kind: query
  command: "/Playlist?start={first}&end={last}"
  params:
    - name: first
      type: integer
      description: First queue entry
    - name: last
      type: integer
      description: Last queue entry

- id: delete_track
  label: Delete Track From Queue
  kind: action
  command: "/Delete?id={position}"
  params:
    - name: position
      type: integer
      description: Track position to remove

- id: move_track
  label: Move Track In Queue
  kind: action
  command: "/Move?new={destination}&old={origin}"
  params:
    - name: destination
      type: integer
      description: New track position
    - name: origin
      type: integer
      description: Old track position

- id: clear_queue
  label: Clear Play Queue
  kind: action
  command: "/Clear"
  params: []

- id: save_queue
  label: Save Play Queue
  kind: action
  command: "/Save?name={playlist_name}"
  params:
    - name: playlist_name
      type: string
      description: Name for saved playlist

- id: list_presets
  label: List Presets
  kind: query
  command: "/Presets"
  params: []

- id: load_preset
  label: Load Preset
  kind: action
  command: "/Preset?id={presetId}"
  params:
    - name: presetId
      type: integer
      description: Preset id; +1 for next, -1 for previous

- id: load_next_preset
  label: Load Next Preset
  kind: action
  command: "/Preset?id=+1"
  params: []

- id: load_previous_preset
  label: Load Previous Preset
  kind: action
  command: "/Preset?id=-1"
  params: []

- id: browse
  label: Browse Content
  kind: query
  command: "/Browse?key={key-value}"
  params:
    - name: key-value
      type: string
      description: URL-encoded browse key

- id: browse_with_context
  label: Browse With Context Menu
  kind: query
  command: "/Browse?key={key-value}&withContextMenuItems=1"
  params:
    - name: key-value
      type: string
      description: URL-encoded browse key

- id: search
  label: Search Content
  kind: query
  command: "/Browse?key={key-value}&q={searchText}"
  params:
    - name: key-value
      type: string
      description: URL-encoded key from searchKey attribute
    - name: searchText
      type: string
      description: Search query string

- id: add_slave
  label: Group Slave Player
  kind: action
  command: "/AddSlave?slave={secondaryPlayerIP}&port={secondaryPlayerPort}&group={GroupName}"
  params:
    - name: secondaryPlayerIP
      type: string
      description: IP of secondary player
    - name: secondaryPlayerPort
      type: integer
      description: Port of secondary player
    - name: GroupName
      type: string
      description: Optional group name

- id: add_slaves
  label: Group Multiple Slave Players
  kind: action
  command: "/AddSlave?slaves={secondaryPlayerIPs}&ports={secondaryPlayerPorts}"
  params:
    - name: secondaryPlayerIPs
      type: string
      description: Comma-separated secondary IPs
    - name: secondaryPlayerPorts
      type: string
      description: Comma-separated secondary ports

- id: remove_slave
  label: Ungroup Slave Player
  kind: action
  command: "/RemoveSlave?slave={secondaryPlayerIP}&port={secondaryPlayerPort}"
  params:
    - name: secondaryPlayerIP
      type: string
      description: IP of secondary player
    - name: secondaryPlayerPort
      type: integer
      description: Port of secondary player

- id: remove_slaves
  label: Ungroup Multiple Slave Players
  kind: action
  command: "/RemoveSlave?slaves={secondaryPlayerIPs}&ports={secondaryPlayerPorts}"
  params:
    - name: secondaryPlayerIPs
      type: string
      description: Comma-separated secondary IPs
    - name: secondaryPlayerPorts
      type: string
      description: Comma-separated secondary ports

- id: reboot
  label: Reboot Player
  kind: action
  command: "POST /reboot with parameter yes=1"
  params: []

- id: doorbell_chime
  label: Play Doorbell Chime
  kind: action
  command: "/Doorbell?play=1"
  params: []

- id: active_input_selection
  label: Select Active Input
  kind: action
  command: "/Play?url={URL_value}"
  params:
    - name: URL_value
      type: string
      description: URL attribute from /RadioBrowse?service=Capture response

- id: external_input_legacy
  label: External Input Selection (firmware <v3.8.0 or >v4.2.0)
  kind: action
  command: "/Play?inputIndex={IndexId}"
  params:
    - name: IndexId
      type: integer
      description: Input index (starts at 1), Bluetooth excluded

- id: external_input_v4_2
  label: External Input Selection (firmware v4.2.0+)
  kind: action
  command: "/Play?inputTypeIndex={type-index}"
  params:
    - name: type-index
      type: string
      description: Format type-index (e.g. spdif-2); type can be spdif, analog, coax, bluetooth, arc, earc, phono, computer, aesebu, balanced, microphone

- id: set_bluetooth_mode
  label: Set Bluetooth Mode
  kind: action
  command: "/audiomodes?bluetoothAutoplay={value}"
  params:
    - name: value
      type: integer
      description: 0 = Manual, 1 = Automatic, 2 = Guest, 3 = Disabled

Feedbacks

- id: playback_state
  type: enum
  values: [play, pause, stop, stream, connecting]
  description: Current player state from /Status response

- id: volume_level
  type: integer
  description: Volume level 0-100; -1 means fixed volume

- id: volume_db
  type: number
  description: Volume level in dB

- id: mute_state
  type: integer
  description: 1 if muted, 0 if unmuted

- id: shuffle_state
  type: integer
  description: 0 = off, 1 = on

- id: repeat_state
  type: integer
  description: 0 = repeat queue, 1 = repeat track, 2 = off

- id: sync_status
  type: object
  description: Player and group sync status from /SyncStatus response

- id: preset_list
  type: object
  description: List of presets from /Presets response

- id: playlist_status
  type: object
  description: Play queue status from /Playlist response

Variables

# UNRESOLVED: settable parameters beyond discrete commands not enumerated as separate actions in source

Events

# UNRESOLVED: source documents long-polling responses via /Status?timeout=... but does not describe unsolicited push notifications as separate event types

Macros

# UNRESOLVED: source does not describe multi-step macro sequences; remove section if not applicable

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source does not contain explicit safety warnings or interlock procedures

Notes

HTTP GET requests are sent to http://player_ip:port/request (port 11000 by default). Responses are UTF-8 encoded XML. Long-polling available via /Status?timeout=N&etag=... and /SyncStatus?timeout=N&etag=... (recommended interval 100s for Status, 180s for SyncStatus; do not poll faster than once per 30s without long-polling). The CI580 chassis uses ports 11000, 11010, 11020, 11030 for its four streamer nodes. Actual port should be discovered via mDNS using musc.tcp and musp.tcp services. Section 13 (LSDP discovery) describes a UDP broadcast discovery protocol on port 11430 but is out of scope for HTTP control commands. Custom integration commands documented in version 1.7 of the BluOS Custom Integration API.

Provenance

source_domains:
  - content-bluesound-com.s3.amazonaws.com
  - bluos.io
source_urls:
  - https://content-bluesound-com.s3.amazonaws.com/uploads/BluOS-Custom-Integration-API_v1.7.pdf
  - https://bluos.io/become-a-partner/
retrieved_at: 2026-06-07T20:52:55.756Z
last_checked_at: 2026-09-13T22:17:14.691Z

Verification Summary

verdict: verified
checked_at: 2026-09-13T22:17:14.691Z
matched_actions: 46
action_count: 46
confidence: medium
summary: "All 46 spec action literals found verbatim in source; transport (port 11000, HTTP GET, no auth) confirmed; source's 24 distinct endpoints are fully represented. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "list any major gaps here"
- "settable parameters beyond discrete commands not enumerated as separate actions in source"
- "source documents long-polling responses via /Status?timeout=... but does not describe unsolicited push notifications as separate event types"
- "source does not describe multi-step macro sequences; remove section if not applicable"
- "source does not contain explicit safety warnings or interlock procedures"
- "LSDP discovery protocol (Section 13) binary message formats (Query, Announce, Delete) not enumerated as HTTP actions; described separately as a UDP protocol on port 11430."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0