Bose SoundTouch Toolkit

Documentation for controlling and preserving Bose SoundTouch devices

View the Project on GitHub gesellix/Bose-SoundTouch

Bose SoundTouch Web API - Endpoints Overview

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.

Implementation Status Legend

API Basics

Device Information

GET /info ✅ Implemented

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>

Playback Control

GET /now_playing ✅ Implemented

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>

POST /key ✅ Implemented

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:

Rating and Bookmark Controls:

Power and System Controls:

Volume Controls:

Preset Controls:

Input Controls:

Shuffle Controls:

Repeat Controls:

State Values:

Sender Values:

Volume Control

GET /volume ✅ Implemented

Retrieves the current volume.

Response XML:

<volume deviceID="...">
  <targetvolume>50</targetvolume>
  <actualvolume>50</actualvolume>
  <muteenabled>false</muteenabled>
</volume>

POST /volume ✅ Implemented

Sets the volume.

Request XML:

<volume>50</volume>

Bass Settings

GET /bass ✅ Implemented

Retrieves the current bass settings.

Response XML:

<bass deviceID="...">
  <targetbass>0</targetbass>
  <actualbass>0</actualbass>
</bass>

POST /bass ✅ Implemented

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.

Source Management

GET /sources ✅ Implemented

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:

POST /select ✅ Implemented

Selects an audio source.

Request XML:

<ContentItem source="SPOTIFY" sourceAccount="...">
  <itemName>Spotify</itemName>
</ContentItem>

Preset Management

GET /presets ✅ Implemented

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>

POST /storePreset ✅ IMPLEMENTED

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:

XML 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

POST /removePreset ✅ IMPLEMENTED

Removes/clears a preset slot.

Implementation:

XML Request:

<preset id="3"/>

Alternative Methods:

Advanced Features

GET /getZone ✅ Implemented

Retrieves multiroom zone information.

POST /setZone ✅ Implemented

Configures multiroom zones.

GET /balance ✅ Implemented

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>

POST /balance ✅ Implemented

Sets balance settings. Value must be within the range specified by balanceMin and balanceMax.

Request XML:

<balance>
  <targetBalance>0</targetBalance>
</balance>

Range Examples:

GET /clockTime ✅ Implemented

Retrieves 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>

POST /clockTime ✅ Implemented

Sets the device time.

GET /clockDisplay ✅ Implemented

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>

POST /clockDisplay ✅ Implemented

Configures the clock display.

POST /speaker ✅ Implemented

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&amp;tl=EN&amp;client=tw-ob&amp;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:

GET /playNotification ✅ Implemented

Plays a notification beep sound (ST-10 Series only).

Response XML:

<status>/playNotification</status>

Implementation:

WebSocket Connection

WebSocket / ✅ Implemented

Establishes a persistent connection for live updates.

Event Types:

Network and System

GET /networkInfo ✅ Implemented

Retrieves 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>

GET /capabilities ✅ Implemented

Retrieves device capabilities.

GET /name 🔍 Extra

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.

POST /name ✅ Implemented

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.

GET /bassCapabilities ✅ Implemented

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>

GET /trackInfo ✅ Implemented

Gets extended track information for currently playing music service media.

Response XML:

<trackInfo deviceID="...">Track Name;extended details;separated by semicolons;</trackInfo>

Important Notes:

Implementation: Available via GetTrackInfo() method. Consider using GetNowPlaying() method for guaranteed compatibility.

Zone Slave Management ✅ Implemented

Both official low-level endpoints and high-level zone management are available:

POST /addZoneSlave ✅ Implemented

Add individual device to existing zone using official API format.

Implementation: Available via AddZoneSlave() and AddZoneSlaveByDeviceID() methods

POST /removeZoneSlave ✅ Implemented

Remove individual device from existing zone using official API format.

Implementation: Available via RemoveZoneSlave() and RemoveZoneSlaveByDeviceID() methods

High-Level Zone API ✅ Enhanced

Advanced Audio Controls ✅ Conditionally Available

Professional/high-end device features (only available on devices that list these capabilities):

/audiodspcontrols - GET/POST ✅ Implemented

Access 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 ✅ Implemented

Advanced 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 ✅ Implemented

Speaker 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

Clock and Network Endpoints 🔍 Extra

These endpoints work with real hardware but are NOT in official API v1.0:

Balance Control 🔍 Extra

Note: Not documented in official API v1.0 but works with real devices.

Token Management ✅ Implemented

GET /requestToken ✅ Implemented

Generates a new bearer token from the device for authentication purposes.

Response XML:

<bearertoken value="Bearer vUApzBVT6Lh0nw1xVu/plr1UDRNdMYMEpe0cStm4wCH5mWSjrrtORnGGirMn3pspkJ8mNR1MFh/J4OcsbEikMplcDGJVeuZOnDPAskQALvDBCF0PW74qXRms2k1AfLJ/" />

Usage:

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

Coverage Summary

Official API Coverage: 100%

Real Device Discovery: 103 Endpoints Found

Feature Coverage: 100%

Error Handling

The API uses standard HTTP status codes:

Example Implementation

// 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
}

Notes

  1. XML Namespace: Most responses use no explicit XML namespace
  2. Encoding: UTF-8 is used for all XML documents
  3. Timeouts: Recommended timeout for HTTP requests: 10 seconds
  4. Rate Limiting: No explicit limits documented, but moderate usage recommended
  5. Device Discovery: Devices can be found via UPnP on the local network

Comprehensive Endpoint Discovery

GET /supportedURLs ✅ Implemented

Retrieves all supported endpoints for the specific device with comprehensive feature mapping.

Client Method: GetSupportedURLs() (*models.SupportedURLsResponse, error) CLI Commands:

Response 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:

Playback and Media Control:

Volume and Audio:

Sources and Content:

Presets and Favorites:

Music Services:

Station Management (Radio/Streaming):

Zone and Multiroom:

Clock and Display:

System and Configuration:

Network and Connectivity:

Bluetooth:

Pairing and Setup:

Software Updates:

Advanced Features:

Internal/System:

Product Information:

Marge Integration (Bose Cloud Services):

Reset and Control:

Notes on Endpoint Discovery:

Implementation Priority:

  1. High: Core functionality endpoints already implemented
  2. Medium: Music service integration, advanced zone management
  3. Low: Internal/diagnostic endpoints, factory operations

Reference

Based on the official Bose SoundTouch Web API documentation: https://assets.bosecreative.com/m/496577402d128874/original/SoundTouch-Web-API.pdf