Summary

The NAD C 3050 Le Stereophonic Amplifier is a BluOS-enabled streaming amplifier. This spec covers the BluOS Custom Integration API: HTTP GET requests sent to the player that return UTF-8 encoded XML responses. Control covers playback, volume, queue management, presets, content browsing, and player grouping; service discovery uses both mDNS and LSDP (UDP broadcast on port 11430).

Transport

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

Traits

# - powerable       (play/stop commands present; explicit power on/off not documented)
# - routable        (inputType/index selection present; inferred from /Play input selection)
# - queryable       (/Status, /SyncStatus, /Playlist, /Presets queries present)
# - levelable       (/Volume level=0-100, abs_db, db controls present)

Actions

- id: status_query
  label: Playback Status Query
  kind: query
  command: "GET /Status?timeout={seconds}&etag={etag-value}"
  params:
    - name: timeout
      type: integer
      description: Optional long-polling timeout in seconds (recommended 100)
    - name: etag
      type: string
      description: Optional etag from previous /Status response for long-polling
- id: sync_status_query
  label: Player and Group Status Query
  kind: query
  command: "GET /SyncStatus?timeout={seconds}&etag={etag-value}"
  params:
    - name: timeout
      type: integer
      description: Optional long-polling timeout in seconds (recommended 180)
    - name: etag
      type: string
      description: Optional etag from previous /SyncStatus response for long-polling
- id: set_volume_level
  label: Set Volume (0-100)
  kind: action
  command: "GET /Volume?level={level}&tell_slaves={on_off}"
  params:
    - name: level
      type: integer
      description: Absolute volume level (0-100)
    - name: tell_slaves
      type: integer
      description: 0 = only this player; 1 = apply to all grouped players
- id: set_volume_abs_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
    - name: tell_slaves
      type: integer
      description: 0 = only this player; 1 = apply to all grouped players
- id: set_volume_relative_db
  label: Adjust Volume (relative dB)
  kind: action
  command: "GET /Volume?db={delta-db}&tell_slaves={on_off}"
  params:
    - name: db
      type: number
      description: Signed dB delta to apply
    - name: tell_slaves
      type: integer
      description: 0 = only this player; 1 = apply to all grouped players
- id: set_mute
  label: Set Mute
  kind: action
  command: "GET /Volume?mute={on_off}&tell_slaves={on_off}"
  params:
    - name: mute
      type: integer
      description: 0 = mute; 1 = unmute
    - name: tell_slaves
      type: integer
      description: 0 = only this player; 1 = apply to all grouped players
- id: play
  label: Play
  kind: action
  command: "GET /Play"
  params: []
- id: play_seek
  label: Play (seek)
  kind: action
  command: "GET /Play?seek={seconds}"
  params:
    - name: seek
      type: integer
      description: Jump to position in seconds within current track (only valid if /Status includes totlen)
- id: play_input
  label: Play (select input)
  kind: action
  command: "GET /Play?inputType={inputType}&index={index_num}"
  params:
    - name: inputType
      type: string
      description: Input type (analog, spdif, hdmi, bluetooth)
    - name: index
      type: integer
      description: Input number of specified type (default 1)
- id: pause
  label: Pause
  kind: action
  command: "GET /Pause"
  params: []
- id: pause_toggle
  label: Pause (toggle)
  kind: action
  command: "GET /Pause?toggle=1"
  params: []
- id: stop
  label: Stop
  kind: action
  command: "GET /Stop"
  params: []
- id: skip
  label: Skip
  kind: action
  command: "GET /Skip"
  params: []
- id: back
  label: Back
  kind: action
  command: "GET /Back"
  params: []
- id: shuffle
  label: Shuffle
  kind: action
  command: "GET /Shuffle?state={0|1}"
  params:
    - name: state
      type: integer
      description: 0 = disable shuffle; 1 = enable shuffle
- id: repeat
  label: Repeat
  kind: action
  command: "GET /Repeat?state={0|1|2}"
  params:
    - name: state
      type: integer
      description: 0 = repeat queue; 1 = repeat track; 2 = repeat off
- id: radio_action
  label: Streaming Radio Action
  kind: action
  command: "GET /Action?service={service-name}&{action-URL}"
  params:
    - name: service
      type: string
      description: Music service id (e.g. Slacker)
    - name: action-URL
      type: string
      description: Action URL from <action> element (skip / back / love / ban)
- id: playlist_query
  label: List Tracks
  kind: query
  command: "GET /Playlist?length=1"
  params:
    - name: length
      type: integer
      description: Return only top-level attributes (omit for full track listing)
- id: playlist_range
  label: List Tracks (range)
  kind: query
  command: "GET /Playlist?start={first}&end={last}"
  params:
    - name: start
      type: integer
      description: First entry index (starting from 0)
    - name: end
      type: integer
      description: Last entry index (inclusive)
- id: delete_track
  label: Delete Track
  kind: action
  command: "GET /Delete?id={position}"
  params:
    - name: id
      type: integer
      description: Track id to delete from current queue
- id: clear_queue
  label: Clear Queue
  kind: action
  command: "GET /Clear"
  params: []
- id: save_queue
  label: Save Queue
  kind: action
  command: "GET /Save?name={playlist_name}"
  params:
    - name: name
      type: string
      description: Name for the saved BluOS playlist
- id: presets_list
  label: List Presets
  kind: query
  command: "GET /Presets"
  params: []
- id: preset_load
  label: Load Preset
  kind: action
  command: "GET /Preset?id={presetId|+1|-1}"
  params:
    - name: id
      type: string
      description: Preset id to load; +1 for next preset, -1 for previous
- id: browse
  label: Browse Content
  kind: query
  command: "GET /Browse?key={key-value}"
  params:
    - name: key
      type: string
      description: Optional browseKey / nextKey / parentKey / contextMenuKey from earlier response (omit for top-level browse)
- id: search
  label: Search Content
  kind: query
  command: "GET /Browse?key={key-value}&q={searchText}"
  params:
    - name: key
      type: string
      description: searchKey from earlier response
    - name: q
      type: string
      description: Search string
- id: add_slave
  label: Group Two Players
  kind: action
  command: "GET /AddSlave?slave={secondaryPlayerIP}&port={secondaryPlayerPort}"
  params:
    - name: slave
      type: string
      description: IP address of secondary player
    - name: port
      type: integer
      description: Port of secondary player (default 11000)
- 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: IP of secondary player to remove
    - name: port
      type: integer
      description: Port of secondary player to remove
- 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: lsdp_query
  label: LSDP Service Query
  kind: action
  command: "LSDP Query (UDP broadcast, port 11430, message type Q=0x51 or R=0x52)"
  params:
    - name: classes
      type: string
      description: 16-bit class identifiers to query
- id: lsdp_announce
  label: LSDP Service Announce
  kind: action
  command: "LSDP Announce (UDP broadcast, port 11430, message type A=0x41)"
  params: []
- id: lsdp_delete
  label: LSDP Service Delete
  kind: action
  command: "LSDP Delete (UDP broadcast, port 11430, message type D=0x44)"
  params: []
- id: input_types_query
  label: Input Types Query
  kind: query
  command: "/RadioBrowse?service=Capture"
  params:
    - name: service
      type: string
      description: Fixed value Capture; response provides inputType attributes

Feedbacks

- id: status_response
  type: object
  values: [album, artist, state, volume, mute, db, mode, shuffle, repeat, song, totlen, secs, pid, prid, quality, service, title1, title2, title3, streamFormat, syncStat]
  query_command: "/Status"
- id: sync_status_response
  type: object
  values: [brand, model, modelName, name, volume, mute, db, group, id, mac, schemaVersion, etag, syncStat]
  query_command: "/SyncStatus"
- id: volume_response
  type: object
  values: [volume, db, mute, muteDb, muteVolume, etag, offsetDb]
  query_command: "/Volume"
- id: playlist_response
  type: object
  values: [id, name, length, modified, shuffle, repeat, song]
  query_command: "/Playlist"
- id: presets_response
  type: object
  values: [prid, name, id, url]
  query_command: "/Presets"
- id: browse_response
  type: object
  values: [sid, service, serviceName, serviceIcon, searchKey, nextKey, parentKey, type]
  query_command: "/Browse"
- id: action_skip_response
  type: enum
  values: [skip]
- id: action_back_response
  type: enum
  values: [back]
- id: action_love_response
  type: enum
  values: [love_1]
- id: action_ban_response
  type: enum
  values: [love_skip_1]
- id: add_slave_response
  type: object
  values: [slave_port, slave_id]
- id: remove_slave_response
  type: object
  values: [slave_port, slave_id]

Variables

- name: level
  type: integer
  description: Player volume 0-100 (-1 means fixed volume)
- name: db
  type: number
  description: Volume in dB; typical range bottom is -80.0
- name: mute
  type: integer
  description: Mute state (0 = muted, 1 = unmuted)
- name: state
  type: string
  description: Player state: play, pause, stop, stream, connecting, etc.
- name: shuffle
  type: integer
  description: Shuffle state (0 or 1)
- name: repeat
  type: integer
  description: Repeat state (0 = queue, 1 = track, 2 = off)

Events

# UNRESOLVED: source describes long-polling via /Status and /SyncStatus timeouts/etags as the change-detection mechanism; no explicit push/event channel documented.

Macros

# UNRESOLVED: source does not document multi-step sequences as macros.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings or interlock procedures.

Notes

  • Source is the BluOS Custom Integration API. Known protocol was reported as RS-232C but the refined document does not contain any serial/R-232 content; only HTTP (port 11000) and LSDP UDP (port 11430) are documented.
  • The C 3050 LE is a BluOS-equipped product; the API in the source applies generically to BluOS players. The CI580 is the only documented exception (multi-node, ports 11000/11010/11020/11030).
  • Long-polling is the recommended change-detection mechanism. Clients should restrict regular polling to at most one request every 30 seconds.
  • mDNS service types referenced: musc.tcp (BluOS Player, 0x0001), muss.tcp (BluOS Server, 0x0002), musp.tcp (BluOS Player secondary, 0x0003), sovi-mfg.tcp (manufacturing, 0x0004).
  • LSDP magic word: ASCII bytes "LSDP". LSDP protocol version: 1.

Provenance

source_domains:
  - nad.de
  - bluesoundprofessional.com
  - support.bluos.net
source_urls:
  - https://nad.de/wp-content/uploads/2021/01/Custom-Integration-API-v1.0_Dec_2020.pdf
  - https://bluesoundprofessional.com/wp-content/uploads/2025/06/BluOS-Custom-Integration-API_v1.7.pdf
  - https://support.bluos.net/hc/en-us
retrieved_at: 2026-08-09T06:07:28.945Z
last_checked_at: 2026-10-07T13:25:10.223Z

Verification Summary

verdict: verified
checked_at: 2026-10-07T13:25:10.223Z
matched_actions: 40
action_count: 40
confidence: medium
summary: "All 40 action units (34 actions + 6 query feedbacks) match the generic BluOS CI API source; transport matches; catalogue fully covered. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "known protocol was reported as RS-232C but the refined source describes only BluOS HTTP API and LSDP UDP discovery. No serial protocol is documented in the source."
- "source describes long-polling via /Status and /SyncStatus timeouts/etags as the change-detection mechanism; no explicit push/event channel documented."
- "source does not document multi-step sequences as macros."
- "source contains no safety warnings or interlock procedures."
- "firmware version compatibility not stated; RS-232C protocol from the known-protocol hint is not represented anywhere in the refined source."

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