Summary

This spec covers the BluOS HTTP control API and LSDP discovery protocol used by the NAD T775. Commands are HTTP GET requests sent to port 11000 on the player, returning UTF-8 encoded XML responses. Discovery is via UDP broadcast on port 11430 (LSDP) or mDNS.

Transport

protocols:
  - http
  - udp
addressing:
  port: 11000
auth:
  type: UNRESOLVED  # source does not state this (was inferred none: no auth procedure in source)

Traits

# UNRESOLVED: source documents BluOS API for streaming/zone players; no AV receiver-specific traits (powerable via discrete command, routable, levelable volume) are explicitly demonstrated

Actions

- id: status_query
  label: Playback Status
  kind: query
  command: "GET /Status?timeout={seconds}&etag={etag}"
  params:
    - name: timeout
      type: integer
      description: Optional long-polling timeout in seconds
    - name: etag
      type: string
      description: Optional etag from previous /Status response

- id: sync_status_query
  label: Player and Group Sync Status
  kind: query
  command: "GET /SyncStatus?timeout={seconds}&etag={etag}"
  params:
    - name: timeout
      type: integer
      description: Optional long-polling timeout in seconds
    - name: etag
      type: string
      description: Optional etag from previous /SyncStatus response

- id: set_volume
  label: Set Volume (level 0-100)
  kind: action
  command: "GET /Volume?level={level}&tell_slaves={on_off}"
  params:
    - name: level
      type: integer
      description: Absolute volume 0-100

- id: set_volume_db
  label: Set Volume (absolute dB)
  kind: action
  command: "GET /Volume?abs_db={db}&tell_slaves={on_off}"
  params:
    - name: abs_db
      type: number
      description: Absolute volume in dB

- id: set_volume_relative
  label: Set Volume (relative dB)
  kind: action
  command: "GET /Volume?db={delta-db}&tell_slaves={on_off}"
  params:
    - name: db
      type: number
      description: Positive or negative dB delta

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

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

- id: mute_on
  label: Mute On
  kind: action
  command: "GET /Volume?mute=1"

- id: mute_off
  label: Mute Off
  kind: action
  command: "GET /Volume?mute=0"

- id: play
  label: Play
  kind: action
  command: "GET /Play?seek={seconds}&id={trackid}"
  params:
    - name: seek
      type: integer
      description: Optional position in seconds
    - name: id
      type: integer
      description: Optional track id

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

- id: pause
  label: Pause
  kind: action
  command: "GET /Pause?toggle={toggle}"
  params:
    - name: toggle
      type: integer
      description: Optional, set 1 to toggle pause state

- id: stop
  label: Stop
  kind: action
  command: "GET /Stop"

- id: skip
  label: Skip
  kind: action
  command: "GET /Skip"

- id: back
  label: Back
  kind: action
  command: "GET /Back"

- id: shuffle
  label: Shuffle
  kind: action
  command: "GET /Shuffle?state={state}"
  params:
    - name: state
      type: integer
      description: 0 to disable, 1 to enable shuffle

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

- id: action_streaming_radio
  label: Streaming Radio Action (skip/love/ban)
  kind: action
  command: "GET /Action?service={service-name}&{action-URL}"
  params:
    - name: service
      type: string
      description: Service name (e.g. Slacker)
    - name: action
      type: string
      description: Action name and value as provided in <action> element

- id: playlist_query
  label: List Tracks / Queue Status
  kind: query
  command: "GET /Playlist?length={length}&start={first}&end={last}"

- id: delete_track
  label: Delete Track from Queue
  kind: action
  command: "GET /Delete?id={position}"
  params:
    - name: id
      type: integer
      description: Track position in queue

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

- id: clear_queue
  label: Clear Queue
  kind: action
  command: "GET /Clear"

- id: save_queue
  label: Save Queue as Playlist
  kind: action
  command: "GET /Save?name={playlist_name}"
  params:
    - name: name
      type: string
      description: Playlist name

- id: list_presets
  label: List Presets
  kind: query
  command: "GET /Presets"

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

- id: browse
  label: Browse Music Content
  kind: query
  command: "GET /Browse?key={key-value}&withContextMenuItems=1"
  params:
    - name: key
      type: string
      description: URL-encoded key from prior response
    - name: withContextMenuItems
      type: integer
      description: Set to 1 for inline context menu

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

- id: add_slave
  label: Group Two Players
  kind: action
  command: "GET /AddSlave?slave={secondaryPlayerIP}&port={secondaryPlayerPort}&group={GroupName}"
  params:
    - name: slave
      type: string
      description: Secondary player IP
    - name: port
      type: integer
      description: Secondary player port
    - name: group
      type: string
      description: Optional group name

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

- id: remove_slave
  label: Remove One Player From Group
  kind: action
  command: "GET /RemoveSlave?slave={secondaryPlayerIP}&port={secondaryPlayerPort}"
  params:
    - name: slave
      type: string
      description: Secondary player IP
    - name: port
      type: integer
      description: Secondary player port

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

- id: reboot
  label: Soft Reboot Player
  kind: action
  command: "POST /reboot with yes={value}"
  params:
    - name: yes
      type: string
      description: Any value, e.g. 1

- id: doorbell
  label: Play Doorbell Chime
  kind: action
  command: "GET /Doorbell?play=1"

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

- id: play_input_index
  label: Play Input by Index (firmware 3.8.0 - 4.2.0)
  kind: action
  command: "GET /Play?InputId={IndexId}"
  params:
    - name: inputIndex
      type: integer
      description: 1-based index, Bluetooth excluded

- id: play_input_type_index
  label: Play Input by Type-Index (firmware 4.2.0+)
  kind: action
  command: "GET /Play?inputTypeIndex={type-index}"
  params:
    - name: inputTypeIndex
      type: string
      description: e.g. spdif-2, analog-1, bluetooth-1, arc-1

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

Feedbacks

# UNRESOLVED: source documents XML response structures for /Status and /SyncStatus but does not enumerate a discrete enum/feedback set suitable for a control system; consumers typically poll and parse the full XML

Variables

# UNRESOLVED: source exposes volume, mute, shuffle, repeat as query response attributes; no settable variable distinct from the /Volume, /Shuffle, /Repeat actions is documented

Events

# UNRESOLVED: source describes long-polling behavior (etag + syncStat) but does not document a discrete unsolicited event channel

Macros

# UNRESOLVED: no multi-step sequences described in source

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or power-on sequencing requirements

Notes

  • Default BluOS HTTP control port is 11000; for the CI580 use 11000/11010/11020/11030 per node.
  • Long-polling recommended interval: 100s for /Status, 180s for /SyncStatus. Without long-polling, restrict to 1 req / 30s.
  • LSDP discovery uses UDP broadcast on port 11430; magic word "LSDP", protocol version 1.
  • Bluetooth mode values differ from /Play input selection; /Play uses inputTypeIndex for firmware v4.2.0+.
  • Document describes BluOS shared API (Bluesound, NAD, DALI); no T775-specific commands identified.
  • LSDP class IDs: 0x0001 BluOS Player, 0x0002 BluOS Server, 0x0003 BluOS Player (multi-zone secondary), 0x0008 BluOS Hub.

Provenance

source_domains:
  - bluos.io
source_urls:
  - https://bluos.io/wp-content/uploads/2025/06/BluOS-Custom-Integration-API_v1.7.pdf
retrieved_at: 2026-06-12T02:44:55.124Z
last_checked_at: 2026-10-01T11:41:48.043Z

Verification Summary

verdict: verified
checked_at: 2026-10-01T11:41:48.043Z
matched_actions: 37
action_count: 37
confidence: medium
summary: "All 37 spec actions match documented BluOS endpoints; transport port 11000 verified; auth explicitly UNRESOLVED. (10 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "source describes BluOS API shared across many NAD/Bluesound/DALI products; no T775-specific commands or T775-exclusive behavior found"
- "known protocol was stated as RS-232C but source contains no RS-232 content"
- "source documents BluOS API for streaming/zone players; no AV receiver-specific traits (powerable via discrete command, routable, levelable volume) are explicitly demonstrated"
- "source documents XML response structures for /Status and /SyncStatus but does not enumerate a discrete enum/feedback set suitable for a control system; consumers typically poll and parse the full XML"
- "source exposes volume, mute, shuffle, repeat as query response attributes; no settable variable distinct from the /Volume, /Shuffle, /Repeat actions is documented"
- "source describes long-polling behavior (etag + syncStat) but does not document a discrete unsolicited event channel"
- "no multi-step sequences described in source"
- "source contains no safety warnings, interlock procedures, or power-on sequencing requirements"
- "RS-232C content not present in source despite input hint; if T775 has a separate RS-232 protocol, a different source document is required"
- "T775 hardware-specific commands (input switching to HDMI, amp zone control, tone, surround modes) not present in this BluOS document"

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