Documentation for controlling and preserving Bose SoundTouch devices
This document provides a comprehensive overview of the available API endpoints verified against the official Bose SoundTouch Web API v1.0 specification (January 7, 2026).
Acknowledgment: Additional endpoints beyond the official API were discovered through the comprehensive SoundTouch Plus Wiki maintained by the SoundTouch Plus community. Special thanks to @thlucas1 and contributors for documenting these working endpoints that enable full preset management and content navigation functionality.
http://<device-ip>:8090/Retrieves basic device information.
Response XML Structure:
<info deviceID="..." type="..." name="..." ...>
<name>Device Name</name>
<type>Device Type</type>
<margeAccountUUID>UUID</margeAccountUUID>
<components>...</components>
</info>
Retrieves information about the currently playing music.
Response XML Structure:
<nowPlaying deviceID="..." source="...">
<ContentItem source="..." type="..." location="..." sourceAccount="...">
<itemName>Track Name</itemName>
<containerArt>Album Art URL</containerArt>
</ContentItem>
<track>Track Name</track>
<artist>Artist Name</artist>
<album>Album Name</album>
<stationName>Station Name</stationName>
<art artImageStatus="...">Art URL</art>
<playStatus>PLAY_STATE</playStatus>
<shuffleSetting>...</shuffleSetting>
<repeatSetting>...</repeatSetting>
</nowPlaying>
Sends key commands to the device.
IMPORTANT - Key values, state, and sender attributes are CaSe-SeNsItIvE!
Important: Proper key simulation requires sending both press and release states:
Request XML (Press + Release):
<key state="press" sender="Gabbo">KEY_NAME</key>
<key state="release" sender="Gabbo">KEY_NAME</key>
Response XML:
<status>/key</status>
Available Keys:
Playback Controls:
PLAY - Start playbackPAUSE - Pause current playbackSTOP - Stop current playbackPREV_TRACK - Go to previous trackNEXT_TRACK - Go to next trackPLAY_PAUSE - Toggles between play and pause for currently playing mediaRating and Bookmark Controls:
THUMBS_UP - Rate current content positively (Pandora, Spotify, etc.)THUMBS_DOWN - Rate current content negatively (Pandora, Spotify, etc.)BOOKMARK - Bookmark current contentADD_FAVORITE - Adds currently playing media to device favorites (Pandora, Spotify, etc.)REMOVE_FAVORITE - Removes currently playing media from device favorites (Pandora, Spotify, etc.)Power and System Controls:
POWER - Toggle device power stateMUTE - Toggle mute stateVolume Controls:
VOLUME_UP - Increase volumeVOLUME_DOWN - Decrease volumePreset Controls:
PRESET_1 to PRESET_6 - Select preset 1-6Input Controls:
AUX_INPUT - Switch to auxiliary inputShuffle Controls:
SHUFFLE_OFF - Turn shuffle mode offSHUFFLE_ON - Turn shuffle mode onRepeat Controls:
REPEAT_OFF - Turn repeat mode offREPEAT_ONE - Repeat current trackREPEAT_ALL - Repeat all tracks in playlistState Values:
press - Indicates the key is pressedrelease - Indicates the key is releasedrepeat - Indicates the key is repeatedSender Values:
Gabbo - Default value for standard SoundTouch remote control deviceIrRemote - IR remote control deviceConsole - Console deviceLightswitchRemote - Lightswitch remote deviceBoselinkRemote - Boselink remote deviceEtap - Etap deviceRetrieves the current volume.
Response XML:
<volume deviceID="...">
<targetvolume>50</targetvolume>
<actualvolume>50</actualvolume>
<muteenabled>false</muteenabled>
</volume>
Sets the volume.
Request XML:
<volume>50</volume>
Retrieves the current bass settings.
Response XML:
<bass deviceID="...">
<targetbass>0</targetbass>
<actualbass>0</actualbass>
</bass>
Sets the bass settings. Range varies by device - check /bassCapabilities for supported range.
Request XML:
<bass>0</bass>
Note: Value must be within the range specified by bassMin and bassMax from /bassCapabilities service.
Retrieves the available audio sources.
Response XML:
<sources deviceID="...">
<sourceItem source="SPOTIFY" sourceAccount="..." status="READY" multiroomallowed="true">
<itemName>Spotify</itemName>
</sourceItem>
<sourceItem source="BLUETOOTH" status="READY" multiroomallowed="false">
<itemName>Bluetooth</itemName>
</sourceItem>
<!-- Additional sources -->
</sources>
Typical Sources:
SPOTIFYAMAZONPANDORAIHEARTRADIOTUNEINBLUETOOTHAUXSTORED_MUSICSelects an audio source.
Request XML:
<ContentItem source="SPOTIFY" sourceAccount="...">
<itemName>Spotify</itemName>
</ContentItem>
Retrieves the configured presets.
Response XML:
<presets deviceID="...">
<preset id="1" createdOn="..." updatedOn="...">
<ContentItem source="..." sourceAccount="..." location="...">
<itemName>Preset Name</itemName>
<containerArt>Art URL</containerArt>
</ContentItem>
</preset>
<!-- Additional presets -->
</presets>
Creates or updates a preset.
Status: While the official Bose SoundTouch API documentation marks POST /presets as “N/A”, we discovered and implemented the actual working endpoint /storePreset through the comprehensive SoundTouch Plus Wiki. This enables full preset management functionality.
Implementation:
StorePreset(id, contentItem), StoreCurrentAsPreset(id)preset store, preset store-currentXML Request:
<preset id="1" createdOn="1640995200" updatedOn="1640995200">
<ContentItem source="SPOTIFY" type="uri" location="spotify:playlist:123" isPresetable="true">
<itemName>My Playlist</itemName>
</ContentItem>
</preset>
Response: Updated preset configuration
Removes/clears a preset slot.
Implementation:
RemovePreset(id)preset remove --slot <1-6>presetsUpdated notificationsXML Request:
<preset id="3"/>
Alternative Methods:
Retrieves multiroom zone information.
Configures multiroom zones.
Retrieves balance settings (stereo devices). Only works if device is configured as part of a stereo pair.
Response XML:
<balance deviceID="...">
<balanceAvailable>true</balanceAvailable>
<balanceMin>-7</balanceMin>
<balanceMax>7</balanceMax>
<balanceDefault>0</balanceDefault>
<targetBalance>0</targetBalance>
<actualBalance>0</actualBalance>
</balance>
Sets balance settings. Value must be within the range specified by balanceMin and balanceMax.
Request XML:
<balance>
<targetBalance>0</targetBalance>
</balance>
Range Examples:
-7 = left speaker0 = centered7 = right speakerRetrieves the device time.
Response XML:
<clockTime utcTime="1701824606" cueMusic="0" timeFormat="TIME_FORMAT_12HOUR_ID" brightness="70" clockError="0" utcSyncTime="1701820350">
<localTime year="2023" month="11" dayOfMonth="5" dayOfWeek="2" hour="19" minute="3" second="26" />
</clockTime>
Sets the device time.
Retrieves clock display settings.
Response XML:
<clockDisplay>
<clockConfig timezoneInfo="America/Chicago" userEnable="false" timeFormat="TIME_FORMAT_12HOUR_ID" userOffsetMinute="0" brightnessLevel="70" userUtcTime="0" />
</clockDisplay>
Configures the clock display.
Plays TTS messages or URL content for notifications (ST-10 Series only).
TTS Request XML:
<play_info>
<url>http://translate.google.com/translate_tts?ie=UTF-8&tl=EN&client=tw-ob&q=Hello%20World</url>
<app_key>YOUR_APPLICATION_KEY</app_key>
<service>TTS Notification</service>
<message>Google TTS</message>
<reason>Hello World</reason>
<volume>70</volume>
</play_info>
URL Content Request XML:
<play_info>
<url>https://example.com/audio.mp3</url>
<app_key>YOUR_APPLICATION_KEY</app_key>
<service>Music Service</service>
<message>Song Title</message>
<reason>Artist Name</reason>
<volume>60</volume>
</play_info>
Response XML:
<status>/speaker</status>
Implementation Features:
Plays a notification beep sound (ST-10 Series only).
Response XML:
<status>/playNotification</status>
Implementation:
PlayNotificationBeep() methodEstablishes a persistent connection for live updates.
Event Types:
nowPlayingUpdatedvolumeUpdatedconnectionStateUpdatedpresetUpdatedRetrieves network information.
Response XML:
<networkInfo wifiProfileCount="1">
<interfaces>
<interface type="WIFI_INTERFACE" name="wlan0" macAddress="..." ipAddress="192.168.1.131" ssid="network_name" frequencyKHz="2452000" state="NETWORK_WIFI_CONNECTED" signal="MARGINAL_SIGNAL" mode="STATION" />
<interface type="WIFI_INTERFACE" name="wlan1" macAddress="..." state="NETWORK_WIFI_DISCONNECTED" />
</interfaces>
</networkInfo>
Retrieves device capabilities.
Retrieves the device name.
Response XML:
<name>SoundTouch 10</name>
Note: Official API only documents POST /name for setting device name. Our GET implementation appears to be an undocumented extension.
Sets the device name via SetName() method. If name is changed, the change will be detected immediately via ZeroConf services.
Request XML:
<name>SoundTouch Living Room</name>
Response: Returns same structure as /info endpoint with updated name.
Checks if bass customization is supported on the device.
Official Response Format:
<bassCapabilities deviceID="$MACADDR">
<bassAvailable>$BOOL</bassAvailable>
<bassMin>$INT</bassMin>
<bassMax>$INT</bassMax>
<bassDefault>$INT</bassDefault>
</bassCapabilities>
Gets extended track information for currently playing music service media.
Response XML:
<trackInfo deviceID="...">Track Name;extended details;separated by semicolons;</trackInfo>
Important Notes:
/now_playing as reliable alternativeImplementation: Available via GetTrackInfo() method. Consider using GetNowPlaying() method for guaranteed compatibility.
Both official low-level endpoints and high-level zone management are available:
Add individual device to existing zone using official API format.
Implementation: Available via AddZoneSlave() and AddZoneSlaveByDeviceID() methods
Remove individual device from existing zone using official API format.
Implementation: Available via RemoveZoneSlave() and RemoveZoneSlaveByDeviceID() methods
CreateZone(), AddToZone(), RemoveFromZone() methods via /setZoneProfessional/high-end device features (only available on devices that list these capabilities):
/audiodspcontrols - GET/POST ✅ ImplementedAccess DSP settings including audio modes and video sync delay.
Availability: Only available if audiodspcontrols is listed in the reply to GET /capabilities
Implementation: Available via GetAudioDSPControls(), SetAudioDSPControls(), SetAudioMode(), SetVideoSyncAudioDelay() methods with automatic capability checking
/audioproducttonecontrols - GET/POST ✅ ImplementedAdvanced bass and treble controls (beyond basic /bass endpoint).
Availability: Only available if audioproducttonecontrols is listed in the reply to GET /capabilities
Implementation: Available via GetAudioProductToneControls(), SetAudioProductToneControls(), SetAdvancedBass(), SetAdvancedTreble() methods with automatic capability checking
/audioproductlevelcontrols - GET/POST ✅ ImplementedSpeaker level controls for front-center and rear-surround speakers.
Availability: Only available if audioproductlevelcontrols is listed in the reply to GET /capabilities
Implementation: Available via GetAudioProductLevelControls(), SetAudioProductLevelControls(), SetFrontCenterSpeakerLevel(), SetRearSurroundSpeakersLevel() methods with automatic capability checking
These endpoints work with real hardware but are NOT in official API v1.0:
GET/POST /clockTime ✅ Implemented - Device time managementGET/POST /clockDisplay ✅ Implemented - Clock display settingsGET /networkInfo ✅ Implemented - Network informationGET/POST /balance ✅ Implemented - Stereo balance adjustmentNote: Not documented in official API v1.0 but works with real devices.
Generates a new bearer token from the device for authentication purposes.
Response XML:
<bearertoken value="Bearer vUApzBVT6Lh0nw1xVu/plr1UDRNdMYMEpe0cStm4wCH5mWSjrrtORnGGirMn3pspkJ8mNR1MFh/J4OcsbEikMplcDGJVeuZOnDPAskQALvDBCF0PW74qXRms2k1AfLJ/" />
Usage:
Authorization: Bearer <token>Implementation: Available via RequestToken() method
Testing: Integration tests available - run with SOUNDTOUCH_TEST_HOST=<device-ip> go test ./pkg/client -run TestRequestToken_Integration to validate real device token generation without exposing token values
The API uses standard HTTP status codes:
200 OK - Successful request400 Bad Request - Invalid request404 Not Found - Endpoint or resource not found500 Internal Server Error - Internal device error// Example for a GET request
func GetNowPlaying(deviceIP string) (*NowPlaying, error) {
url := fmt.Sprintf("http://%s:8090/now_playing", deviceIP)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var nowPlaying NowPlaying
err = xml.NewDecoder(resp.Body).Decode(&nowPlaying)
return &nowPlaying, err
}
// Example for a POST request
func SendKey(deviceIP string, key string) error {
url := fmt.Sprintf("http://%s:8090/key", deviceIP)
xmlData := fmt.Sprintf(`<key state="press" sender="GoClient">%s</key>`, key)
resp, err := http.Post(url, "application/xml", strings.NewReader(xmlData))
if err != nil {
return err
}
resp.Body.Close()
return nil
}
Retrieves all supported endpoints for the specific device with comprehensive feature mapping.
Client Method: GetSupportedURLs() (*models.SupportedURLsResponse, error)
CLI Commands:
soundtouch-cli supported-urls [--features] [--verbose] - Show endpoint-to-feature mappingsoundtouch-cli analyze - Comprehensive device capability analysis with recommendationsResponse XML Structure:
<supportedURLs deviceID="...">
<URL location="/info" />
<URL location="/capabilities" />
<!-- ... additional endpoints ... -->
</supportedURLs>
Feature Mapping System: The implementation includes a comprehensive endpoint-to-feature mapping system that:
Complete Endpoint List (103 endpoints discovered from real devices):
Core Device Information:
/info ✅ - Device information/capabilities ✅ - Device capabilities/supportedURLs ✅ - This endpoint (self-reference) - FULLY IMPLEMENTED with Feature Mapping/networkInfo ✅ - Network configuration/name ✅ - Device name management/netStats - Network statistics/powerManagement - Power state and battery information/soundTouchConfigurationStatus - Device configuration statusPlayback and Media Control:
/nowPlaying ✅ - Current playback status/now_playing ✅ - Alternative current playback endpoint/nowSelection - Current selection details/key ✅ - Send key commands/select ✅ - Select source/content/playbackRequest - Advanced playback requests/userPlayControl - User play control interface (PAUSE_CONTROL, PLAY_CONTROL, etc.)/userTrackControl - User track control interface/userRating - User rating interface (UP/DOWN for Pandora, etc.)Volume and Audio:
/volume ✅ - Volume control/bass ✅ - Bass settings/bassCapabilities ✅ - Bass capability info/balance ✅ - Stereo balance/DSPMonoStereo - DSP mono/stereo settingsSources and Content:
/sources ✅ - Available sources/sourceDiscoveryStatus - Source discovery status/nameSource - Name/rename sources/selectLastSource - Select last used source/selectLastWiFiSource - Select last WiFi source/selectLastSoundTouchSource - Select last SoundTouch source/selectLocalSource - Select local sourcePresets and Favorites:
/presets ✅ - Preset management/storePreset - Store new preset (max 6 presets)/removePreset - Remove existing preset/selectPreset - Select preset by ID/recents ✅ - Recently played content/bookmark - Bookmark current contentMusic Services:
/setMusicServiceAccount - Configure music service account (Pandora, Spotify, etc.)/setMusicServiceOAuthAccount - OAuth account setup/removeMusicServiceAccount - Remove music service account/serviceAvailability ✅ Implemented - Check service availability/introspect ✅ Implemented - Get introspect data for specific sourcesStation Management (Radio/Streaming):
/searchStation - Search for stations (tested with Pandora)/addStation - Add station to favorites (tested with Pandora)/removeStation - Remove station from favorites (tested with Pandora)/genreStations - Browse stations by genre/stationInfo - Station information/trackInfo ✅ - Extended track information with semicolon-delimited detailsZone and Multiroom:
/getZone ✅ - Get zone configuration/setZone ✅ - Set zone configuration/addZoneSlave ✅ - Add device to zone/removeZoneSlave ✅ - Remove device from zone/addGroup - Add to speaker group/removeGroup - Remove from speaker group/getGroup - Get group configuration/updateGroup - Update group settingsClock and Display:
/clockDisplay ✅ - Clock display settings/clockTime ✅ - Device time managementSystem and Configuration:
/powerManagement - Power management settings/standby - Standby mode control/lowPowerStandby - Low power standby mode/systemtimeout - System timeout settings/powersaving - Power saving configuration/userActivity - User activity tracking/language - Language settings/speaker - Speaker configurationNetwork and Connectivity:
/performWirelessSiteSurvey - WiFi site survey (returns detected networks with signal strength)/addWirelessProfile - Add WiFi profile (supports various security types)/getActiveWirelessProfile - Get active WiFi profile/setWiFiRadio - WiFi radio controlBluetooth:
/bluetoothInfo ✅ - Bluetooth information and pairing status/enterBluetoothPairing - Enter Bluetooth pairing mode (switches to BLUETOOTH source)/clearBluetoothPaired - Clear all Bluetooth pairings (emits descending tone)Pairing and Setup:
/pairLightswitch - Pair with lightswitch accessory/cancelPairLightswitch - Cancel lightswitch pairing/clearPairedList - Clear all pairings/enterPairingMode - Enter general pairing mode/setPairedStatus - Set pairing status/setPairingStatus - Update pairing status/soundTouchConfigurationStatus - Configuration status/setup - Device setup interfaceSoftware Updates:
/swUpdateStart - Start software update/swUpdateAbort - Abort software update/swUpdateQuery - Query update status/swUpdateCheck - Check for updatesAdvanced Features:
/search - Content search (music libraries with filter support)/navigate - Content navigation (traverse music library containers)/listMediaServers - List available UPnP/DLNA media servers/requestToken ✅ - Bearer token generation/notification - Notification management/playNotification - Play notification beep (ST-10 series only)/speaker - Play TTS messages or URL content (ST-10 series only)/test - System test interfaceInternal/System:
/pdo - Internal PDO operations/slaveMsg - Slave device messaging/masterMsg - Master device messaging/factoryDefault - Factory reset/criticalError - Critical error handling/netStats - Network statistics and device interface details/rebroadcastlatencymode - Rebroadcast latency mode configuration/systemtimeout - System timeout settings/powersaving - Power saving configurationProduct Information:
/setProductSerialNumber - Set product serial number/setProductSoftwareVersion - Set software version/setComponentSoftwareVersion - Set component versionsMarge Integration (Bose Cloud Services):
/marge - Marge service integration (Bose cloud services, EOL May 2026)/setMargeAccount - Set Marge account (EOL May 2026)/pushCustomerSupportInfoToMarge - Push support info to cloud (EOL May 2026)Reset and Control:
/getBCOReset - Get BCO reset status/setBCOReset - Set BCO resetNotes on Endpoint Discovery:
Implementation Priority:
Based on the official Bose SoundTouch Web API documentation: https://assets.bosecreative.com/m/496577402d128874/original/SoundTouch-Web-API.pdf