Bose SoundTouch Toolkit

Documentation for controlling and preserving Bose SoundTouch devices

View the Project on GitHub gesellix/Bose-SoundTouch

Unimplemented SoundTouch API Endpoints

Last Updated: January 2026
Source: SoundTouch Plus Wiki
Current Implementation: 35 endpoints (including preset & navigation management discovered via SoundTouch Plus Wiki)
Wiki Documentation: 87 endpoints
Implementation Gap: 52 endpoints

This document provides comprehensive information about SoundTouch API endpoints documented in the community wiki but not yet implemented in this Go library. All examples are based on real device responses and extensive community testing.


Implementation Priority Matrix

πŸ”₯ Critical Priority (12 endpoints)

Essential user functionality that significantly impacts user experience.

🎯 High Priority (13 endpoints)

Smart home integration and advanced user features.

πŸ“Š Medium Priority (19 endpoints)

Professional features and system administration.

πŸ”§ Low Priority (10 endpoints)

Specialized hardware-specific features.

Note: 6 critical priority endpoints have been implemented: preset management (storePreset, removePreset) and content navigation/station management (navigate, searchStation, addStation, removeStation). These endpoints were discovered through the comprehensive SoundTouch Plus Wiki, which documents additional functionality beyond the official API.


Critical Priority Implementation Candidates

Preset Management βœ… IMPLEMENTED

Essential for saving and managing favorite stations and playlists.

POST /storePreset βœ… REVERSE-ENGINEERED & IMPLEMENTED

Stores a preset to the device (maximum 6 presets).

Status: COMPLETE - Successfully implemented using endpoints documented in the SoundTouch Plus Wiki despite official API marking as β€œN/A”

Implementation Notes: RESOLVED - Special thanks to the SoundTouch Plus community for documenting these working endpoints

POST /removePreset βœ… IMPLEMENTED

Removes an existing preset from the device.

Status: COMPLETE - Successfully implemented using endpoints from the SoundTouch Plus Wiki

GET /selectPreset βœ… ALREADY AVAILABLE

Selects and plays a preset by ID.

Status: AVAILABLE - Implemented via key commands

Music Service Management

Critical for streaming service integration.

POST /setMusicServiceAccount πŸ”₯ CRITICAL

Adds a music service account to the sources list.

Request Examples:

Pandora Service:

<credentials source="PANDORA" displayName="Pandora Music Service">
  <user>YourPandoraUserId</user>
  <pass>YourPandoraPassword$1pd</pass>
</credentials>

Spotify Service:

<credentials source="SPOTIFY" displayName="Spotify Premium">
  <user>YourSpotifyUserId</user>
  <pass>YourSpotifyPassword</pass>
</credentials>

NAS Music Library:

<credentials source="STORED_MUSIC" displayName="My NAS Media Library">
  <user>d09708a1-5953-44bc-a413-123456789012/0</user>
  <pass />
</credentials>

Response:

<status>/setMusicServiceAccount</status>

Implementation Notes:

POST /removeMusicServiceAccount πŸ”₯ CRITICAL

Removes an existing music service account.

Request Examples:

Remove Pandora:

<credentials source="PANDORA" displayName="Pandora Music Service">
  <user>YourPandoraUserId</user>
  <pass />
</credentials>

Remove NAS Library:

<credentials source="STORED_MUSIC" displayName="My NAS Media Library">
  <user>d09708a1-5953-44bc-a413-123456789012/0</user>
  <pass />
</credentials>

Content Discovery and Navigation βœ… IMPLEMENTED

Essential for browsing music libraries and discovering new content.

POST /navigate βœ… IMPLEMENTED

Retrieves child container items from music libraries.

Status: COMPLETE - Full navigation functionality implemented using endpoints documented in the SoundTouch Plus Wiki

POST /search πŸ”₯ CRITICAL

Searches music library containers.

Request Examples:

Search for tracks containing β€œchristmas”:

<search source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <startItem>1</startItem>
  <numItems>1000</numItems>
  <searchTerm filter="track">christmas</searchTerm>
  <item>
    <name>All Music</name>
    <type>dir</type>
    <ContentItem source="STORED_MUSIC" location="4" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true" />
  </item>
</search>

Search for artists containing β€œMercyMe”:

<search source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <startItem>1</startItem>
  <numItems>1000</numItems>
  <searchTerm filter="artist">MercyMe</searchTerm>
  <item>
    <name>All Artists</name>
    <type>dir</type>
    <ContentItem source="STORED_MUSIC" location="6" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true" />
  </item>
</search>

Response Example:

<searchResponse source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <totalItems>142</totalItems>
  <items>
    <item Playable="1">
      <name>Christmas Gift</name>
      <type>track</type>
      <ContentItem source="STORED_MUSIC" location="4-7678 TRACK" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Christmas Gift</itemName>
      </ContentItem>
      <artistName>NJS</artistName>
      <albumName>Sound of Night</albumName>
    </item>
  </items>
</searchResponse>

Station Management βœ… IMPLEMENTED

Pandora and other music service station management.

POST /searchStation βœ… IMPLEMENTED

Searches music services for stations to add.

Status: COMPLETE - Full station search functionality implemented using endpoints documented in the SoundTouch Plus Wiki

POST /addStation βœ… IMPLEMENTED

Adds a station to music service collection.

Status: COMPLETE - Station addition and immediate playback implemented using endpoints documented in the SoundTouch Plus Wiki

POST /removeStation βœ… IMPLEMENTED

Removes a station from music service collection.

Status: COMPLETE - Station removal functionality implemented using endpoints documented in the SoundTouch Plus Wiki

Enhanced Playback Control

POST /userPlayControl πŸ”₯ CRITICAL

Sends user play control commands.

Request Example:

<PlayControl>PLAY_CONTROL</PlayControl>

Valid Control Values:

Response:

<status>/userPlayControl</status>

POST /userRating πŸ”₯ CRITICAL

Rates currently playing media (Pandora only).

Request Example:

<Rating>UP</Rating>

Valid Rating Values:

Response:

<status>/userRating</status>

System Information

GET /listMediaServers πŸ”₯ CRITICAL

Returns detected UPnP/DLNA media servers.

Response Example:

<ListMediaServersResponse>
  <media_server id="2f402f80-da50-11e1-9b23-123456789012" mac="0017886e13fe" ip="192.168.1.4" manufacturer="Signify" model_name="Philips hue bridge 2015" friendly_name="Hue Bridge (192.168.1.4)" model_description="Philips hue Personal Wireless Lighting" location="http://192.168.1.4:80/description.xml" />
  <media_server id="d09708a1-5953-44bc-a413-123456789012" mac="S-1-5-21-240303764-901663538-1234567890-1001" ip="192.168.1.5" manufacturer="Microsoft Corporation" model_name="Windows Media Player Sharing" friendly_name="My NAS Media Library" model_description="" location="http://192.168.1.5:2869/upnphost/udhisapi.dll?content=uuid:d09708a1-5953-44bc-a413-123456789012" />
</ListMediaServersResponse>

GET /serviceAvailability βœ… IMPLEMENTED

Returns source service availability status.

Implementation Status: βœ… Complete - Available in pkg/client/client.go as GetServiceAvailability()

Response Example:

<serviceAvailability>
  <services>
    <service type="AIRPLAY" isAvailable="true" />
    <service type="ALEXA" isAvailable="false" />
    <service type="AMAZON" isAvailable="true" />
    <service type="BLUETOOTH" isAvailable="false" reason="INVALID_SOURCE_TYPE" />
    <service type="BMX" isAvailable="false" />
    <service type="DEEZER" isAvailable="true" />
    <service type="IHEART" isAvailable="true" />
    <service type="LOCAL_INTERNET_RADIO" isAvailable="true" />
    <service type="LOCAL_MUSIC" isAvailable="true" />
    <service type="NOTIFICATION" isAvailable="false" />
    <service type="PANDORA" isAvailable="true" />
    <service type="SPOTIFY" isAvailable="true" />
    <service type="TUNEIN" isAvailable="true" />
  </services>
</serviceAvailability>

Power Management

GET /standby πŸ”₯ CRITICAL

Places device into standby mode.

Response:

<status>/standby</status>

WebSocket Event: nowPlayingUpdated with source=”STANDBY”

GET /powerManagement πŸ”₯ CRITICAL

Returns power state and battery capability.

Response Example:

<powerManagementResponse>
  <powerState>FullPower</powerState>
  <battery>
    <capable>false</capable>
  </battery>
</powerManagementResponse>

GET /lowPowerStandby πŸ”₯ CRITICAL

Places device into low-power mode.

Response:

<status>/lowPowerStandby</status>

Implementation Notes:


High Priority Implementation Candidates

Notification System (ST-10 Series Only) βœ… IMPLEMENTED

POST /speaker βœ… IMPLEMENTED

Plays TTS messages or URL content for notifications.

CLI Usage:

# TTS with multiple languages
soundtouch-cli speaker tts --text "Hello World" --app-key YOUR_KEY --language EN --volume 70

# URL content playback
soundtouch-cli speaker url --url "https://example.com/audio.mp3" --app-key YOUR_KEY --volume 60

# Simple notification beep
soundtouch-cli speaker beep

Go Client Usage:

// Text-to-Speech
client.PlayTTS("Hello World", "your-app-key", "EN", 70)

// URL content
client.PlayURL("https://example.com/audio.mp3", "your-app-key", "Service", "Message", "Reason", 60)

// Notification beep
client.PlayNotificationBeep()

Implementation Features:

GET /playNotification βœ… IMPLEMENTED

Plays a notification beep sound.

Implementation:

WiFi Management

POST /performWirelessSiteSurvey 🎯 HIGH

Gets list of detectable wireless networks.

Response Example:

<PerformWirelessSiteSurveyResponse error="none">
  <items>
    <item ssid="my_wireless_ssid" signalStrength="-58" secure="true">
      <securityTypes>
        <type>wpa_or_wpa2</type>
      </securityTypes>
    </item>
    <item ssid="Imagine" signalStrength="-65" secure="true">
      <securityTypes>
        <type>wpa_or_wpa2</type>
      </securityTypes>
    </item>
  </items>
</PerformWirelessSiteSurveyResponse>

POST /addWirelessProfile 🎯 HIGH

Adds wireless profile configuration.

Request Example:

<addWirelessProfile timeout="30">
  <profile ssid="YourSSIDName" password="YourSSIDPassword" securityType="wpa_or_wpa2"></profile>
</addWirelessProfile>

Security Types:

Response:

<status>/addWirelessProfile</status>

Setup Process:

  1. Connect to device WiFi (e.g., Bose ST XX (XXXXXXXX))
  2. Device has IP 192.0.2.1 during setup
  3. Add wireless profile
  4. End setup: POST to /setup with <setupState state="SETUP_WIFI_LEAVE" />

GET /getActiveWirelessProfile 🎯 HIGH

Gets current wireless profile configuration.

Response Example:

<GetActiveWirelessProfileResponse>
  <ssid>my_wireless_ssid</ssid>
</GetActiveWirelessProfileResponse>

Bluetooth Management

GET /enterBluetoothPairing 🎯 HIGH

Enters Bluetooth pairing mode.

Response:

<status>/enterBluetoothPairing</status>

Implementation Notes:

GET /clearBluetoothPaired 🎯 HIGH

Clears all Bluetooth pairings.

Response Example:

<BluetoothInfo BluetoothMACAddress="34:15:13:45:2f:93" />

Implementation Notes:

GET /bluetoothInfo 🎯 HIGH

Returns current Bluetooth configuration.

Response Example:

<status>/clearBluetoothPaired</status>

Language and System Configuration

GET /language 🎯 HIGH

Returns current device language.

Response Example:

<sysLanguage>3</sysLanguage>

Language Codes:

POST /language 🎯 HIGH

Sets device language.

Request Example:

<sysLanguage>3</sysLanguage>

Response:

<sysLanguage>3</sysLanguage>

GET /soundTouchConfigurationStatus 🎯 HIGH

Returns device configuration status.

Response Example:

<SoundTouchConfigurationStatus status="SOUNDTOUCH_CONFIGURED" />

Valid Status Values:

Software Update Management

GET /swUpdateCheck 🎯 HIGH

Gets latest available software update information.

Response Example:

<swUpdateCheckResponse deviceID="1004567890AA" indexFileUrl="https://worldwide.bose.com/updates/soundtouch">
  <release revision="27.0.6.46330.5043500" />
</swUpdateCheckResponse>

GET /swUpdateQuery 🎯 HIGH

Gets status of software update process.

Response Example:

<swUpdateQueryResponse deviceID="1004567890AA">
  <state>IDLE</state>
  <percentComplete>0</percentComplete>
  <canAbort>false</canAbort>
</swUpdateQueryResponse>

Update States:


Medium Priority Implementation Candidates

Source Selection Shortcuts

GET /selectLastSource πŸ“Š MEDIUM

Selects the last source that was active.

Response:

<status>/selectLastSource</status>

GET /selectLastSoundTouchSource πŸ“Š MEDIUM

Selects last SoundTouch source.

Response:

<status>/selectLastSoundTouchSource</status>

GET /selectLastWiFiSource πŸ“Š MEDIUM

Selects last WiFi source.

Response:

<status>/selectLastWiFiSource</status>

GET /selectLocalSource πŸ“Š MEDIUM

Selects LOCAL source (only way to select LOCAL on some devices).

Response:

<status>/selectLocalSource</status>

Group Management (ST-10 Stereo Pairs Only)

GET /getGroup πŸ“Š MEDIUM

Gets current stereo pair configuration.

Response Example (paired):

<group id="1115893">
  <name>Bose-ST10-1 + Bose-ST10-4</name>
  <masterDeviceId>9070658C9D4A</masterDeviceId>
  <roles>
    <groupRole>
      <deviceId>9070658C9D4A</deviceId>
      <role>LEFT</role>
      <ipAddress>192.168.1.131</ipAddress>
    </groupRole>
    <groupRole>
      <deviceId>F45EAB3115DA</deviceId>
      <role>RIGHT</role>
      <ipAddress>192.168.1.134</ipAddress>
    </groupRole>
  </roles>
  <senderIPAddress>192.168.1.131</senderIPAddress>
  <status>GROUP_OK</status>
</group>

Response Example (not paired):

<group />

POST /addGroup πŸ“Š MEDIUM

Creates new stereo pair group.

Request Example:

<group>
  <name>Bose-ST10-1 + Bose-ST10-4</name>
  <masterDeviceId>9070658C9D4A</masterDeviceId>
  <roles>
    <groupRole>
      <deviceId>9070658C9D4A</deviceId>
      <role>LEFT</role>
      <ipAddress>192.168.1.131</ipAddress>
    </groupRole>
    <groupRole>
      <deviceId>F45EAB3115DA</deviceId>
      <role>RIGHT</role>
      <ipAddress>192.168.1.134</ipAddress>
    </groupRole>
  </roles>
</group>

Response: Same as GET /getGroup
WebSocket Event: groupUpdated sent to both devices

GET /removeGroup πŸ“Š MEDIUM

Removes existing stereo pair group.

Response:

<group />

WebSocket Event: groupUpdated sent to both devices

POST /updateGroup πŸ“Š MEDIUM

Updates stereo pair group name.

Request Example:

<group id="1116267">
  <name>Bose-ST10-1 + Bose-ST10-4 Group</name>
  <masterDeviceId>9070658C9D4A</masterDeviceId>
  <roles>
    <groupRole>
      <deviceId>9070658C9D4A</deviceId>
      <role>LEFT</role>
      <ipAddress>192.168.1.131</ipAddress>
    </groupRole>
    <groupRole>
      <deviceId>F45EAB3115DA</deviceId>
      <role>RIGHT</role>
      <ipAddress>192.168.1.134</ipAddress>
    </groupRole>
  </roles>
</group>

Advanced System Information

GET /systemtimeout πŸ“Š MEDIUM

Gets current system timeout configuration.

Response Example:

<systemtimeout>
  <powersaving_enabled>true</powersaving_enabled>
</systemtimeout>

GET /rebroadcastlatencymode πŸ“Š MEDIUM

Gets current rebroadcast latency mode.

Response Example:

<rebroadcastlatencymode mode="SYNC_TO_ZONE" controllable="true" />

GET /DSPMonoStereo πŸ“Š MEDIUM

Gets digital signal processor configuration.

Response Example:

<DSPMonoStereo deviceID="1004567890AA">
  <mono enable="false" />
</DSPMonoStereo>

GET /netStats πŸ“Š MEDIUM

Returns network status configuration.

Response Example:

<network-data>
  <devices>
    <device deviceID="1004567890AA">
      <deviceSerialNumber>P7277179802731234567890</deviceSerialNumber>
      <interfaces>
        <interface>
          <name>eth0</name>
          <mac-addr>1004567890AA</mac-addr>
          <bindings>
            <ipv4address>192.168.1.131</ipv4address>
          </bindings>
          <running>true</running>
          <kind>Wireless</kind>
          <ssid>my_network_ssid</ssid>
          <rssi>Good</rssi>
          <frequencyKHz>2452000</frequencyKHz>
        </interface>
      </interfaces>
    </device>
  </devices>
</network-data>

Low Priority / Specialized Endpoints

Advanced Audio Features (ST-300 Hardware-Specific)

GET /audiospeakerattributeandsetting πŸ”§ LOW

Returns speaker attribute configuration.

Response Example:

<audiospeakerattributeandsetting>
  <rear available="false" active="false" wireless="false" controllable="true" />
  <subwoofer01 available="true" active="true" wireless="true" controllable="true" />
</audiospeakerattributeandsetting>

GET /productcechdmicontrol πŸ”§ LOW

Gets HDMI CEC control configuration (ST-300 only).

POST /productcechdmicontrol πŸ”§ LOW

Sets HDMI CEC control configuration (ST-300 only).

GET /producthdmiassignmentcontrols πŸ”§ LOW

Gets HDMI assignment controls configuration (ST-300 only).

POST /producthdmiassignmentcontrols πŸ”§ LOW

Sets HDMI assignment controls configuration (ST-300 only).

System Administration Features

POST /swUpdateStart πŸ”§ LOW

Starts software update process.

Response:

<status>/swUpdateStart</status>

POST /swUpdateAbort πŸ”§ LOW

Aborts software update process.

Response:

<status>/swUpdateAbort</status>

GET /criticalError πŸ”§ LOW

Gets critical error information.

POST /factoryDefault πŸ”§ LOW

Performs factory reset of device.

Warning: This completely resets the device to factory defaults.


Implementation Guidelines

Device Compatibility Matrix

Endpoint ST-10 ST-300 ST-20 ST-520 Notes
/playNotification βœ… ❌ ❌ ❌ ST-10 III series only
/speaker βœ… ❌ ❌ ❌ ST-10 III series only
/audiodspcontrols ❌ βœ… ❌ βœ… Soundbar products
/audioproducttonecontrols ❌ βœ… ❌ βœ… Advanced audio devices
/getGroup βœ… ❌ ❌ ❌ Stereo pair support
/productcechdmicontrol ❌ βœ… ❌ ❌ HDMI-enabled devices

Error Handling Best Practices

Capability Checking

// Always check capabilities before calling advanced features
capabilities, err := client.GetCapabilities()
if err != nil {
    return fmt.Errorf("failed to get capabilities: %w", err)
}

if !capabilities.SupportsFeature("audiodspcontrols") {
    return ErrFeatureNotSupported
}

Timeout Handling

// Some endpoints timeout on unsupported devices
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

if err := client.makeRequestWithTimeout(ctx, endpoint); err != nil {
    if errors.Is(err, context.DeadlineExceeded) {
        return ErrEndpointNotSupported
    }
    return err
}

Graceful Degradation

// Provide fallback functionality when advanced features unavailable
if err := client.PlayNotification(); err != nil {
    if errors.Is(err, ErrFeatureNotSupported) {
        // Fallback to volume beep or other notification method
        return client.SendKeyPress("VOLUME_UP")
    }
    return err
}

WebSocket Events Generated

Many POST operations generate corresponding WebSocket events:

Operation WebSocket Event Content
βœ… storePreset βœ… presetsUpdated Updated preset list (IMPLEMENTED)
βœ… removePreset βœ… presetsUpdated Updated preset list (IMPLEMENTED)
addGroup groupUpdated Stereo pair configuration
removeGroup groupUpdated Stereo pair configuration
userPlayControl nowPlayingUpdated Playback state changes
βœ… addStation None Station immediately plays (IMPLEMENTED)
βœ… removeStation nowPlayingUpdated If removed station was playing (IMPLEMENTED)

Security and Authentication

App Key Requirements

<!-- TTS and URL playback require app_key -->
<play_info>
  <url>...</url>
  <app_key>YourApplicationKey</app_key>
  <!-- other fields -->
</play_info>

Bearer Token Usage

// Use existing token system for authenticated requests
token, err := client.RequestToken()
if err != nil {
    return err
}
client.SetAuthToken(token.Value)

Music Service Specifics

Pandora Integration

Spotify Integration

NAS/DLNA Libraries

Testing Strategy

Real Device Testing

var deviceTests = []struct {
    model     string
    endpoint  string
    supported bool
}{
    {"ST-10", "/playNotification", true},
    {"ST-300", "/playNotification", false},
    {"ST-300", "/audiodspcontrols", true},
    {"ST-10", "/audiodspcontrols", false},
}

func TestDeviceCompatibility(t *testing.T) {
    for _, tt := range deviceTests {
        t.Run(fmt.Sprintf("%s_%s", tt.model, tt.endpoint), func(t *testing.T) {
            // Test endpoint on specific device model
        })
    }
}

Integration Testing


Implementation Priority Recommendations

Phase 1: Essential Features (4 weeks)

  1. βœ… Preset Management: storePreset, removePreset, selectPreset (IMPLEMENTED)
  2. Music Services: setMusicServiceAccount, removeMusicServiceAccount
  3. βœ… Content Discovery: navigate, search (IMPLEMENTED), recents
  4. βœ… Station Management: searchStation, addStation, removeStation (IMPLEMENTED)
  5. Enhanced Controls: userPlayControl, userRating

Phase 2: Smart Home Integration (3 weeks)

  1. Power Management: standby, powerManagement, lowPowerStandby
  2. Notifications: speaker, playNotification
  3. Network Management: performWirelessSiteSurvey, addWirelessProfile
  4. System Info: serviceAvailability (βœ… implemented), listMediaServers, language

Phase 3: Advanced Features (3 weeks)

  1. Bluetooth: enterBluetoothPairing, clearBluetoothPaired
  2. Software Updates: swUpdateCheck, swUpdateQuery
  3. Stereo Pairs: getGroup, addGroup, removeGroup, updateGroup
  4. Source Shortcuts: selectLastSource, selectLastSoundTouchSource

Phase 4: Specialized Features (2 weeks)

  1. HDMI Controls: productcechdmicontrol, producthdmiassignmentcontrols
  2. System Administration: factoryDefault, criticalError
  3. Audio Processing: audiospeakerattributeandsetting, DSPMonoStereo

Success Metrics

Functionality Coverage

Quality Assurance

Developer Experience


Conclusion

The SoundTouch Plus Wiki provides comprehensive documentation for 64 additional endpoints that can transform this Go library from basic device control to complete SoundTouch ecosystem management.

Key Benefits:

Implementation Path:

  1. Start with high-impact user features (presets, music services)
  2. Add smart home integration (power, notifications, network)
  3. Include advanced features (stereo pairs, updates, system admin)
  4. Maintain quality through real device testing and comprehensive error handling

This documentation provides the complete foundation for implementing all endpoints from the SoundTouch Plus Wiki, enabling this Go library to become the definitive SoundTouch integration solution for everything from basic home automation to professional audio installations.

All examples and XML structures are verified against real SoundTouch hardware and extensively tested by the SoundTouch Plus community.