Documentation for controlling and preserving Bose SoundTouch devices
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.
Essential user functionality that significantly impacts user experience.
Smart home integration and advanced user features.
Professional features and system administration.
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.
Essential for saving and managing favorite stations and playlists.
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β
StorePreset(), StoreCurrentAsPreset(), RemovePreset()preset store, preset store-current, preset removepresetsUpdated notificationsImplementation Notes: RESOLVED - Special thanks to the SoundTouch Plus community for documenting these working endpoints
Removes an existing preset from the device.
Status: COMPLETE - Successfully implemented using endpoints from the SoundTouch Plus Wiki
RemovePreset(id)preset remove --slot <1-6>presetsUpdated WebSocket eventsSelects and plays a preset by ID.
Status: AVAILABLE - Implemented via key commands
SelectPreset(id) (uses key command approach)preset select --slot <1-6>SendKey("PRESET_1") etc.)Critical for streaming service integration.
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:
/listMediaServers)/0 suffix for STORED_MUSIC user namesRemoves 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>
Essential for browsing music libraries and discovering new content.
Retrieves child container items from music libraries.
Status: COMPLETE - Full navigation functionality implemented using endpoints documented in the SoundTouch Plus Wiki
Navigate(), NavigateWithMenu(), NavigateContainer()GetTuneInStations(), GetPandoraStations(), GetStoredMusicLibrary()browse content, browse menu, browse container, browse tunein, browse pandora, browse stored-musicSearches 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>
Pandora and other music service station management.
Searches music services for stations to add.
Status: COMPLETE - Full station search functionality implemented using endpoints documented in the SoundTouch Plus Wiki
SearchStation(), SearchTuneInStations(), SearchPandoraStations(), SearchSpotifyContent()station search, station search-tunein, station search-pandora, station search-spotifyAdds a station to music service collection.
Status: COMPLETE - Station addition and immediate playback implemented using endpoints documented in the SoundTouch Plus Wiki
AddStation(source, sourceAccount, token, name)station add --source <SOURCE> --token <TOKEN> --name <NAME>Removes a station from music service collection.
Status: COMPLETE - Station removal functionality implemented using endpoints documented in the SoundTouch Plus Wiki
RemoveStation(contentItem)station remove --source <SOURCE> --location <LOCATION>Sends user play control commands.
Request Example:
<PlayControl>PLAY_CONTROL</PlayControl>
Valid Control Values:
PAUSE_CONTROL - Pause currently playing contentPLAY_CONTROL - Play content that is paused or stoppedPLAY_PAUSE_CONTROL - Toggle play/pauseSTOP_CONTROL - Stop currently playing contentResponse:
<status>/userPlayControl</status>
Rates currently playing media (Pandora only).
Request Example:
<Rating>UP</Rating>
Valid Rating Values:
UP - Thumbs up ratingDOWN - Thumbs down rating (stops current track)Response:
<status>/userRating</status>
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>
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>
Places device into standby mode.
Response:
<status>/standby</status>
WebSocket Event: nowPlayingUpdated with source=βSTANDBYβ
Returns power state and battery capability.
Response Example:
<powerManagementResponse>
<powerState>FullPower</powerState>
<battery>
<capable>false</capable>
</battery>
</powerManagementResponse>
Places device into low-power mode.
Response:
<status>/lowPowerStandby</status>
Implementation Notes:
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:
Plays a notification beep sound.
Implementation:
PlayNotificationBeep() methodsoundtouch-cli speaker beepGets 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>
Adds wireless profile configuration.
Request Example:
<addWirelessProfile timeout="30">
<profile ssid="YourSSIDName" password="YourSSIDPassword" securityType="wpa_or_wpa2"></profile>
</addWirelessProfile>
Security Types:
none - No securitywep - WEPwpatkip - WPA/TKIPwpaaes - WPA/AESwpa2tkip - WPA2/TKIPwpa2aes - WPA2/AESwpa_or_wpa2 - WPA/WPA2 (recommended)Response:
<status>/addWirelessProfile</status>
Setup Process:
Bose ST XX (XXXXXXXX))/setup with <setupState state="SETUP_WIFI_LEAVE" />Gets current wireless profile configuration.
Response Example:
<GetActiveWirelessProfileResponse>
<ssid>my_wireless_ssid</ssid>
</GetActiveWirelessProfileResponse>
Enters Bluetooth pairing mode.
Response:
<status>/enterBluetoothPairing</status>
Implementation Notes:
Clears all Bluetooth pairings.
Response Example:
<BluetoothInfo BluetoothMACAddress="34:15:13:45:2f:93" />
Implementation Notes:
Returns current Bluetooth configuration.
Response Example:
<status>/clearBluetoothPaired</status>
Returns current device language.
Response Example:
<sysLanguage>3</sysLanguage>
Language Codes:
Sets device language.
Request Example:
<sysLanguage>3</sysLanguage>
Response:
<sysLanguage>3</sysLanguage>
Returns device configuration status.
Response Example:
<SoundTouchConfigurationStatus status="SOUNDTOUCH_CONFIGURED" />
Valid Status Values:
SOUNDTOUCH_CONFIGURED - Device configuration completeSOUNDTOUCH_NOT_CONFIGURED - Device not configuredSOUNDTOUCH_CONFIGURING - Configuration in progressGets 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>
Gets status of software update process.
Response Example:
<swUpdateQueryResponse deviceID="1004567890AA">
<state>IDLE</state>
<percentComplete>0</percentComplete>
<canAbort>false</canAbort>
</swUpdateQueryResponse>
Update States:
IDLE - No update in progressDOWNLOADING - Downloading updateINSTALLING - Installing updateERROR - Update failedSelects the last source that was active.
Response:
<status>/selectLastSource</status>
Selects last SoundTouch source.
Response:
<status>/selectLastSoundTouchSource</status>
Selects last WiFi source.
Response:
<status>/selectLastWiFiSource</status>
Selects LOCAL source (only way to select LOCAL on some devices).
Response:
<status>/selectLocalSource</status>
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 />
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
Removes existing stereo pair group.
Response:
<group />
WebSocket Event: groupUpdated sent to both devices
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>
Gets current system timeout configuration.
Response Example:
<systemtimeout>
<powersaving_enabled>true</powersaving_enabled>
</systemtimeout>
Gets current rebroadcast latency mode.
Response Example:
<rebroadcastlatencymode mode="SYNC_TO_ZONE" controllable="true" />
Gets digital signal processor configuration.
Response Example:
<DSPMonoStereo deviceID="1004567890AA">
<mono enable="false" />
</DSPMonoStereo>
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>
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>
Gets HDMI CEC control configuration (ST-300 only).
Sets HDMI CEC control configuration (ST-300 only).
Gets HDMI assignment controls configuration (ST-300 only).
Sets HDMI assignment controls configuration (ST-300 only).
Starts software update process.
Response:
<status>/swUpdateStart</status>
Aborts software update process.
Response:
<status>/swUpdateAbort</status>
Gets critical error information.
Performs factory reset of device.
Warning: This completely resets the device to factory defaults.
| 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 |
// 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
}
// 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
}
// 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
}
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) |
<!-- TTS and URL playback require app_key -->
<play_info>
<url>...</url>
<app_key>YourApplicationKey</app_key>
<!-- other fields -->
</play_info>
// Use existing token system for authenticated requests
token, err := client.RequestToken()
if err != nil {
return err
}
client.SetAuthToken(token.Value)
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
})
}
}
storePreset, removePreset, selectPresetsetMusicServiceAccount, removeMusicServiceAccountnavigate, searchrecentssearchStation, addStation, removeStationuserPlayControl, userRatingstandby, powerManagement, lowPowerStandbyspeaker, playNotificationperformWirelessSiteSurvey, addWirelessProfileserviceAvailabilitylistMediaServers, languageenterBluetoothPairing, clearBluetoothPairedswUpdateCheck, swUpdateQuerygetGroup, addGroup, removeGroup, updateGroupselectLastSource, selectLastSoundTouchSourceproductcechdmicontrol, producthdmiassignmentcontrolsfactoryDefault, criticalErroraudiospeakerattributeandsetting, DSPMonoStereoThe 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.
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.