Skip to content

SoundTouch WebServices API

Todd Lucas edited this page Jan 8, 2024 · 79 revisions

Each SoundTouch device hosts a webservices API, which responds to standard http GET and POST requests on port 8090 of the IPv4 address assigned to the device. The webservices API can be accessed using a standard browser (e.g. Chrome, Edge, FireFox, etc) for services that retrieve data, or via advanced utilities (e.g. PostMan, curl, etc) for services that allow settings to be updated via POST methods.

IMPORTANT - Service names are CaSe-SeNsItIvE!

If you have not done so, it would be best to assign ALL of your SoundTouch speakers their own static IPv4 address. This makes it much easier to diagnose problems in the future, as well as avoids confusion on what IPv4 address is assigned to which device. Some applications may require static addresses as well (e.g. Home Assistant, etc). Refer to you router documentation on how to configure static IPv4 addresses for attached devices - it usually involves knowing the MAC address of your device, and what IPv4 address you want to assign to it.

Once you have your static IPv4 addresses defined for your speakers, it's very simple to query the status of each speaker. For example, let's say you have two SoundTouch devices and assign them to static IPv4 addresses like so:

192.168.1.130 = ST-300 Wired SoundBar Speaker with SubWoofer  
192.168.1.131 = ST-10 Wireless Speaker  

You can then make requests to a device's services at the assigned IPv4 address on port 8090, like so:

Figure 1 - Service Request, /info Service, ST-300

http://192.168.1.130:8090/info

Figure 2 - Service Request, /info Service, ST-10

http://192.168.1.131:8090/info

The rest of this document describes the various services provided by the SoundTouch device WebServices API.

Audio DSP Controls

The /audiodspcontrols service returns (GET method) or updates (POST method) the current audio DSP controls configuration of the device.

If updating the configuration, the audiomode attribute value must be one of the values listed in the supportedaudiomodes attribute from a GET request.

Note that some SoundTouch devices do not support this functionality. For example, the ST-300 will support this, but the ST-10 will not. You should first query the /supportedUrls service to determine if the device supports the service.

The POST method of this service request will generate a audiodspcontrols websocket event, which contains the updated configuration values.

Figure 1 - Service Request

http://192.168.1.131:8090/audiodspcontrols

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<audiodspcontrols audiomode="AUDIO_MODE_NORMAL" videosyncaudiodelay="0" supportedaudiomodes="AUDIO_MODE_NORMAL|AUDIO_MODE_DIALOG" />

Figure 2a - Service Request, POST Body
This will change the audio mode to AUDIO_MODE_DIALOG.

<audiodspcontrols audiomode="AUDIO_MODE_DIALOG" />

Figure 2b - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<audiodspcontrols audiomode="AUDIO_MODE_NORMAL" videosyncaudiodelay="0" supportedaudiomodes="AUDIO_MODE_NORMAL|AUDIO_MODE_DIALOG" />

Figure 2c - Service Websocket Update Event

<updates deviceID="3004567890BB">
  <audiodspcontrols>
    <audiodspcontrols audiomode="AUDIO_MODE_NORMAL" videosyncaudiodelay="0" supportedaudiomodes="AUDIO_MODE_NORMAL|AUDIO_MODE_DIALOG" />
  </audiodspcontrols>
</updates>

Audio Product Level Controls

The /audioproductlevelcontrols service returns (GET method) or updates (POST method) the current audio product level controls configuration of the device.

If updating the configuration, the value attribute values for both bass and treble must be in the respective range of values listed in the minValue and maxValue attributes from a GET request.

Note that some SoundTouch devices do not support this functionality. For example, the ST-300 will support this, but the ST-10 will not. You should first query the /supportedUrls service to determine if the device supports the service.

The POST method of this service request will generate a audioproductlevelcontrols websocket event, which contains the updated configuration values.

Figure 1 - Service Request

http://192.168.1.131:8090/audioproductlevelcontrols

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<audioproductlevelcontrols>
  <frontCenterSpeakerLevel value="0" minValue="-100" maxValue="100" step="10" />
  <rearSurroundSpeakersLevel value="0" minValue="-100" maxValue="100" step="10" />
</audioproductlevelcontrols>

Figure 2a - Service Request, POST Body
This will change the front center speaker level to 0, and the rear surround speaker level to 0.

<audioproductlevelcontrols>
    <frontCenterSpeakerLevel value="0" />
    <rearSurroundSpeakersLevel value="0" />
</audioproductlevelcontrols>

Figure 2b - Service Response, ST-300 SoundBar

<audioproductlevelcontrols>
  <frontCenterSpeakerLevel value="0" minValue="-100" maxValue="100" step="10" />
  <rearSurroundSpeakersLevel value="0" minValue="-100" maxValue="100" step="10" />
</audioproductlevelcontrols>

Figure 2c - Service Websocket Update Event

<updates deviceID="3004567890BB">
  <audioproductlevelcontrols>
    <audioproductlevelcontrols>
      <frontCenterSpeakerLevel value="0" minValue="-100" maxValue="100" step="10" />
      <rearSurroundSpeakersLevel value="0" minValue="-100" maxValue="100" step="10" />
    </audioproductlevelcontrols>
  </audioproductlevelcontrols>
</updates>

Audio Product Tone Controls

The /audioproducttonecontrols service returns (GET method) or updates (POST method) the current audio product tone controls (e.g. bass and treble) configuration of the device.

If updating the configuration, the value attribute values for both bass and treble must be in the respective range of values listed in the minValue and maxValue attributes from a GET request.

Note that some SoundTouch devices do not support this functionality. For example, the ST-300 will support this, but the ST-10 will not. You should first query the /supportedUrls service to determine if the device supports the service.

The POST method of this service request will generate a audioproducttonecontrols websocket event, which contains the updated configuration values.

Figure 1 - Service Request

http://192.168.1.131:8090/audioproducttonecontrols

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<audioproducttonecontrols>
  <bass value="25" minValue="-100" maxValue="100" step="25" />
  <treble value="25" minValue="-100" maxValue="100" step="25" />
</audioproducttonecontrols>

Figure 2a - Service Request, POST Body
This will change the bass level to 25, and the treble level to 25.

<audioproducttonecontrols>
    <bass value="25" />
    <treble value="25" />
</audioproducttonecontrols>

Figure 2b - Service Response, ST-300 SoundBar

<audioproducttonecontrols>
  <bass value="25" minValue="-100" maxValue="100" step="25" />
  <treble value="25" minValue="-100" maxValue="100" step="25" />
</audioproducttonecontrols>

Figure 2c - Service Websocket Update Event

<updates deviceID="3004567890BB">
  <audioproducttonecontrols>
    <audioproducttonecontrols>
      <bass value="25" minValue="-100" maxValue="100" step="25" />
      <treble value="25" minValue="-100" maxValue="100" step="25" />
    </audioproducttonecontrols>
  </audioproducttonecontrols>
</updates>

Audio Speaker Attributes

The /audiospeakerattributeandsetting service returns the current audio speaker attribute and setting controls configuration of the device.

Note that some SoundTouch devices do not support this functionality. For example, the ST-300 will support this, but the ST-10 will not. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/audiospeakerattributeandsetting

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<audiospeakerattributeandsetting>
  <rear available="false" active="false" wireless="false" controllable="true" />
  <subwoofer01 available="true" active="true" wireless="true" controllable="true" />
</audiospeakerattributeandsetting>

Balance

The /balance service returns (GET method) or updates (POST method) the balance level configuration of the device. This service only works if the device is configured as part of a stereo pair.

If updating the configuration, the value must be in the respective range of values listed in the balanceMinValue and balanceMaxValue attributes from a GET request.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/balance

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<balance deviceID="1004567890AA">
  <balanceAvailable>false</balanceAvailable>
  <balanceMin>-7</balanceMin>
  <balanceMax>7</balanceMax>
  <balanceDefault>0</balanceDefault>
  <targetBalance>0</targetBalance>
  <actualBalance>0</actualBalance>
</balance>

Figure 2a - Service Request, POST Body
This will change the balance level to 0 (centered).

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

This will change the balance level to -7 (left speaker).

<balance>
  <targetBalance>-7</targetBalance>
</balance>

This will change the balance level to 7 (right speaker).

<balance>
  <targetBalance>7</targetBalance>
</balance>

Bass

The /bass service returns (GET method) or updates (POST method) the bass level configuration of the device.

If updating the configuration, the value must be in the respective range of values listed in the bassMin and bassMax attributes from a /bassCapabilities service GET request.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service. You should then query the /bassCapabilities service bassAvailable attribute to determine if the device supports changing the bass level.

Figure 1 - Service Request

http://192.168.1.131:8090/bass

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<bass deviceID="1004567890AA">
  <targetbass>0</targetbass>
  <actualbass>0</actualbass>
</bass>

Figure 2a - Service Request, POST Body
This will change the bass level to -9 (low bass).

<bass>-9</bass>

This will change the bass level to 0 (high bass).

<bass>0</bass>

Bass Capabilities

The /bassCapabilities service returns the current bass capability configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/bassCapabilities

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<bassCapabilities deviceID="1004567890AA">
  <bassAvailable>true</bassAvailable>
  <bassMin>-9</bassMin>
  <bassMax>0</bassMax>
  <bassDefault>0</bassDefault>
</bassCapabilities>

Bluetooth - Info

The /bluetoothInfo service returns the current bluetooth configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/bluetoothInfo

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<status>/clearBluetoothPaired</status>

Bluetooth - Clear Pairing List

The /clearBluetoothPaired service clears all existing bluetooth pairings from the device. After the request completes, any existing bluetooth pairings from other devices will no longer be able to connect; you will need to re-pair each device.

Some SoundTouch devices will emit a descending tone when the pairing list is cleared.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/clearBluetoothPaired

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<BluetoothInfo BluetoothMACAddress="34:15:13:45:2f:93" />

Bluetooth - Enter Pairing Mode

The /enterBluetoothPairing service instructs the device to enter bluetooth pairing mode, and waits for a compatible device to pair with.

On the device you want to connect (e.g. phone, tablet, etc), turn on Bluetooth. In the Bluetooth settings menu of the device, the SoundTouch device name should appear within a few seconds and allow your device to pair with it. Some SoundTouch devices will have a bluetooth indicator that turns blue when pairing mode is entered, as well as emit an asccending tone when the pairing is complete.

Once pairing is complete, the source is immediately switched to BLUETOOTH.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/enterBluetoothPairing

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<status>/enterBluetoothPairing</status>

Capabilities

The /capabilities service returns information about what capabilities (or features) the device supports. The response to this request will determine if the device is capable of supporting a given feature or not.

The following shows the request and response for this service for two different SoundTouch devices: an ST-10 Wireless Bookshelf Speaker, and an ST-300 SoundBar with Wireless Subwoofer. Notice the differences in the response <capability name=... items, and the <networkConfig> child nodes. The ST-300 has more capabilities than the ST-10, as it has the soundbar and subwoofer components, tone controls, HDMI CEC features, etc; the ST-10 does not have these features.

Figure 1 - Service Request

http://192.168.1.131:8090/capabilities

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<capabilities deviceID="1004567890AA">
  <networkConfig>
    <dualMode>true</dualMode>
    <wsapiproxy>true</wsapiproxy>
    <allInterfacesSupported />
    <wlanInterfaces />
    <security />
  </networkConfig>
  <dspCapabilities>
    <dspMonoStereo available="false" />
  </dspCapabilities>
  <lightswitch>false</lightswitch>
  <clockDisplay>false</clockDisplay>
  <capability name="systemtimeout" url="/systemtimeout" info="" />
  <capability name="rebroadcastlatencymode" url="/rebroadcastlatencymode" info="" />
  <lrStereoCapable>true</lrStereoCapable>
  <bcoresetCapable>false</bcoresetCapable>
  <disablePowerSaving>true</disablePowerSaving>
</capabilities>

Figure 1b - Service Response, ST-300 SoundBar with Subwoofer

<?xml version="1.0" encoding="UTF-8" ?>
<capabilities deviceID="3004567890BB">
  <networkConfig>
    <dualMode>true</dualMode>
    <wsapiproxy>true</wsapiproxy>
    <allInterfacesSupported />
    <wlanInterfaces />
    <security />
  </networkConfig>
  <dspCapabilities>
    <dspMonoStereo available="false" />
  </dspCapabilities>
  <lightswitch>false</lightswitch>
  <clockDisplay>false</clockDisplay>
  <capability name="audiodspcontrols" url="/audiodspcontrols" info="" />
  <capability name="audiospeakerattributeandsetting" url="/audiospeakerattributeandsetting" info="" />
  <capability name="productcechdmicontrol" url="/productcechdmicontrol" info="" />
  <capability name="producthdmiassignmentcontrols" url="/producthdmiassignmentcontrols" info="" />
  <capability name="audioproducttonecontrols" url="/audioproducttonecontrols" info="" />
  <capability name="audioproductlevelcontrols" url="/audioproductlevelcontrols" info="" />
  <capability name="systemtimeoutcontrol" url="/systemtimeoutcontrol" info="" />
  <capability name="rebroadcastlatencymode" url="/rebroadcastlatencymode" info="" />
  <lrStereoCapable>false</lrStereoCapable>
  <bcoresetCapable>false</bcoresetCapable>
  <disablePowerSaving>false</disablePowerSaving>
</capabilities>

Clock Display

The /clockDisplay service returns the current clock configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/clockDisplay

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<clockDisplay>
  <clockConfig timezoneInfo="America/Chicago" userEnable="false" timeFormat="TIME_FORMAT_12HOUR_ID" userOffsetMinute="0" brightnessLevel="70" userUtcTime="0" />
</clockDisplay>

Clock Time

The /clockTime service returns the current clock time configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/clockTime

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<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>

Configuration Status

The /soundTouchConfigurationStatus service returns the current SoundTouch configuration status configuration of the device.

The following are valid response status attribute values:

  • SOUNDTOUCH_CONFIGURED - device configuration is complete.
  • SOUNDTOUCH_NOT_CONFIGURED - device is not configured.
  • SOUNDTOUCH_CONFIGURING - device configuration is in progress.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/soundTouchConfigurationStatus

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<SoundTouchConfigurationStatus status="SOUNDTOUCH_CONFIGURED" />

DSP Mono Stereo

The /DSPMonoStereo service returns the current digital signal processor configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/DSPMonoStereo

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<DSPMonoStereo deviceID="1004567890AA">
  <mono enable="false" />
</DSPMonoStereo>

Group - Status

The /getGroup service gets the current left / right stereo pair configuration of the device.

The ST-10 is the only SoundTouch product that supports stereo pair groups.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/group

Figure 2 - Service Response, ST-10

<?xml version='1.0' encoding='utf-8'?>
<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>

Group - Add Stereo Pair

The /addGroup service creates a new left / right stereo pair speaker group.

The ST-10 is the only SoundTouch product that supports stereo pair groups.

The POST method of this service request will generate a groupUpdated websocket event, which contains the updated group information. The event will be sent to each ROLE device of the group.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/addGroup

Figure 1a - Service Request, POST Body
This will create a new stereo pair named "Bose-ST10-1 + Bose-ST10-4". The Left speaker (and master) device id is 9070658C9D4A (192.168.1.131); the Right speaker device id is F45EAB3115DA (192.168.1.134).

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

Figure 2 - Service Response, ST-10

<?xml version='1.0' encoding='utf-8'?>
<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>

Group - Remove Stereo Pair

The /removeGroup service removes an existing left / right stereo pair speaker group.

The ST-10 is the only SoundTouch product that supports stereo pair groups.

The GET method of this service request will generate a groupUpdated websocket event, which contains the updated group information.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/removeGroup

Figure 1a - Service Response, ST-10

<?xml version='1.0' encoding='utf-8'?>
<group />

Group - Update Name

The /updateGroup service updates the name of a left / right stereo pair speaker group.

The ST-10 is the only SoundTouch product that supports stereo pair groups.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/updateGroup

Figure 1a - Service Request, POST Body
This will update an existing stereo pair group name to "Bose-ST10-1 + Bose-ST10-4 Group".

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

Figure 2 - Service Response, ST-10

<?xml version='1.0' encoding='utf-8'?>
<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>
  <senderIPAddress>192.168.1.131</senderIPAddress>
</group>

Information

The /info service returns basic information that is common to all SoundTouch devices.The response contains such details as device name, device type, what software components are installed and their versions, region codes, and other valuable information.

The following shows the request and response for this service for two different SoundTouch devices: an ST-10 Wireless Bookshelf Speaker, and an ST-300 SoundBar with Wireless Subwoofer. Notice that the ST-300 speaker information response contained more output than the ST-10 speaker information response. It's because the ST-300 has more capabilities than the ST-10: it has the soundbar and subwoofer components, tone controls, HDMI CEC features, etc.

Figure 1 - Service Request

http://192.168.1.131:8090/info

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<info deviceID="1004567890AA">
  <name>SoundTouch 10</name>
  <type>SoundTouch 10</type>
  <margeAccountUUID>1234567</margeAccountUUID>
  <components>
    <component>
      <componentCategory>SCM</componentCategory>
      <softwareVersion>27.0.6.46330.5043500 epdbuild.trunk.hepdswbld04.2022-08-04T11:20:29</softwareVersion>
      <serialNumber>P7277179802731234567890</serialNumber>
    </component>
    <component>
      <componentCategory>PackagedProduct</componentCategory>
      <softwareVersion>27.0.6.46330.5043500 epdbuild.trunk.hepdswbld04.2022-08-04T11:20:29</softwareVersion>
      <serialNumber>069234P71234567AE</serialNumber>
    </component>
  </components>
  <margeURL>https://streaming.bose.com</margeURL>
  <networkInfo type="SCM">
    <macAddress>1004567890AA</macAddress>
    <ipAddress>192.168.1.131</ipAddress>
  </networkInfo>
  <networkInfo type="SMSC">
    <macAddress>3415131234CA</macAddress>
    <ipAddress>192.168.1.131</ipAddress>
  </networkInfo>
  <moduleType>sm2</moduleType>
  <variant>rhino</variant>
  <variantMode>normal</variantMode>
  <countryCode>US</countryCode>
  <regionCode>US</regionCode>
</info>

Figure 1b - Service Response, ST-300 SoundBar with Subwoofer

<?xml version="1.0" encoding="UTF-8" ?>
<info deviceID="3004567890BB">
  <name>Bose SoundTouch 300</name>
  <type>SoundTouch 300</type>
  <margeAccountUUID>1234567</margeAccountUUID>
  <components>
    <component>
      <componentCategory>SCM</componentCategory>
      <softwareVersion>27.0.6.46330.5043500 epdbuild.trunk.hepdswbld04.2022-08-04T11:20:29</softwareVersion>
      <serialNumber>3004567890BB</serialNumber>
    </component>
    <component>
      <componentCategory>PackagedProduct</componentCategory>
      <softwareVersion>1.16.7.5043495</softwareVersion>
      <serialNumber>073992P72221440AE</serialNumber>
    </component>
    <component>
      <componentCategory>F0</componentCategory>
      <softwareVersion>1.8.1.12410</softwareVersion>
      <serialNumber>n/a</serialNumber>
    </component>
    <component>
      <componentCategory>BLOB</componentCategory>
      <softwareVersion>1.16.7.5043495</softwareVersion>
      <serialNumber>n/a</serialNumber>
    </component>
    <component>
      <componentCategory>BASS</componentCategory>
      <softwareVersion>01.09.15</softwareVersion>
      <serialNumber>n/a</serialNumber>
    </component>
    <component>
      <componentCategory>LPM</componentCategory>
      <softwareVersion>1.16.7.12619: 2021-06-15T12:16:01 (Release)</softwareVersion>
      <serialNumber>n/a</serialNumber>
    </component>
    <component>
      <componentCategory>LPMBL</componentCategory>
      <softwareVersion>1.0.0.7617</softwareVersion>
      <serialNumber>n/a</serialNumber>
    </component>
    <component>
      <componentCategory>LLW</componentCategory>
      <softwareVersion>25</softwareVersion>
      <serialNumber>n/a</serialNumber>
    </component>
  </components>
  <margeURL>https://streaming.bose.com</margeURL>
  <networkInfo type="SCM">
    <macAddress>3004567890BB</macAddress>
    <ipAddress>192.168.1.130</ipAddress>
  </networkInfo>
  <networkInfo type="SMSC">
    <macAddress>D43639610922</macAddress>
    <ipAddress>192.168.1.130</ipAddress>
  </networkInfo>
  <moduleType>sm2</moduleType>
  <variant>ginger</variant>
  <variantMode>noap</variantMode>
  <countryCode>US</countryCode>
  <regionCode>US</regionCode>
</info>

Introspect Data

The /introspect service sends retrieves introspect data for a specified source.

Some sources do not supply introspect data: PANDORA, STORED_MUSIC.

Figure 1 - Service Request

http://192.168.1.131:8090/introspect

Figure 1a - Service Request, POST Body

<introspect source="SPOTIFY" sourceAccount="SpotifyConnectUserName" />

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<spotifyAccountIntrospectResponse state="InactiveUnselected" user="SpotifyConnectUserName" isPlaying="false" tokenLastChangedTimeSeconds="1702566495" tokenLastChangedTimeMicroseconds="427884" shuffleMode="OFF" playStatusState="2" currentUri="" receivedPlaybackRequest="false" subscriptionType="">
  <cachedPlaybackRequest />
  <nowPlaying skipPreviousSupported="false" seekSupported="false" resumeSupported="true" collectData="true" />
  <contentItemHistory maxSize="10" />
</spotifyAccountIntrospectResponse>

Key Press, Release

The /key service sends (POST method) a specified key press or release to the device. Note that you have to send the press request separately from the release request. There is also a repeat state that can be sent, but not sure what it does.

IMPORTANT - Key values, state, and sender attributes are CaSe-SeNsItIvE!

The key value to send must be one of the following supported values:

  • ADD_FAVORITE - Adds the currently playing media to the device favorites.
    Note that this key is reserved for source music services that support favorites (e.g. PANDORA, SPOTIFY, etc).
  • AUX_INPUT - Switches the device source to AUX input.
  • BOOKMARK - Mutes the volume of the device.
  • MUTE - Mutes the volume on the device.
  • NEXT_TRACK - Move to the next track in the current media playlist.
  • PAUSE - Pause the current media playing.
  • PLAY - Play currently selected media.
  • PLAY_PAUSE - Toggles between play and pause for the currently playing media.
  • POWER - Toggle the power on or off on the device.
  • PRESET_1 - Selects pre-defined preset number 1 on the device.
  • PRESET_2 - Selects pre-defined preset number 2 on the device.
  • PRESET_3 - Selects pre-defined preset number 3 on the device.
  • PRESET_4 - Selects pre-defined preset number 4 on the device.
  • PRESET_5 - Selects pre-defined preset number 5 on the device.
  • PRESET_6 - Selects pre-defined preset number 6 on the device.
  • PREV_TRACK - Move to the previous track in the current media playlist.
  • REMOVE_FAVORITE - Removes the currently playing media from the device favorites.
    Note that this key is reserved for source music services that support favorites (e.g. PANDORA, SPOTIFY, etc).
  • REPEAT_ALL - Enables the repeat all setting for a playlist.
  • REPEAT_OFF - Disables the repeat setting for a playlist.
  • REPEAT_ONE - Enables the repeat one setting for a playlist.
  • SHUFFLE_OFF - Disables shuffle mode for a playlist.
  • SHUFFLE_ON - Enables shuffle mode for a playlist.
  • STOP - Stop the current media playing.
  • THUMBS_DOWN - Sets a thumbs down rating for the currently playing media.
    Note that this key is reserved for source music services that support ratings (e.g. PANDORA, SPOTIFY, etc).
  • THUMBS_UP - Sets a thumbs up rating for the currently playing media.
    Note that this key is reserved for source music services that support ratings (e.g. PANDORA, SPOTIFY, etc).
  • VOLUME_DOWN - Decrease the volume of the device by one.
  • VOLUME_UP - Increase the volume of the device by one.

The state attribute value to send must be one of the following supported values:

  • press - Indicates the key is pressed.
  • release - Indicates the key is released.
  • repeat - Indicates the key is repeated.

The sender attribute value to send must be one of the following supported values:

  • Gabbo - Default value to use for standard SoundTouch remote control device.
  • IrRemote - Not sure what this represents, but it IS an acceptable value.
  • Console - Not sure what this represents, but it IS an acceptable value.
  • LightswitchRemote - Not sure what this represents, but it IS an acceptable value.
  • BoselinkRemote - Not sure what this represents, but it IS an acceptable value.
  • Etap - Not sure what this represents, but it IS an acceptable value.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/key

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<status>/key</status>

Figure 2a - Service Request, POST Body
This will send the POWER key press value.

<key state="press" sender="Gabbo">POWER</key>

This will send the POWER key release value.

<key state="press" sender="Gabbo">POWER</key>

Language

The /language service returns the current language configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/language

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<sysLanguage>3</sysLanguage>

Media Servers List

The /listMediaServers service returns information about what UPnP (DLNA) media servers are detected by the device. The devices returned should also have corresponding sourceAccount values in the sources list.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/listMediaServers

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<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>

Music Library - Get Items

The /navigate service returns child container items from a music library container for the specified music library (e.g. STORED_MUSIC, etc).

A <navigateResponse> <item> from the /navigate service response can be used to play the item's media content by passing its <ContentItem> value to the /select service.

Music library containers can be traversed by issuing calls to a child container's <item> content, starting at the Root container. See Figure 1a below for how to navigate the Root container; See Figure 2a below for how to navigate the Root \ Music container.

Music library containers can also be traversed by issuing calls that start at a specific container. For example, lets say you like to listen to songs from your favorite album; you could navigate the container directly if you know the source, sourceAccount, and location values. See Figure 3a below for how to navigate a specific container.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

The following examples illustrate how to traverse the structure of a NAS Music Library. Your library location values will be different than the examples below, as they use GUID (globally unique identifiers) to identify the container.

My NAS Music Library has the following containers defined:

  • Root container
  • -- Music
  • ---- Albums
  • ------ Welcome to the New
  • ------ ... and more (albums from other artists)
  • ---- ... and more (Album Artists, All Artists, All Music, Composers, Genre, etc)
  • -- ... and more (Pictures, PlayLists, Videos)

Figure 1 - Service Request

http://192.168.1.131:8090/navigate

Figure 1a - Service Request, POST Body, Root Container
Retrieve items from a NAS Music Library: Root container.

<navigate source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <startItem>1</startItem>
  <numItems>1000</numItems>
</navigate>

Figure 1b - Service Response, Root Container

<?xml version="1.0" encoding="UTF-8" ?>
<navigateResponse source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <totalItems>4</totalItems>
  <items>
    <item Playable="1">
      <name>Music</name>
      <type>dir</type>
      <mediaItemContainer offset="0">
        <ContentItem source="STORED_MUSIC" location="0" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
          <itemName>d09708a1-5953-44bc-a413-123456789012/0</itemName>
        </ContentItem>
      </mediaItemContainer>
      <ContentItem source="STORED_MUSIC" location="1" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Music</itemName>
      </ContentItem>
    </item>
    <item Playable="1">
      <name>Playlists</name>
      <type>dir</type>
      <mediaItemContainer offset="2">
        <ContentItem source="STORED_MUSIC" location="0" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
          <itemName>d09708a1-5953-44bc-a413-123456789012/0</itemName>
        </ContentItem>
      </mediaItemContainer>
      <ContentItem source="STORED_MUSIC" location="12" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Playlists</itemName>
      </ContentItem>
    </item>
  </items>
</navigateResponse>

Figure 2a - Service Request, POST Body, Root \ Music Container
Retrieve items from a NAS Music Library: Root \ Music container.

<navigate source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <startItem>1</startItem>
  <numItems>1000</numItems>
  <item Playable="1">
    <name>Music</name>
    <type>dir</type>
    <ContentItem source="STORED_MUSIC" location="1" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
      <itemName>Music</itemName>
    </ContentItem>
  </item>
</navigate>

Figure 2b - Service Response, Root \ Music Container

<?xml version='1.0' encoding='utf-8'?>
<navigateResponse source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <totalItems>10</totalItems>
  <items>
    <item Playable="1">
      <name>Album Artists</name>
      <type>dir</type>
      <mediaItemContainer offset="0">
        <ContentItem source="STORED_MUSIC" location="1" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
          <itemName>Music</itemName>
        </ContentItem>
      </mediaItemContainer>
      <ContentItem source="STORED_MUSIC" location="107" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Album Artists</itemName>
      </ContentItem>
    </item>
    <item Playable="1">
      <name>Albums</name>
      <type>dir</type>
      <mediaItemContainer offset="1">
        <ContentItem source="STORED_MUSIC" location="1" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
          <itemName>Music</itemName>
        </ContentItem>
      </mediaItemContainer>
      <ContentItem source="STORED_MUSIC" location="7" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Albums</itemName>
      </ContentItem>
    </item>
    ...
  </items>
</navigateResponse>

Figure 3a - Service Request, POST Body, Root Container
Retrieve items from a NAS Music Library: specific container.

<navigate source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <startItem>1</startItem>
  <numItems>1000</numItems>
  <item Playable="1">
    <name>Welcome to the New</name>
    <type>dir</type>
    <ContentItem source="STORED_MUSIC" location="7_114e8de9" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
      <itemName>Welcome to the New</itemName>
    </ContentItem>
  </item>
</navigate>

Figure 3b - Service Response, specific Container

<?xml version='1.0' encoding='utf-8'?>
<navigateResponse source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <totalItems>10</totalItems>
  <items>
    <item Playable="1">
      <name>Burn Baby Burn</name>
      <type>track</type>
      <mediaItemContainer offset="0">
        <ContentItem source="STORED_MUSIC" location="7_114e8de9" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
          <itemName>Welcome to the New</itemName>
        </ContentItem>
      </mediaItemContainer>
      <ContentItem source="STORED_MUSIC" location="7_114e8de9-8115 TRACK" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Burn Baby Burn</itemName>
      </ContentItem>
    </item>
    ...
    <item Playable="1">
      <name>Wishful Thinking</name>
      <type>track</type>
      <mediaItemContainer offset="9">
        <ContentItem source="STORED_MUSIC" location="7_114e8de9" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
          <itemName>Welcome to the New</itemName>
        </ContentItem>
      </mediaItemContainer>
      <ContentItem source="STORED_MUSIC" location="7_114e8de9-8114 TRACK" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Wishful Thinking</itemName>
      </ContentItem>
    </item>
  </items>
</navigateResponse>

Music Library - Search

The /search service searches a specified music library container (e.g. STORED_MUSIC, etc).

Use the /sources service to get the source and sourceAccount values for the specific NAS Music Library you wish to search.

A <searchResponse> <item> from the /search service response can be used to play the item's media content by passing its <ContentItem> value to the /select service.

You must pay close attention to the filter attribute on the <searchTerm> node, as the SoundTouch webservices API is very picky on what filter types are allowed for a container.

The <startItem> node is required; otherwise, the search fails.

Music library containers can found using the /navigate service. Use the returned <navigateResponse> <item> <ContentItem> node in the /search request (see Figure 1 below).

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

The following examples illustrate how to search a NAS Music Library. Your library location values will be different than the examples below, as they use GUID (globally unique identifiers) to identify the container.

My NAS Music Library has the following containers defined:

  • Root container
  • -- Music
  • ---- Albums
  • ------ Welcome to the New
  • ------ ... and more (albums from other artists)
  • ---- ... and more (Album Artists, All Artists, All Music, Composers, Genre, etc)
  • -- ... and more (Pictures, PlayLists, Videos)

Figure 1 - Service Request

http://192.168.1.131:8090/search

Figure 1a - Service Request, POST Body, Music Playlists
Search NAS library "Root \ Music \ Music Playlists" container for track names that contain "baby".

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

Figure 1b - Service Response, Music Playlists

<?xml version='1.0' encoding='utf-8'?>
<searchResponse source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <totalItems>2</totalItems>
  <items>
    <item Playable="1">
      <name>Baby, It's Cold Outside</name>
      <type>track</type>
      <ContentItem source="STORED_MUSIC" location="F_a62301e2-7788 TRACK" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Baby, It's Cold Outside</itemName>
      </ContentItem>
      <artistName>Anne Murray</artistName>
      <albumName>Christmas Album</albumName>
    </item>
    <item Playable="1">
      <name>Santa Baby</name>
      <type>track</type>
      <ContentItem source="STORED_MUSIC" location="F_a62301e2-7966 TRACK" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Santa Baby</itemName>
      </ContentItem>
      <artistName>Eartha Kitt</artistName>
      <albumName>Greatest Hits Purr-Fect</albumName>
    </item>
  </items>
</searchResponse>

Figure 2a - Service Request, POST Body, All Music
Search NAS library "Root \ Music \ All Music" container for track names that contain "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>

Figure 2b - Service Response, Music Playlists

<?xml version='1.0' encoding='utf-8'?>
<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>

Figure 3a - Service Request, POST Body, All Artists
Search NAS library "Root \ Music \ All Artists" container for artist names that contain "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>

Figure 3b - Service Response, Music Playlists

<?xml version='1.0' encoding='utf-8'?>
<searchResponse source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <totalItems>2</totalItems>
  <items>
    <item Playable="1">
      <name>MercyMe</name>
      <type>dir</type>
      <ContentItem source="STORED_MUSIC" location="6_a2874b5d" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>MercyMe</itemName>
      </ContentItem>
      <artistName>MercyMe</artistName>
    </item>
    <item Playable="1">
      <name>MercyMe feat. John Reuben</name>
      <type>dir</type>
      <ContentItem source="STORED_MUSIC" location="6_e43fcad" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>MercyMe feat. John Reuben</itemName>
      </ContentItem>
      <artistName>MercyMe feat. John Reuben</artistName>
    </item>
  </items>
</searchResponse>

Figure 4a - Service Request, POST Body, Albume
Search NAS library "Root \ Music \ Albums" container for album names that contain "Welcome to the New".

<search source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <startItem>1</startItem>
  <numItems>1000</numItems>
  <searchTerm filter="album">Welcome to the New</searchTerm>
  <item>
    <name>Albums</name>
    <type>dir</type>
    <ContentItem source="STORED_MUSIC" location="7" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true" />
  </item>
</search>

Figure 4b - Service Response, Music Playlists

<?xml version='1.0' encoding='utf-8'?>
<searchResponse source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
  <totalItems>1</totalItems>
  <items>
    <item Playable="1">
      <name>Welcome to the New</name>
      <type>dir</type>
      <ContentItem source="STORED_MUSIC" location="7_114e8de9" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Welcome to the New</itemName>
      </ContentItem>
      <artistName>MercyMe</artistName>
    </item>
  </items>
</searchResponse>

Music Service - Add Station

NOTE - This has only been tested with Pandora at this point, so not sure if it will work for Spotify, Amazon Music, etc. Use at your own risk!

The /addStation service adds a station to a music service (e.g. PANDORA, etc) collection of previously stored stations.

The added station will be immediately selected for playing.

A <searchResult> item from the /searchStation service can be used to find the token= value for an artist or song to add. See the Music Service - Search Stations topic for more information.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/addStation

Figure 1a - Service Request, POST Body, Pandora

<addStation source="PANDORA" sourceAccount="yourUserId" token="R4328162">
  <name>Zach Williams &amp; Essential Worship</name>
</addStation>

Figure 1b - Service Response, Pandora

<?xml version="1.0" encoding="UTF-8" ?>
<status>/addStation</status>

Music Service - Get My Stations

NOTE - This has only been tested with Pandora at this point, so not sure if it will work for Spotify, Amazon Music, etc. Use at your own risk!

The /navigate service returns a list of your stored stations from the specified music service (e.g. PANDORA, etc).

The first item returned should always be the "Shuffle" item, even when the list is sorted.

Sorting is controlled by the sort attribute, and must be one of the following (if specified, CaSe-SeNsItIvE!):

  • dateCreated - sort by date created, descending.
  • stationName - sort by station name, ascending.

The startItem and numItems nodes do not appear to do anything for some music services (e.g. Pandora).

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/navigate

Figure 1a - Service Request, POST Body, Pandora

<navigate source="PANDORA" sourceAccount="yourUserId" menu="radioStations" sort="dateCreated">
  <startItem>1</startItem>
  <numItems>100</numItems>
</navigate>

Figure 1b - Service Response, Pandora

<navigateResponse source="PANDORA" sourceAccount="yourUserId">
  <totalItems>4</totalItems>
  <items>
    <item>
      <name>Shuffle</name>
      <type>station</type>
      <logo>https://www.pandora.com/img/shuffle_art_500W_500H.png</logo>
      <token>78324812463748620</token>
      <ContentItem source="PANDORA" location="78324812463748620" sourceAccount="yourUserId" isPresetable="true">
        <itemName>Shuffle</itemName>
        <containerArt>https://www.pandora.com/img/shuffle_art_500W_500H.png</containerArt>
      </ContentItem>
    </item>
    <item>
      <name>Zach Williams Radio</name>
      <type>station</type>
      <logo>https://content-images.p-cdn.com/images/8b/a1/c6/4f/b1984bf7881e1e207790968b/_500W_500H.jpg</logo>
      <token>126740707481236361</token>
      <ContentItem source="PANDORA" location="126740707481236361" sourceAccount="yourUserId" isPresetable="true">
        <itemName>Zach Williams Radio</itemName>
        <containerArt>https://content-images.p-cdn.com/images/8b/a1/c6/4f/b1984bf7881e1e207790968b/_500W_500H.jpg</containerArt>
      </ContentItem>
    </item>
    <item>
      <name>for KING &amp; COUNTRY Radio</name>
      <type>station</type>
      <logo>https://content-images.p-cdn.com/images/01/fd/34/03/019c4872ae1867eb51aae24c/_500W_500H.jpg</logo>
      <token>141754538758515924</token>
      <ContentItem source="PANDORA" location="141754538758515924" sourceAccount="yourUserId" isPresetable="true">
        <itemName>for KING &amp; COUNTRY Radio</itemName>
        <containerArt>https://content-images.p-cdn.com/images/01/fd/34/03/019c4872ae1867eb51aae24c/_500W_500H.jpg</containerArt>
      </ContentItem>
    </item>
    <item>
      <name>Crowder Radio</name>
      <type>station</type>
      <logo>https://content-images.p-cdn.com/images/5c/86/92/a7/b7df44ca88c0d4b616ae0c33/_500W_500H.jpg</logo>
      <token>112331607599231187</token>
      <ContentItem source="PANDORA" location="112331607599231187" sourceAccount="yourUserId" isPresetable="true">
        <itemName>Crowder Radio</itemName>
        <containerArt>https://content-images.p-cdn.com/images/5c/86/92/a7/b7df44ca88c0d4b616ae0c33/_500W_500H.jpg</containerArt>
      </ContentItem>
    </item>
  </items>
</navigateResponse>

Music Service - Remove Station

NOTE - This has only been tested with Pandora at this point, so not sure if it will work for Spotify, Amazon Music, etc. Use at your own risk!

The /removeStation service removes a station from a music service (e.g. PANDORA, etc) collection of previously stored stations.

Playing will be stopped and the NowPlaying status will be updated with source="INVALID_SOURCE" if the station being removed is currently playing; otherwise, currently playing content is not changed.

A navigateResponse item can be used to obtain the ContentItem used for this request. See the Music Service - Get My Stations topic for more information.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/removeStation

Figure 1a - Service Request, POST Body, Pandora

<ContentItem source="PANDORA" location="126740707481236361" sourceAccount="yourUserId" isPresetable="true">
  <itemName>Zach Williams Radio</itemName>
</ContentItem>

Figure 1b - Service Response, Pandora

<?xml version="1.0" encoding="UTF-8" ?>
<status>/removeStation</status>

Music Service - Search Stations

NOTE - This has only been tested with Pandora at this point, so not sure if it will work for Spotify, Amazon Music, etc. Use at your own risk!

The /searchStation service searches a music service (e.g. PANDORA, etc) for stations that can be added to a users collection of stations.

Attributes from a SearchResult item can be used to add a found artist or song to your music service collection of favorite artists / songs. See the Music Service - Add Station topic for more information.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/searchStation

Figure 1a - Service Request, POST Body, Pandora
NOTE - I have not been able to figure out how to specify other criteria with the request (e.g. sortOrder, max number of items to return, etc).

<search source="PANDORA" sourceAccount="yourUserId">
  Zach Williams
</search>

Figure 1b - Service Response, Pandora

<results deviceID="1004567890AA" source="PANDORA" sourceAccount="yourUserId">
  <songs>
    <searchResult source="PANDORA" sourceAccount="yourUserId" token="S88589974">
      <name>Cornerstone (Radio Edit) (feat. Zach Williams)</name>
      <artist>TobyMac</artist>
      <logo>http://mediaserver-cont-usc-mp1-1-v4v6.pandora.com/images/28/d3/25/ac/9cab4ea69ebf032dcd8d7305/1080W_1080H.jpg</logo>
    </searchResult>
    <searchResult source="PANDORA" sourceAccount="yourUserId" token="S10657777">
      <name>Old Church Choir</name>
      <artist>Zach Williams</artist>
      <logo>http://mediaserver-cont-usc-mp1-1-v4v6.pandora.com/images/bb/11/43/e8/0dac47d1af3d9c13383b0589/1080W_1080H.jpg</logo>
    </searchResult>
    <searchResult source="PANDORA" sourceAccount="yourUserId" token="S10657771">
      <name>Chain Breaker</name>
      <artist>Zach Williams</artist>
      <logo>http://mediaserver-cont-dc6-1-v4v6.pandora.com/images/bb/11/43/e8/0dac47d1af3d9c13383b0589/1080W_1080H.jpg</logo>
    </searchResult>
    ... results truncated
    <searchResult source="PANDORA" sourceAccount="yourUserId" token="S45321233">
      <name>Rescue Story</name>
      <artist>Zach Williams</artist>
      <logo>http://mediaserver-cont-usc-mp1-1-v4v6.pandora.com/images/9c/1b/9e/9b/4910489d9a8172e14a14045f/1080W_1080H.jpg</logo>
    </searchResult>
  </songs>
  <artists>
    <searchResult source="PANDORA" sourceAccount="yourUserId" token="R324771">
      <name>Zach Williams</name>
      <logo>http://mediaserver-cont-dc6-2-v4v6.pandora.com/images/b2/15/fe/06/ac3a423599f080aa51b859fd/1080W_1080H.jpg</logo>
    </searchResult>
    <searchResult source="PANDORA" sourceAccount="yourUserId" token="R2218555">
      <name>Zach Williams &amp; Dolly Parton</name>
      <logo>http://mediaserver-cont-usc-mp1-1-v4v6.pandora.com/images/0a/e6/4b/b3/ace347af9a812c4d11bacf8e/1080W_1080H.jpg</logo>
    </searchResult>
    <searchResult source="PANDORA" sourceAccount="yourUserId" token="R4328162">
      <name>Zach Williams &amp; Essential Worship</name>
      <logo>http://mediaserver-cont-usc-mp1-1-v4v6.pandora.com/images/de/b4/1c/81/046549efb363060132485fed/1080W_1080H.jpg</logo>
    </searchResult>
    ... results truncated
    <searchResult source="PANDORA" sourceAccount="yourUserId" token="R1097012">
      <name>Zach Williams (Holiday)</name>
      <logo>http://mediaserver-cont-usc-mp1-1-v4v6.pandora.com/images/4e/9a/1c/56/7e7d439a9fbb8998eb15cbd0/1080W_1080H.jpg</logo>
    </searchResult>
  </artists>
</results>    

Music Service - Track Info

The /trackInfo service extended track information for the current playing music service media.

This method only returns information if the currently playing content is from a music service source (e.g. PANDORA, SPOTIFY, etc). If currently playing media is NOT from a music service source (e.g. AIRPLAY, STORED_MUSIC, etc) then the SoundTouch webservice will become unresponsive (e.g. hangs) for about 30 seconds until it times out with an error status.

This information can differ slightly from the NowPlaying "Track" information, as it contains the track name plus extended details about the track. The extended details are delimited by a semi-colon; a semi-colon is still present after the track name if there is no extended data present. For example:

Who You Are To Me (feat. Lady A);vocal duets;upbeat lyrics;paired vocal harmony;  
A Marshmallow World;  <- no extended track info

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/trackInfo

Figure 1a - Service Response, Pandora

<?xml version="1.0" encoding="UTF-8" ?>
<trackInfo deviceID="1004567890AA">King Of Kings;upbeat lyrics;mixed acoustic and electric instrumentation;major key tonality;extensive vamping;basic rock song structures;</trackInfo>

Music Service - Remove Account

The /removeMusicServiceAccount service removes an existing music service account from the sources list.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/removeMusicServiceAccount

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<status>/removeMusicServiceAccount</status>

Figure 2a - Service Request, POST Body, Pandora
This will remove a Pandora Music Service account.

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

Figure 2b - Service Request, POST Body, NAS Library
This will remove a Music Library on NAS (STORED_MUSIC) Music Service account. Note the /0 on the end of the user name.

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

Music Service - Set Account

The /setMusicServiceAccount service adds a music service account to the sources list.

UPnP media server music service (e.g. "STORED_MUSIC") sources can only be set if the device has detected the UPnP media server. The detected UPnP media servers will appear in the /listMediaServers service response.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/setMusicServiceAccount

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<status>/setMusicServiceAccount</status>

Figure 2a - Service Request, POST Body, Pandora
This will add a Pandora Music Service account.

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

Figure 2b - Service Request, POST Body, NAS Library
This will add a Music Library on NAS (STORED_MUSIC) Music Service account. Note the /0 on the end of the user name.

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

Name

The /name service returns (GET method) or updates (POST method) the name configuration of the device.

If the name is changed, the change will be detected immediately via ZeroConf services.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/name

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<name>SoundTouch 10</name>

Figure 2a - Service Request, POST Body
This will change the name to "SoundTouch LivingRoom".

<name>SoundTouch Living Room</name>

Figure 2b - Service Response, ST-10 Speaker Response is the same as an /info response.

<?xml version="1.0" encoding="UTF-8" ?>
<info deviceID="1004567890AA">
  <name>SoundTouch LivingRoom</name>
  <type>SoundTouch 10</type>
  <margeAccountUUID>1234567</margeAccountUUID>
  <components>
    <component>
      <componentCategory>SCM</componentCategory>
      <softwareVersion>27.0.6.46330.5043500 epdbuild.trunk.hepdswbld04.2022-08-04T11:20:29</softwareVersion>
      <serialNumber>P7277179802731234567890</serialNumber>
    </component>
    <component>
      <componentCategory>PackagedProduct</componentCategory>
      <softwareVersion>27.0.6.46330.5043500 epdbuild.trunk.hepdswbld04.2022-08-04T11:20:29</softwareVersion>
      <serialNumber>069234P71234567AE</serialNumber>
    </component>
  </components>
  <margeURL>https://worldwide.bose.com/updates/soundtouch</margeURL>
  <networkInfo type="SCM">
    <macAddress>1004567890AA</macAddress>
    <ipAddress>192.168.1.131</ipAddress>
  </networkInfo>
  <networkInfo type="SMSC">
    <macAddress>3415131234CA</macAddress>
    <ipAddress>192.168.1.131</ipAddress>
  </networkInfo>
  <moduleType>sm2</moduleType>
  <variant>rhino</variant>
  <variantMode>normal</variantMode>
  <countryCode>US</countryCode>
  <regionCode>US</regionCode>
</info>

Network Info

The /networkInfo service returns the current network information configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/networkInfo

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<networkInfo wifiProfileCount="1">
  <interfaces>
    <interface type="WIFI_INTERFACE" name="wlan0" macAddress="3415131234CA" ipAddress="192.168.1.131" ssid="my_network_ssid" frequencyKHz="2452000" state="NETWORK_WIFI_CONNECTED" signal="MARGINAL_SIGNAL" mode="STATION" />
    <interface type="WIFI_INTERFACE" name="wlan1" macAddress="3415131234CB" state="NETWORK_WIFI_DISCONNECTED" />
  </interfaces>
</networkInfo>

Network Status

The /netStats service returns the current network status configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/netStats

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<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>netlucas_ssid</ssid>
          <rssi>Good</rssi>
          <frequencyKHz>2452000</frequencyKHz>
        </interface>
      </interfaces>
    </device>
  </devices>
</network-data>

Now Playing Status

The /nowPlaying service returns information about the currently playing media. This includes the source (e.g. "TUNEIN", "LOCAL_MEDIA", etc), location of the content, a descriptive name, covert art url, artist, album, track, if the item is a favorite or not, repeat settings, shuffle settings, and more.

The information returned is identical regardless of the device, as it is a feature that is supported by all SoundTouch devices.

The information returned can vary slightly based upon the source of the media. For example, the sourceAccount value is not required for "TUNEIN" content, but is required for "SPOTIFY" content.

Some special nodes of interest:

  • <isAdvertisement /> node will be present if the currently playing media content is an advertidement.
  • <isFavorite /> node will be present if the currently playing media content is marked as a favorite.
  • <favoriteEnabled /> node will be present if the currently playing media content can be marked as a favorite.
  • <rateEnabled /> node will be present if the currently playing media content can be rated (e.g. thumbs up, down).
  • <skipEnabled /> node will be present if the currently playing media content supports skip control.
  • <shuffleSetting> node will be present if the currently playing media supports shuffle mode.
  • <repeatSetting> node will be present if the currently playing media supports repeat mode.

The following shows the request for this service, with service responses obtained while various sources were playing.

Figure 1 - Service Request

http://192.168.1.131:8090/nowPlaying

Figure 1a - Service Response, Radio Station (TUNEIN)

<?xml version="1.0" encoding="UTF-8" ?>
<nowPlaying deviceID="1004567890AA" source="TUNEIN" sourceAccount="">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s33828" sourceAccount="" isPresetable="true">
        <itemName>K-LOVE Radio</itemName>
        <containerArt>http://cdn-profiles.tunein.com/s33828/images/logog.png?t=637986894890000000</containerArt>
    </ContentItem>
    <track>K-LOVE Radio</track>
    <artist>Cochren - Running Home (Running Home)</artist>
    <album></album>
    <stationName>K-LOVE Radio</stationName>
    <art artImageStatus="IMAGE_PRESENT">http://cdn-profiles.tunein.com/s33828/images/logog.png?t=1</art>
    <favoriteEnabled />
    <playStatus>PLAY_STATE</playStatus>
    <streamType>RADIO_STREAMING</streamType>
    <isFavorite />
</nowPlaying>

Figure 1b - Service Response, Music Library on Local Computer (LOCAL_MEDIA)

<?xml version="1.0" encoding="UTF-8" ?>
<nowPlaying deviceID="1004567890AA" source="LOCAL_MUSIC" sourceAccount="3f205110-4a57-4e91-810a-123456789012">
    <ContentItem source="LOCAL_MUSIC" type="album" location="album:983" sourceAccount="3f205110-4a57-4e91-810a-123456789012" isPresetable="true">
        <itemName>Welcome to the New</itemName>
        <containerArt>http://192.168.1.12:8085/v1/albums/983/image?_=1&amp;w=62</containerArt>
    </ContentItem>
    <track>Finish What He Started</track>
    <artist>MercyMe</artist>
    <album>Welcome to the New</album>
    <stationName></stationName>
    <art artImageStatus="IMAGE_PRESENT">http://192.168.1.12:8085/v1/albums/983/image?_=1</art>
    <time total="268">4</time>
    <skipEnabled />
    <playStatus>PLAY_STATE</playStatus>
    <shuffleSetting>SHUFFLE_OFF</shuffleSetting>
    <repeatSetting>REPEAT_OFF</repeatSetting>
    <skipPreviousEnabled />
    <streamType>TRACK_ONDEMAND</streamType>
    <artistID>31</artistID>
    <trackID>2579</trackID>
</nowPlaying>

Figure 1c - Service Response, Music Library on NAS (STORED_MUSIC)

<?xml version="1.0" encoding="UTF-8" ?>
<nowPlaying deviceID="1004567890AA" source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
    <ContentItem source="STORED_MUSIC" location="6_a2874b5d_4f83d999" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>MercyMe, It&apos;s Christmas!</itemName>
    </ContentItem>
    <track>A Holly Jolly Christmas</track>
    <artist>MercyMe</artist>
    <album>MercyMe, It&apos;s Christmas!</album>
    <offset>0</offset>
    <art artImageStatus="IMAGE_PRESENT">http://192.168.1.12:10243/WMPNSSv4/2050238549/0_Nl9hMjg3NGI1ZF80ZjgzZDk5OS04MDcz.jpg?albumArt=true</art>
    <time total="203">3</time>
    <skipEnabled />
    <playStatus>PLAY_STATE</playStatus>
    <shuffleSetting>SHUFFLE_OFF</shuffleSetting>
    <repeatSetting>REPEAT_OFF</repeatSetting>
    <skipPreviousEnabled />
</nowPlaying>

Figure 1d - Service Response, Music Service Advertisement

<?xml version="1.0" encoding="UTF-8" ?>
<nowPlaying deviceID="1004567890AA" source="PANDORA" sourceAccount="YourPandoraUserId">
  <ContentItem source="PANDORA" location="126740707481236361" sourceAccount="YourPandoraUserId" isPresetable="true">
    <itemName>Zach Williams Radio</itemName>
    <containerArt>https://content-images.p-cdn.com/images/68/88/0d/fb/aed34095a11118d2aa7b02a2/_500W_500H.jpg</containerArt>
  </ContentItem>
  <track></track>
  <artist></artist>
  <album></album>
  <stationName>Zach Williams Radio</stationName>
  <art artImageStatus="IMAGE_PRESENT">http://mediaserver-cont-usc-mp1-1-v4v6.pandora.com/images/public/devicead/e/l/i/t/daarv2audioprogtile_500W_500H.jpg</art>
  <rating>NONE</rating>
  <playStatus>PLAY_STATE</playStatus>
  <isAdvertisement />
</nowPlaying>

Figure 1e - Service Response, Pandora Music Service (PANDORA)

<?xml version="1.0" encoding="UTF-8" ?>
<nowPlaying deviceID="1004567890AA" source="PANDORA" sourceAccount="YourPandoraUserId">
  <ContentItem source="PANDORA" location="126740707481236361" sourceAccount="YourPandoraUserId" isPresetable="true">
    <itemName>Zach Williams Radio</itemName>
    <containerArt>https://content-images.p-cdn.com/images/68/88/0d/fb/aed34095a11118d2aa7b02a2/_500W_500H.jpg</containerArt>
  </ContentItem>
  <track>Reckless Love</track>
  <artist>Cory Asbury</artist>
  <album>Reckless Love</album>
  <stationName>Zach Williams Radio</stationName>
  <art artImageStatus="IMAGE_PRESENT">http://mediaserver-cont-dc6-2-v4v6.pandora.com/images/b5/64/9a/55/983740f79c3ef30202ac2605/1080W_1080H.jpg</art>
  <time total="333">17</time>
  <rating>NONE</rating>
  <skipEnabled />
  <rateEnabled />
  <playStatus>PLAY_STATE</playStatus>
</nowPlaying>

Play Notification Beep

The /playNotification service plays a notification beep on the device. This will cause device to pause the currently playing media, emit a double beep sound, and then resume the media play.

Note that some SoundTouch devices do not support this functionality. For example, the ST-10 will support this, but the ST-300 will not. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/playNotification

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<status>/playNotification</status>

Play TTS Message

The /speaker service plays a notification message via Google TTS (Text-To-Speech) processing.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service. Furthermore, some SoundTouch models still do not support this service, even though the [/supportedUrls] indicate they do (misleading)! Only the ST-10 in the III series support notifications, as far as I know. I could not get this to work on my ST-300, and another user reported that the ST-20 did not support it either.

The notification message is played at the level specified by the volumeLevel argument. Specify a volumeLevel of zero to play the notification at the current volume level. The volume level is restored to the level it was before the notification message was played after the notification is complete; e.g. if you made changes to the volume while the notification is playing then they are changed back to the volume level that was in effect prior to playing the notification. The SoundTouch device automatically takes care of the volume level switching; there are no calls in the method to change the volume or currently playing content status. The SoundTouch device also limits the volume range between 10 (min) and 70 (max).

The currently playing content (if any) is paused while the notification message content is played, and then resumed once the notification ends.

The <service> node content will appear in the NowPlaying status <artist> node.
The <message> node content will appear in the NowPlaying status <album> node.
The <reason> node content will appear in the NowPlaying status <track> node.

If the device is the master controller of a zone, then the notification message will be played on all devices that are members of the zone.

A small delay can be inserted at the start of the message by prefixing the sayText argument value with "a!". Example: "a!This is a test message". It's not a perfect solution, but works for me since my SoundTouch speaker takes a second or two to switch into active mode, and the first second of the played message is lost.

Figure 1 - Service Request

http://192.168.1.131:8090/speaker

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/speaker</status>

Figure 2a - Service Request, POST Body
NOTE - for all of these examples, you will need to supply your own <app_key> value.
Play a message via Google TTS (in English), using the current volume level.

<?xml version="1.0" encoding="UTF-8"?>
<play_info>
  <url>http://translate.google.com/translate_tts?ie=UTF-8&amp;tl=EN&amp;client=tw-ob&amp;q=a.There%20is%20activity%20at%20the%20front%20door.</url>
  <app_key>Xp7YGBI9dh763Kj8sY8e86JPXtisddBa</app_key>
  <service>TTS Notification</service>
  <message>Google TTS</message>
  <reason>a.There is activity at the front door.</reason>
</play_info>

Play a message via Google TTS (in Dutch), using the current volume level.

<?xml version="1.0" encoding="UTF-8"?>
<play_info>
  <url>http://translate.google.com/translate_tts?ie=UTF-8&amp;tl=DE&amp;client=tw-ob&amp;q=a.There%20is%20activity%20at%20the%20front%20door.</url>
  <app_key>Xp7YGBI9dh763Kj8sY8e86JPXtisddBa</app_key>
  <service>TTS Notification</service>
  <message>Google TTS</message>
  <reason>a.There is activity at the front door.</reason>
</play_info>

Play a message via Google TTS (in English), using a volume level of 70 (loud).

<?xml version="1.0" encoding="UTF-8"?>
<play_info>
  <url>http://translate.google.com/translate_tts?ie=UTF-8&amp;tl=EN&amp;client=tw-ob&amp;q=a.There%20is%20activity%20at%20the%20front%20door.</url>
  <app_key>Xp7YGBI9dh763Kj8sY8e86JPXtisddBa</app_key>
  <service>TTS Notification</service>
  <message>Google TTS</message>
  <reason>a.There is activity at the front door.</reason>
  <volume>70</volume>
</play_info>

Play URL

The /speaker service plays media from the given URL.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service. Furthermore, some SoundTouch models still do not support this service, even though the [/supportedUrls] indicate they do (misleading)! Only the ST-10 in the III series support notifications, as far as I know. I could not get this to work on my ST-300, and another user reported that the ST-20 did not support it either.

The given url content is played at the level specified by the volume argument. Specify a volume value of zero to play the given url content at the current volume level. The volume level is restored to the level it was before the given url content was played after play is complete; e.g. if you made changes to the volume while the given url content is playing then they are changed back to the volume level that was in effect prior to playing the given url content. The SoundTouch device automatically takes care of the volume level switching.

The currently playing content (if any) is paused while the given url content is played, and then resumed once the given url content ends. If the currently playing content is a url (or other "notification" source type), then an error message will be returned; to avoid this, send a NEXT_TRACK key press and release to stop the current play before playing the given url content.

The <service> node content will appear in the NowPlaying status <artist> node.
The <message> node content will appear in the NowPlaying status <album> node.
The <reason> node content will appear in the NowPlaying status <track> node.

If the device is the master controller of a zone, then the notification message will be played on all devices that are members of the zone.

Figure 1 - Service Request

http://192.168.1.131:8090/speaker

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/speaker</status>

Figure 2a - Service Request, POST Body
NOTE - for all of these examples, you will need to supply your own <app_key> value.
Play https url content using the current volume level.

<play_info>
  <url>https://freetestdata.com/wp-content/uploads/2021/09/Free_Test_Data_1MB_MP3.mp3</url>
  <app_key>Xp7YGBI9dh763Kj8sY8e86JPXtisddBa</app_key>
  <service>FreeTestData.com</service>
  <message>MP3 Test Data</message>
  <reason>Free_Test_Data_1MB_MP3</reason>
</play_info>

Play http url content using the current volume level.

<play_info>
  <url>http://www.hyperion-records.co.uk/audiotest/14%20Clementi%20Piano%20Sonata%20in%20D%20major,%20Op%2025%20No%206%20-%20Movement%202%20Un%20poco%20andante.MP3</url>
  <app_key>Xp7YGBI9dh763Kj8sY8e86JPXtisddBa</app_key>
  <service>Clementi</service>
  <message>Movements Album</message>
  <reason>Piano Sonata in D major</reason>
</play_info>

Play http url content using a volume level of 70 (loud).

<play_info>
  <url>http://www.hyperion-records.co.uk/audiotest/14%20Clementi%20Piano%20Sonata%20in%20D%20major,%20Op%2025%20No%206%20-%20Movement%202%20Un%20poco%20andante.MP3</url>
  <app_key>Xp7YGBI9dh763Kj8sY8e86JPXtisddBa</app_key>
  <service>Clementi</service>
  <message>Movements Album</message>
  <reason>Piano Sonata in D major</reason>
  <volume>70</volume>
</play_info>

Power Management

The /powerManagement service returns information about the power state and battery capability of the device.

Figure 1 - Service Request

http://192.168.1.131:8090/powerManagement

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<powerManagementResponse>
  <powerState>FullPower</powerState>
  <battery>
    <capable>false</capable>
  </battery>
</powerManagementResponse>

Power Standby

The /standby service places the device into STANDBY power mode (e.g. turns it off).

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/standby

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/standby</status>

Power Standby Low-Power

The /lowPowerStandby service places the device into low-power mode (e.g. turns it off).

Upon completion, the device will no longer respond to remote control commands nor to webservices api service requests, as it is low-power mode. You must physically hold down the power button on the device to turn it back on.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/lowPowerStandby

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/lowPowerStandby</status>

Preset List

The /presets service returns information about what presets have been stored to the device.

Figure 1 - Service Request

http://192.168.1.131:8090/presets

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8"?>
<presets>
  <preset id="1">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s33828" isPresetable="true">
      <itemName>K-LOVE Radio</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s33828/images/logog.png?t=637986894890000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="2">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309606" isPresetable="true">
      <itemName>K-LOVE 2000s</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s309606/images/logog.png?t=637986893640000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="3" createdOn="1701220500" updatedOn="1701220500">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309605" isPresetable="true">
      <itemName>My Copy K-Love 90s</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s309605/images/logog.png?t=637986891960000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="5">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s258421" isPresetable="true">
      <itemName>K-LOVE Christmas Radio</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s258421/images/logog.png?t=637986893260000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="6">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s320961" isPresetable="true">
      <itemName>K-LOVE Birthday Blend</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s320961/images/logog.png?t=637986892470000000</containerArt>
    </ContentItem>
  </preset>
</presets>

Preset Remove

The /removePreset service removes an existing preset from the device. A maximum of 6 presets may be removed from the device.

The response of this request contains the updated preset list.

The POST method of this service request will generate a presetsUpdated websocket event, which contains the updated preset list.

Figure 1 - Service Request

http://192.168.1.131:8090/removePreset

Figure 1a - Service Request, POST Body

<preset id="4"></preset>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8"?>
<presets>
  <preset id="1" createdOn="1700536011" updatedOn="1700536011">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s33828" sourceAccount="" isPresetable="true">
      <itemName>K-LOVE Radio</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s33828/images/logog.png?t=637986894890000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="2" createdOn="1700536010" updatedOn="1700536010">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309606" sourceAccount="" isPresetable="true">
      <itemName>K-LOVE 2000s</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s309606/images/logog.png?t=637986893640000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="3" createdOn="1701220837" updatedOn="1701220837">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309605" sourceAccount="" isPresetable="true">
      <itemName>My Copy K-Love 90s</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s309605/images/logog.png?t=637986891960000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="5" createdOn="1700536011" updatedOn="1700536011">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s258421" sourceAccount="" isPresetable="true">
      <itemName>K-LOVE Christmas Radio</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s258421/images/logog.png?t=637986893260000000</containerArt>
    </ContentItem>
  </preset>
</presets>

Figure 1c - Service Websocket Update Event

<updates deviceID="3004567890BB">
  <presetsUpdated>
    <presets>
      <preset id="1" createdOn="1700536011" updatedOn="1700536011">
        <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s33828" sourceAccount="" isPresetable="true">
          <itemName>K-LOVE Radio</itemName>
          <containerArt>http://cdn-profiles.tunein.com/s33828/images/logog.png?t=637986894890000000</containerArt>
        </ContentItem>
      </preset>
      <preset id="2" createdOn="1700536010" updatedOn="1700536010">
        <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309606" sourceAccount="" isPresetable="true">
          <itemName>K-LOVE 2000s</itemName>
          <containerArt>http://cdn-profiles.tunein.com/s309606/images/logog.png?t=637986893640000000</containerArt>
        </ContentItem>
      </preset>
      <preset id="3" createdOn="1701220837" updatedOn="1701220837">
        <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309605" sourceAccount="" isPresetable="true">
          <itemName>My Copy K-Love 90s</itemName>
          <containerArt>http://cdn-profiles.tunein.com/s309605/images/logog.png?t=637986891960000000</containerArt>
        </ContentItem>
      </preset>
      <preset id="5" createdOn="1700536011" updatedOn="1700536011">
        <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s258421" sourceAccount="" isPresetable="true">
          <itemName>K-LOVE Christmas Radio</itemName>
          <containerArt>http://cdn-profiles.tunein.com/s258421/images/logog.png?t=637986893260000000</containerArt>
        </ContentItem>
      </preset>
    </presets>
  </presetsUpdated>
</updates>

Preset Store

The /storePreset service stores a preset to the device. A maximum of 6 presets may be stored to the device.

If the preset id value already exists in the preset list, then the existing preset information is overlaid. If the preset content item values match an existing preset content item in the preset list, then the existing preset item is moved to the slot (1-6) specified by the new preset id value.

The response of this request contains the updated preset list.

The POST method of this service request will generate a presetsUpdated websocket event, which contains the updated preset list.

Figure 1 - Service Request

http://192.168.1.131:8090/storePreset

Figure 1a - Service Request, POST Body

<preset id="3" createdOn="1696133215" updatedOn="1696133215">
  <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309605" sourceAccount="" isPresetable="true">
    <itemName>K-LOVE 90s</itemName>
    <containerArt>http://cdn-profiles.tunein.com/s309605/images/logog.png?t=637986891960000000</containerArt>
  </ContentItem>
</preset>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8"?>
<presets>
  <preset id="1">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s33828" isPresetable="true">
      <itemName>K-LOVE Radio</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s33828/images/logog.png?t=637986894890000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="2">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309606" isPresetable="true">
      <itemName>K-LOVE 2000s</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s309606/images/logog.png?t=637986893640000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="3" createdOn="1701220500" updatedOn="1701220500">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309605" isPresetable="true">
      <itemName>K-LOVE 90s</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s309605/images/logog.png?t=637986891960000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="5">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s258421" isPresetable="true">
      <itemName>K-LOVE Christmas Radio</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s258421/images/logog.png?t=637986893260000000</containerArt>
    </ContentItem>
  </preset>
  <preset id="6">
    <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s320961" isPresetable="true">
      <itemName>K-LOVE Birthday Blend</itemName>
      <containerArt>http://cdn-profiles.tunein.com/s320961/images/logog.png?t=637986892470000000</containerArt>
    </ContentItem>
  </preset>
</presets>

Figure 1c - Service Websocket Update Event

<updates deviceID="3004567890BB">
  <presetsUpdated>
    <presets>
      <preset id="1" createdOn="1700536011" updatedOn="1700536011">
        <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s33828" sourceAccount="" isPresetable="true">
          <itemName>K-LOVE Radio</itemName>
          <containerArt>http://cdn-profiles.tunein.com/s33828/images/logog.png?t=637986894890000000</containerArt>
        </ContentItem>
      </preset>
      <preset id="2" createdOn="1700536010" updatedOn="1700536010">
        <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309606" sourceAccount="" isPresetable="true">
          <itemName>K-LOVE 2000s</itemName>
          <containerArt>http://cdn-profiles.tunein.com/s309606/images/logog.png?t=637986893640000000</containerArt>
        </ContentItem>
      </preset>
      <preset id="3" createdOn="1701220837" updatedOn="1701220837">
        <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309605" sourceAccount="" isPresetable="true">
          <itemName>My Copy K-Love 90s</itemName>
          <containerArt>http://cdn-profiles.tunein.com/s309605/images/logog.png?t=637986891960000000</containerArt>
        </ContentItem>
      </preset>
      <preset id="5" createdOn="1700536011" updatedOn="1700536011">
        <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s258421" sourceAccount="" isPresetable="true">
          <itemName>K-LOVE Christmas Radio</itemName>
          <containerArt>http://cdn-profiles.tunein.com/s258421/images/logog.png?t=637986893260000000</containerArt>
        </ContentItem>
      </preset>
    </presets>
  </presetsUpdated>
</updates>

Rebroadcast Latency Mode

The /rebroadcastlatencymode service returns the current rebroadcast latency mode configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/rebroadcastlatencymode

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<rebroadcastlatencymode mode="SYNC_TO_ZONE" controllable="true" />

Recents List

The /recents service returns information about media content that has been played on the device recently.

Figure 1 - Service Request

http://192.168.1.131:8090/recents

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8"?>
<recents>
  <recent deviceID="1004567890AA" utcTime="1701202831">
    <contentItem source="STORED_MUSIC" location="6_a2874b5d_4f83d999" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
      <itemName>MercyMe, It's Christmas!</itemName>
    </contentItem>
  </recent>
  <recent deviceID="1004567890AA" utcTime="1700232917" id="2487503626">
    <contentItem source="LOCAL_MUSIC" type="track" location="track:2590" sourceAccount="3f205110-4a57-4e91-810a-123456789012" isPresetable="true">
      <itemName>Baby It's Cold Outside - ANNE MURRAY</itemName>
    </contentItem>
  </recent>
  <recent deviceID="1004567890AA" utcTime="1700232868" id="2487503618">
    <contentItem source="LOCAL_MUSIC" type="track" location="track:2281" sourceAccount="3f205110-4a57-4e91-810a-123456789012" isPresetable="true">
      <itemName>You're Worthy of My Praise (feat. Barlowgirl)</itemName>
    </contentItem>
  </recent>
  <recent deviceID="1004567890AA" utcTime="1699027517" id="2485930515">
    <contentItem source="LOCAL_INTERNET_RADIO" type="stationurl" location="https://content.api.bose.io/core02/svc-bmx-adapter-orion/prod/orion/station?data=eyJuYW1lIjoidGVzdCBzdGF0aW9uIiwiaW1hZ2VVcmwiOiIiLCJzdHJlYW1VcmwiOiJodHRwczovL2ZyZWV0ZXN0ZGF0YS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDkvRnJlZV9UZXN0X0RhdGFfMU1CX01QMy5tcDMifQ%3D%3D" sourceAccount="" isPresetable="true">
      <itemName>test station</itemName>
    </contentItem>
  </recent>
  <recent deviceID="1004567890AA" utcTime="1697087351" id="2482861958">
    <contentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s33255" sourceAccount="" isPresetable="true">
      <itemName>89.7 | The River (College Radio)</itemName>
    </contentItem>
  </recent>
  <recent deviceID="1004567890AA" utcTime="1697084775" id="2482052465">
    <contentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s297990" sourceAccount="" isPresetable="true">
      <itemName>MSNBC</itemName>
    </contentItem>
  </recent>
</recents>

Select (AIRPLAY)

The /select service selects new media content to play on the device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.131:8090/select

Figure 1a - Service Request, POST Body

<ContentItem source="AIRPLAY" sourceAccount="AirPlay2DefaultUserName" isPresetable="false">
  <itemName>Todds iPhone</itemName>
</ContentItem>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <nowPlayingUpdated>
    <nowPlaying deviceID="1004567890AA" source="AIRPLAY" sourceAccount="AirPlay2DefaultUserName">
      <ContentItem source="AIRPLAY" sourceAccount="AirPlay2DefaultUserName" isPresetable="false" />
      <track>Dixieland Delight</track>
      <artist>Alabama</artist>
      <album>Alabama Live</album>
      <stationName>
      </stationName>
      <art artImageStatus="SHOW_DEFAULT_IMAGE" />
      <time total="309">247</time>
      <skipEnabled />
      <playStatus>PLAY_STATE</playStatus>
      <skipPreviousEnabled />
      <skipPreviousSupported value="true" />
      <seekSupported value="false" />
      <streamType>TRACK_ONDEMAND</streamType>
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

Select (BLUETOOTH)

The /select service selects new media content to play on the device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.131:8090/select

Figure 1a - Service Request, POST Body

<ContentItem source="BLUETOOTH" location="" sourceAccount="" isPresetable="false">
  <itemName>Todds iPhone</itemName>
</ContentItem>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <nowPlayingUpdated>
    <nowPlaying deviceID="1004567890AA" source="BLUETOOTH" sourceAccount="">
      <ContentItem source="BLUETOOTH" location="" sourceAccount="" isPresetable="false">
        <itemName>Todds iPhone</itemName>
      </ContentItem>
      <track>Love in the First Degree</track>
      <artist>Alabama</artist>
      <album>Alabama Live</album>
      <stationName>Todds iPhone</stationName>
      <art artImageStatus="SHOW_DEFAULT_IMAGE" />
      <skipEnabled />
      <playStatus>PLAY_STATE</playStatus>
      <skipPreviousEnabled />
      <genre>Other</genre>
      <connectionStatusInfo status="CONNECTED" deviceName="Todds iPhone" />
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

Select (LOCAL_INTERNET_RADIO)

The /select service selects new media content to play on the device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.131:8090/select

Figure 1a - Service Request, POST Body

<ContentItem source="LOCAL_INTERNET_RADIO" type="stationurl" location="https://content.api.bose.io/core02/svc-bmx-adapter-orion/prod/orion/station?data=eyJuYW1lIjoiWFhYWFhYWFhYWCIsImltYWdlVXJsIjoiIiwic3RyZWFtVXJsIjoiaHR0cHM6Ly9mcmVldGVzdGRhdGEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIxLzA5L0ZyZWVfVGVzdF9EYXRhXzFNQl9NUDMubXAzIn0%3D" isPresetable="true">
    <itemName>Jmn 8096</itemName>
</ContentItem>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <nowPlayingUpdated>
    <nowPlaying deviceID="1004567890AA" source="LOCAL_INTERNET_RADIO" sourceAccount="">
      <ContentItem source="LOCAL_INTERNET_RADIO" type="stationurl" location="https://content.api.bose.io/core02/svc-bmx-adapter-orion/prod/orion/station?data=eyJuYW1lIjoiWFhYWFhYWFhYWCIsImltYWdlVXJsIjoiIiwic3RyZWFtVXJsIjoiaHR0cHM6Ly9mcmVldGVzdGRhdGEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIxLzA5L0ZyZWVfVGVzdF9EYXRhXzFNQl9NUDMubXAzIn0%3D" sourceAccount="" isPresetable="true">
        <itemName>Jmn 8096</itemName>
      </ContentItem>
      <track>XXXXXXXXXX</track>
      <artist />
      <album />
      <stationName>XXXXXXXXXX</stationName>
      <art artImageStatus="SHOW_DEFAULT_IMAGE" />
      <playStatus>BUFFERING_STATE</playStatus>
      <streamType>RADIO_STREAMING</streamType>
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

Select (LOCAL_MUSIC)

The /select service selects new media content to play on the device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.131:8090/select

Figure 1a - Service Request, POST Body

<!-- 
Music Library on Computer
SoundTouch App Media Server must be running on the sourceAccount computer 
-->
<ContentItem source="LOCAL_MUSIC" type="album" location="album:983" sourceAccount="3f205110-4a57-4e91-810a-123456789012" isPresetable="true">
  <itemName>Welcome to the New</itemName>
  <containerArt>http://192.168.1.14:8085/v1/albums/983/image?_=1&amp;w=62</containerArt>
</ContentItem>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <nowPlayingUpdated>
    <nowPlaying deviceID="1004567890AA" source="LOCAL_MUSIC" sourceAccount="3f205110-4a57-4e91-810a-123456789012">
      <ContentItem source="LOCAL_MUSIC" type="album" location="album:983" sourceAccount="3f205110-4a57-4e91-810a-123456789012" isPresetable="true">
        <itemName>Welcome to the New</itemName>
        <containerArt>http://192.168.1.14:8085/v1/albums/983/image?_=1&amp;w=62</containerArt>
      </ContentItem>
      <track>Flawless</track>
      <artist>MercyMe</artist>
      <album>Welcome to the New</album>
      <stationName>
      </stationName>
      <art artImageStatus="IMAGE_PRESENT">http://192.168.1.14:8085/v1/albums/983/image?_=1</art>
      <time total="255">121</time>
      <skipEnabled />
      <playStatus>PLAY_STATE</playStatus>
      <shuffleSetting>SHUFFLE_OFF</shuffleSetting>
      <repeatSetting>REPEAT_OFF</repeatSetting>
      <skipPreviousEnabled />
      <streamType>TRACK_ONDEMAND</streamType>
      <artistID>31</artistID>
      <trackID>2662</trackID>
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

Select (PANDORA)

The /select service selects new media content to play on the device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.131:8090/select

Figure 1a - Service Request, POST Body

<ContentItem source="PANDORA" location="78324812463748619" sourceAccount="YourPandoraUserId" isPresetable="true">
  <itemName>MercyMe Radio</itemName>
  <containerArt>https://content-images.p-cdn.com/images/51/8c/74/06/8e734549b77c82dc86a76863/_500W_500H.jpg</containerArt>
</ContentItem>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <nowPlayingUpdated>
    <nowPlaying deviceID="1004567890AA" source="PANDORA" sourceAccount="YourPandoraUserId">
      <ContentItem source="PANDORA" location="78324812463748619" sourceAccount="YourPandoraUserId" isPresetable="true">
        <itemName>MercyMe Radio</itemName>
        <containerArt>https://content-images.p-cdn.com/images/51/8c/74/06/8e734549b77c82dc86a76863/_500W_500H.jpg</containerArt>
      </ContentItem>
      <track>Who Am I</track>
      <artist>Casting Crowns</artist>
      <album>Casting Crowns</album>
      <stationName>MercyMe Radio</stationName>
      <art artImageStatus="IMAGE_PRESENT">http://mediaserver-cont-dc6-2-v4v6.pandora.com/images/61/d4/1b/f7/b3a64c1d9fcc5040ca2812a4/1080W_1080H.jpg</art>
      <time total="336">300</time>
      <rating>NONE</rating>
      <skipEnabled />
      <rateEnabled />
      <playStatus>PLAY_STATE</playStatus>
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

Select (PRODUCT TV)

The /select service selects new media content to play on the device.

The PRODUCT source is only available with the ST-300 device, as far as I know. This will not work for an ST-520 device. Issue a call to the /sources service to see what sources are defined for your device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.130:8090/select

Figure 1a - Service Request, POST Body

<!-- 
Switch ST-300 Source to TV input.
-->
<ContentItem source="PRODUCT" sourceAccount="TV" isPresetable="true" />

Figure 1b - Service Response, ST-300 Soundbar

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Select (PRODUCT HDMI1)

The /select service selects new media content to play on the device.

The PRODUCT source is only available with the ST-300 device, as far as I know. This will not work for an ST-520 device. Issue a call to the /sources service to see what sources are defined for your device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.130:8090/select

Figure 1a - Service Request, POST Body

<!-- 
Switch ST-300 Source to TV input.
-->
<ContentItem source="PRODUCT" sourceAccount="HDMI_1" isPresetable="true" />

Figure 1b - Service Response, ST-300 Soundbar

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Select (SPOTIFY)

The /select service selects new media content to play on the device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

The following illustrate how to play various Spotify media types (artist, album, playlist, etc).

Figure 1 - Service Request

http://192.168.1.131:8090/select

Figure 1a - Service Request, POST Body, Spotify Artist

<!-- 
Play Content by uri: Artist
Must have signed up for a PREMIUM account at Spotify.com 
-->
<ContentItem source="SPOTIFY" type="uri" location="spotify:artist:6APm8EjxOHSYM5B4i3vT3q" sourceAccount="yourspotifysourceaccount" isPresetable="true">
  <itemName>MercyMe</itemName>
  <containerArt>https://i.scdn.co/image/ab67616d0000b27316c019c87a927829804caf0b</containerArt>
</ContentItem>

Figure 1b - Service Request, POST Body, Spotify Album

<!-- 
Play Content by uri: Album
Must have signed up for a PREMIUM account at Spotify.com 
-->
<ContentItem source="SPOTIFY" type="uri" location="spotify:album:6vc9OTcyd3hyzabCmsdnwE" sourceAccount="yourspotifysourceaccount" isPresetable="true">
  <itemName>Welcome to the New</itemName>
  <containerArt>https://i.scdn.co/image/ab67616d0000b27316c019c87a927829804caf0b</containerArt>
</ContentItem>

Figure 1c - Service Request, POST Body, Spotify Track

<!-- 
Play Content by uri: Track
Must have signed up for a PREMIUM account at Spotify.com 
-->
<ContentItem source="SPOTIFY" type="uri" location="spotify:track:1kWUud3vY5ij5r62zxpTRy" sourceAccount="yourspotifysourceaccount" isPresetable="true">
  <itemName>Flawless</itemName>
  <containerArt>https://i.scdn.co/image/ab67616d0000b2734e3dd900c3352f0ad34fbdd7</containerArt>
</ContentItem>

Figure 1d - Service Request, POST Body, Spotify Playlist

<!-- 
Play Content by uri: Playlist
Must have signed up for a PREMIUM account at Spotify.com 
-->
<ContentItem source="SPOTIFY" type="uri" location="spotify:playlist:5v5ETK9WFXAnGQ3MRubKuE" sourceAccount="yourspotifysourceaccount" isPresetable="true">
  <itemName>Worship Playlist</itemName>
  <containerArt>https://i.scdn.co/image/ab67706c0000da84820d2514932c9e2ea40f6473</containerArt>
</ContentItem>

Figure 1e - Service Request, POST Body, Spotify Episode

<!-- 
Play Content by uri: Episode
Must have signed up for a PREMIUM account at Spotify.com 
-->
<ContentItem source="SPOTIFY" type="uri" location="spotify:episode:3tWDribcG7X5Q6KBx8xupp" sourceAccount="yourspotifysourceaccount" isPresetable="true">
  <itemName>We Can Do Hard Things</itemName>
  <containerArt>https://i.scdn.co/image/ab6765630000ba8a31936fcc7887c8a10ba9af9d</containerArt>
</ContentItem>

Figure 1f - Service Request, POST Body, Spotify Podcast / AudioBook

<!-- 
Play Content by uri: Podcast / AudioBook
Must have signed up for a PREMIUM account at Spotify.com 
-->
<ContentItem source="SPOTIFY" type="uri" location="spotify:show:39EidgdUzHLZ1Wab01NiGk" sourceAccount="yourspotifysourceaccount" isPresetable="true">
  <itemName>K-Love On The Mic</itemName>
  <containerArt>https://i.scdn.co/image/206f1a5d5e27e9516a5c0cdb06ee3ae079a78ac9</containerArt>
</ContentItem>

Figure 2a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Figure 2b - Service Websocket Update Event

<updates deviceID="9070658C9D4A">
  <nowPlayingUpdated>
    <nowPlaying deviceID="9070658C9D4A" source="SPOTIFY" sourceAccount="yourspotifysourceaccount">
      <ContentItem source="SPOTIFY" type="tracklisturl" location="/playback/container/c3BvdGlmeTpwbGF5bGlzdDo1djVFVEs5V0ZYQW5HUTNNUnViS3VF" sourceAccount="yourspotifysourceaccount" isPresetable="true">
        <itemName>Worship Playlist</itemName>
        <containerArt>https://i.scdn.co/image/ab67706c0000da84820d2514932c9e2ea40f6473</containerArt>
      </ContentItem>
      <track>Chain Breaker</track>
      <artist>Zach Williams</artist>
      <album>Chain Breaker (Deluxe Edition)</album>
      <stationName />
      <art artImageStatus="IMAGE_PRESENT">https://i.scdn.co/image/ab67616d0000b273ec3db5825471d1c0f8bc3619</art>
      <time total="196">60</time>
      <skipEnabled />
      <favoriteEnabled />
      <playStatus>PLAY_STATE</playStatus>
      <shuffleSetting>SHUFFLE_OFF</shuffleSetting>
      <repeatSetting>REPEAT_OFF</repeatSetting>
      <skipPreviousEnabled />
      <seekSupported value="true" />
      <streamType>TRACK_ONDEMAND</streamType>
      <trackID>spotify:track:17GmwQ9Q3MTAz05OokmNNB</trackID>
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

Select (STORED_MUSIC)

The /select service selects new media content to play on the device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.131:8090/select

Figure 1a - Service Request, POST Body

<!-- 
Music Library on NAS
Windows Media Player Music Streaming must be enabled on the sourceAccount computer 
-->
<ContentItem source="STORED_MUSIC" location="6_cf99cb10_2cad80d9" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
  <itemName>Grown-Up Christmas List - Michael Bublé - Other</itemName>
</ContentItem>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <nowPlayingUpdated>
    <nowPlaying deviceID="1004567890AA" source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0">
      <ContentItem source="STORED_MUSIC" location="6_cf99cb10_2cad80d9" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" isPresetable="true">
        <itemName>Other</itemName>
      </ContentItem>
      <track>Grown-Up Christmas List</track>
      <artist>Michael Bublé</artist>
      <album>Other</album>
      <offset>0</offset>
      <art artImageStatus="IMAGE_PRESENT">http://192.168.1.14:10243/WMPNSSv4/2050238549/0_Nl9jZjk5Y2IxMF8yY2FkODBkOS03ODY1.jpg?albumArt=true</art>
      <time total="221">61</time>
      <playStatus>PLAY_STATE</playStatus>
      <shuffleSetting>SHUFFLE_OFF</shuffleSetting>
      <repeatSetting>REPEAT_OFF</repeatSetting>
      <skipPreviousEnabled />
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

Select (TUNEIN)

The /select service selects new media content to play on the device.

The POST method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated NowPlaying status information.

Figure 1 - Service Request

http://192.168.1.131:8090/select

Figure 1a - Service Request, POST Body

<ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309606" sourceAccount="" isPresetable="true">
  <itemName>K-LOVE 2000s</itemName>
  <containerArt>http://cdn-profiles.tunein.com/s309606/images/logog.png?t=637986893640000000</containerArt>
</ContentItem>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/select</status>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <nowPlayingUpdated>
    <nowPlaying deviceID="1004567890AA" source="TUNEIN" sourceAccount="">
      <ContentItem source="TUNEIN" type="stationurl" location="/v1/playback/station/s309606" sourceAccount="" isPresetable="true">
        <itemName>K-LOVE 2000s</itemName>
        <containerArt>http://cdn-profiles.tunein.com/s309606/images/logog.png?t=637986893640000000</containerArt>
      </ContentItem>
      <track>K-LOVE 2000s</track>
      <artist>Third Day - Call My Name (Revelation)</artist>
      <album />
      <stationName>K-LOVE 2000s</stationName>
      <art artImageStatus="IMAGE_PRESENT">http://cdn-albums.tunein.com/gn/QBV6BPZVK6g.jpg</art>
      <favoriteEnabled />
      <playStatus>PLAY_STATE</playStatus>
      <streamType>RADIO_STREAMING</streamType>
      <isFavorite />
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

Select Last SoundTouch Source

The /selectLastSoundTouchSource service selects the last SoundTouch source that was selected.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/selectLastSoundTouchSource

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/selectLastSoundTouchSource</status>

Select Last Source

The /selectLastSource service selects the last source that was selected.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/selectLastSource

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/selectLastSource</status>

Select Local Source

The /selectLocalSource service selects the LOCAL source; for some SoundTouch devices, this is the only way that the LOCAL source can be selected.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/selectLocalSource

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/selectLocalSource</status>

Service Availability

The /serviceAvailability service returns information about which source services are currently available on the device.

Figure 1 - Service Request

http://192.168.1.131:8090/serviceAvailability

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8"?>
<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="QPLAY" isAvailable="false" />
    <service type="RADIOPLAYER" isAvailable="true" />
    <service type="SIRIUSXM_EVEREST" isAvailable="true" />
    <service type="SPOTIFY" isAvailable="true" />
    <service type="STORED_MUSIC_MEDIA_RENDERER" isAvailable="false" />
    <service type="TUNEIN" isAvailable="true" />
    <service type="UPNP" isAvailable="false" />
  </services>
</serviceAvailability>

Software Update Check

The /swUpdateCheck service gets the latest available software update release version information for the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/swUpdateCheck

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<swUpdateCheckResponse deviceID="1004567890AA" indexFileUrl="https://worldwide.bose.com/updates/soundtouch">
  <release revision="27.0.6.46330.5043500" />
</swUpdateCheckResponse>

Software Update Query

The /swUpdateQuery service gets the status of a SoundTouch software update for the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/swUpdateQuery

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<swUpdateQueryResponse deviceID="1004567890AA">
  <state>IDLE</state>
  <percentComplete>0</percentComplete>
  <canAbort>false</canAbort>
</swUpdateQueryResponse>

Sources List

The /sources service returns information about what sources the device supports (e.g. AIRPLAY, AUX, LOCAL_MUSIC, STORED_MUSIC, BLUETOOTH, SPOTIFY, ALEXA, QPLAY, TUNEIN, etc).

The output of this service will vary based upon the SoundTouch device type. For example, the ST-300 SoundBar supports more sources than the ST-10 Wireless Speaker.

Figure 1 - Service Request

http://192.168.1.131:8090/sources

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<sources deviceID="1004567890AA">
  <sourceItem source="AIRPLAY" sourceAccount="AirPlay2DefaultUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="false">AirPlay2DefaultUserName</sourceItem>
  <sourceItem source="ALEXA" status="READY" isLocal="false" multiroomallowed="true" />
  <sourceItem source="AUX" sourceAccount="AUX" status="READY" isLocal="true" multiroomallowed="true">AUX IN</sourceItem>
  <sourceItem source="BLUETOOTH" status="UNAVAILABLE" isLocal="true" multiroomallowed="true" />
  <sourceItem source="LOCAL_INTERNET_RADIO" status="READY" isLocal="false" multiroomallowed="true" />
  <sourceItem source="LOCAL_MUSIC" sourceAccount="3f205110-4a57-4e91-810a-123456789012" status="READY" isLocal="false" multiroomallowed="true">My Local Music</sourceItem>
  <sourceItem source="NOTIFICATION" status="UNAVAILABLE" isLocal="false" multiroomallowed="true" />
  <sourceItem source="QPLAY" sourceAccount="QPlay1UserName" status="UNAVAILABLE" isLocal="true" multiroomallowed="true">QPlay1UserName</sourceItem>
  <sourceItem source="QPLAY" sourceAccount="QPlay2UserName" status="UNAVAILABLE" isLocal="true" multiroomallowed="true">QPlay2UserName</sourceItem>
  <sourceItem source="SPOTIFY" sourceAccount="SpotifyAlexaUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">SpotifyAlexaUserName</sourceItem>
  <sourceItem source="SPOTIFY" sourceAccount="SpotifyConnectUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">SpotifyConnectUserName</sourceItem>
  <sourceItem source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-123456789012/0" status="READY" isLocal="false" multiroomallowed="true">My Media Library</sourceItem>
  <sourceItem source="STORED_MUSIC_MEDIA_RENDERER" sourceAccount="StoredMusicUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">StoredMusicUserName</sourceItem>
  <sourceItem source="TUNEIN" status="READY" isLocal="false" multiroomallowed="true" />
  <sourceItem source="UPNP" sourceAccount="UPnPUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">UPnPUserName</sourceItem>
</sources>

Figure 1b - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<sources deviceID="E8EB11B9B723">
  <sourceItem source="PANDORA" sourceAccount="thlucas@yahoo.com" status="READY" isLocal="false" multiroomallowed="true">thlucas@yahoo.com</sourceItem>
  <sourceItem source="LOCAL_MUSIC" sourceAccount="3f205110-4a57-4e91-810a-ad949d25abb2" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">THLUCASI9 Music</sourceItem>
  <sourceItem source="QPLAY" sourceAccount="QPlay1UserName" status="UNAVAILABLE" isLocal="true" multiroomallowed="true">QPlay1UserName</sourceItem>
  <sourceItem source="QPLAY" sourceAccount="QPlay2UserName" status="UNAVAILABLE" isLocal="true" multiroomallowed="true">QPlay2UserName</sourceItem>
  <sourceItem source="STORED_MUSIC_MEDIA_RENDERER" sourceAccount="StoredMusicUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">StoredMusicUserName</sourceItem>
  <sourceItem source="BLUETOOTH" status="UNAVAILABLE" isLocal="true" multiroomallowed="true" />
  <sourceItem source="PRODUCT" sourceAccount="HDMI_1" status="UNAVAILABLE" isLocal="true" multiroomallowed="true">HDMI_1</sourceItem>
  <sourceItem source="UPNP" sourceAccount="UPnPUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">UPnPUserName</sourceItem>
  <sourceItem source="PRODUCT" sourceAccount="TV" status="READY" isLocal="true" multiroomallowed="true">TV</sourceItem>
  <sourceItem source="NOTIFICATION" status="UNAVAILABLE" isLocal="false" multiroomallowed="true" />
  <sourceItem source="SPOTIFY" sourceAccount="SpotifyConnectUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">SpotifyConnectUserName</sourceItem>
  <sourceItem source="SPOTIFY" sourceAccount="SpotifyAlexaUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="true">SpotifyAlexaUserName</sourceItem>
  <sourceItem source="AIRPLAY" sourceAccount="AirPlay2DefaultUserName" status="UNAVAILABLE" isLocal="false" multiroomallowed="false">AirPlay2DefaultUserName</sourceItem>
  <sourceItem source="ALEXA" status="READY" isLocal="false" multiroomallowed="true" />
  <sourceItem source="LOCAL_INTERNET_RADIO" status="READY" isLocal="false" multiroomallowed="true" />
  <sourceItem source="TUNEIN" status="READY" isLocal="false" multiroomallowed="true" />
  <sourceItem source="SPOTIFY" sourceAccount="31l77y2al5lnn7mxfrmd4bpfhqke" status="READY" isLocal="false" multiroomallowed="true">thlucas2010@gmail.com</sourceItem>
  <sourceItem source="STORED_MUSIC" sourceAccount="d09708a1-5953-44bc-a413-7d516e04b819/0" status="READY" isLocal="false" multiroomallowed="true">NAS Library THLUCASI9</sourceItem>
</sources>

Standby

The /standby service places the device into standby (e.g. power-saving) mode.

The GET method of this service request will generate a nowPlayingUpdated websocket event, which contains the updated source status information.

Figure 1 - Service Request

http://192.168.1.131:8090/standby

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/standby</status>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <nowPlayingUpdated>
    <nowPlaying deviceID="1004567890AA" source="STANDBY">
      <ContentItem source="STANDBY" isPresetable="false" />
    </nowPlaying>
  </nowPlayingUpdated>
</updates>

SupportedURLs

The /supportedURLs service returns information about what webservices API URL's the device supports. You can query this list to see if a device supports a certain feature or capability. For example, the ST-300 supports the /audioproducttonecontrols URL, but the ST-10 does not.

Figure 1 - Service Request

http://192.168.1.131:8090/supportedURLs

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<supportedURLs deviceID="1004567890AA">
  <URL location="/addGroup" />
  <URL location="/addStation" />
  <URL location="/addWirelessProfile" />
  <URL location="/addZoneSlave" />
  <URL location="/balance" />
  <URL location="/bass" />
  <URL location="/bassCapabilities" />
  <URL location="/bluetoothInfo" />
  <URL location="/bookmark" />
  <URL location="/cancelPairLightswitch" />
  <URL location="/capabilities" />
  <URL location="/clearBluetoothPaired" />
  <URL location="/clearPairedList" />
  <URL location="/clockDisplay" />
  <URL location="/clockTime" />
  <URL location="/criticalError" />
  <URL location="/DSPMonoStereo" />
  <URL location="/enterBluetoothPairing" />
  <URL location="/enterPairingMode" />
  <URL location="/factoryDefault" />
  <URL location="/genreStations" />
  <URL location="/getActiveWirelessProfile" />
  <URL location="/getBCOReset" />
  <URL location="/getGroup" />
  <URL location="/getZone" />
  <URL location="/info" />
  <URL location="/introspect" />
  <URL location="/key" />
  <URL location="/language" />
  <URL location="/listMediaServers" />
  <URL location="/lowPowerStandby" />
  <URL location="/marge" />
  <URL location="/marge" />
  <URL location="/masterMsg" />
  <URL location="/name" />
  <URL location="/nameSource" />
  <URL location="/navigate" />
  <URL location="/netStats" />
  <URL location="/networkInfo" />
  <URL location="/notification" />
  <URL location="/now_playing" />
  <URL location="/nowPlaying" />
  <URL location="/nowSelection" />
  <URL location="/pairLightswitch" />
  <URL location="/pdo" />
  <URL location="/performWirelessSiteSurvey" />
  <URL location="/playbackRequest" />
  <URL location="/playNotification" />
  <URL location="/powerManagement" />
  <URL location="/powersaving" />
  <URL location="/presets" />
  <URL location="/pushCustomerSupportInfoToMarge" />
  <URL location="/rebroadcastlatencymode" />
  <URL location="/recents" />
  <URL location="/removeGroup" />
  <URL location="/removeMusicServiceAccount" />
  <URL location="/removePreset" />
  <URL location="/removeStation" />
  <URL location="/removeZoneSlave" />
  <URL location="/requestToken" />
  <URL location="/search" />
  <URL location="/searchStation" />
  <URL location="/select" />
  <URL location="/selectLastSoundTouchSource" />
  <URL location="/selectLastSource" />
  <URL location="/selectLastWiFiSource" />
  <URL location="/selectLocalSource" />
  <URL location="/selectPreset" />
  <URL location="/serviceAvailability" />
  <URL location="/setBCOReset" />
  <URL location="/setComponentSoftwareVersion" />
  <URL location="/setMargeAccount" />
  <URL location="/setMusicServiceAccount" />
  <URL location="/setMusicServiceOAuthAccount" />
  <URL location="/setPairedStatus" />
  <URL location="/setPairingStatus" />
  <URL location="/setProductSerialNumber" />
  <URL location="/setProductSoftwareVersion" />
  <URL location="/setup" />
  <URL location="/setWiFiRadio" />
  <URL location="/setZone" />
  <URL location="/slaveMsg" />
  <URL location="/soundTouchConfigurationStatus" />
  <URL location="/sourceDiscoveryStatus" />
  <URL location="/sources" />
  <URL location="/speaker" />
  <URL location="/standby" />
  <URL location="/stationInfo" />
  <URL location="/storePreset" />
  <URL location="/supportedURLs" />
  <URL location="/swUpdateAbort" />
  <URL location="/swUpdateCheck" />
  <URL location="/swUpdateQuery" />
  <URL location="/swUpdateStart" />
  <URL location="/systemtimeout" />
  <URL location="/test" />
  <URL location="/trackInfo" />
  <URL location="/updateGroup" />
  <URL location="/userActivity" />
  <URL location="/userPlayControl" />
  <URL location="/userRating" />
  <URL location="/userTrackControl" />
  <URL location="/volume" />
</supportedURLs>

Figure 1b - Service Response, ST-300 SoundBar with Subwoofer

... same list as Figure 1a above, but with the following additions:
  <URL location="/audiodspcontrols" />
  <URL location="/audioproductlevelcontrols" />
  <URL location="/audioproducttonecontrols" />
  <URL location="/audiospeakerattributeandsetting" />
  <URL location="/productcechdmicontrol" />
  <URL location="/producthdmiassignmentcontrols" />

System Timeout

The /systemtimeout service gets the current system timeout configuration of the device.

Figure 1 - Service Request

http://192.168.1.131:8090/systemtimeout

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<systemtimeout>
  <powersaving_enabled>true</powersaving_enabled>
</systemtimeout>

Token Request

The /requestToken service returns a new bearer token generated by the device.

Figure 1 - Service Request

http://192.168.1.131:8090/requestToken

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<bearertoken value="Bearer vUApzBVT6Lh0nw1xVu/plr1UDRNdMYMEpe0cStm4wCH5mWSjrrtORnGGirMn3pspkJ8mNR1MFh/J4OcsbEikMplcDGJVeuZOnDPAskQALvDBCF0PW74qXRms2k1AfLJ/" />

User Play Control

The /userPlayControl service sends a user play control type command to stop / pause / play / resume media content playback.

The Rating value to send must be one of the following supported values:

  • PAUSE_CONTROL - Pause currently playing content.
  • PLAY_CONTROL - Play content that is currently paused or stopped.
  • PLAY_PAUSE_CONTROL - Pause currently playing content, or Play currently paused content.
  • STOP_CONTROL - Stop currently playing content.

No exception is raised if the device is currently in standby mode.

Figure 1 - Service Request

http://192.168.1.131:8090/userPlayControl

Figure 1a - Service Request, POST Body

<PlayControl>PLAY_CONTROL</PlayControl>

Figure 1b - Service Response, ST-10 Speaker

<?xml version='1.0' encoding='utf-8'?>
<status>/userPlayControl</status>

User Ratings

The /userRating service rates the currently playing media, if ratings are supported.

The Rating value to send must be one of the following supported values:

  • UP - Assigns a thumbs up rating.
  • DOWN - Assigns a thumbs down rating.

PANDORA is currently the only source that supports ratings. Ratings are stored in the artist profile under "My Collection" settings. If a ThumbsDown rating is assigned, then the current track play will stop and advance to the next track.

Figure 1 - Service Request

http://192.168.1.131:8090/userRating

Figure 1a - Service Request, POST Body

<Rating>UP</Rating>

Figure 1b - Service Response, ST-10 Speaker

<?xml version='1.0' encoding='utf-8'?>
<status>/userRating</status>

Volume

The /volume service returns or updates the current volume level on the device. Volume is an integer in the range of 0 (muted) to 100 (max volume).

The POST method of this service request will generate a volumeUpdated websocket event, which contains the updated volume information.

Figure 1 - Service Request

http://192.168.1.131:8090/volume

Figure 1a - Service Request, POST Body

<volume>15</volume>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<volume deviceID="1004567890AA">
  <targetvolume>15</targetvolume>
  <actualvolume>15</actualvolume>
  <muteenabled>false</muteenabled>
</volume>

Figure 1c - Service Websocket Update Event

<updates deviceID="1004567890AA">
  <volumeUpdated>
    <volume>
      <targetvolume>15</targetvolume>
      <actualvolume>15</actualvolume>
      <muteenabled>false</muteenabled>
    </volume>
  </volumeUpdated>
</updates>

Wireless - Get Active Profile

The /getActiveWirelessProfile service gets the current wireless profile configuration of the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/getActiveWirelessProfile

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<GetActiveWirelessProfileResponse>
  <ssid>my_wireless_ssid</ssid>
</GetActiveWirelessProfileResponse>

Wireless - Select Last Source

The /selectLastWiFiSource service selects the last wifi source that was selected.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/selectLastWiFiSource

Figure 1a - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/selectLastWiFiSource</status>

Wireless - Site Survey

The /performWirelessSiteSurvey service gets a list of wireless networks that can be detected by the device.

Note that some SoundTouch devices do not support this functionality. You should first query the /supportedUrls service to determine if the device supports the service.

Figure 1 - Service Request

http://192.168.1.131:8090/performWirelessSiteSurvey

Figure 1a - Service Response, ST-300 SoundBar

<?xml version="1.0" encoding="UTF-8" ?>
<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>
    <item ssid="NETGEAR07" signalStrength="-83" secure="true">
      <securityTypes>
        <type>wpa_or_wpa2</type>
      </securityTypes>
    </item>
</PerformWirelessSiteSurveyResponse>

Zone Add Member

The /addZoneSlave service adds new members to an existing multi-room zone for the device. A multi-room zone must exist prior to issuing this service call (use the /setZone service to create a new zone if necessary).

The POST method of this service request will generate a zoneUpdated websocket event, which contains the updated zone information. The event will also be sent to each MEMBER device (both new and existing members) of the zone.

Figure 1 - Service Request

http://192.168.1.131:8090/addZoneSlave

Figure 1a - Service Request, POST Body
Ensure that the zone master attribute value contains the MASTER zone device id.

<zone master="1004567890AA">
  <member ipaddress="192.168.1.132">F9BC35A6D825</member>
  <member ipaddress="192.168.1.133">B8BD47C7F452</member>
</zone>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/addZoneSlave</status>

Figure 1c - Service Websocket Update Events
Update received by the MASTER device that created the zone. The response will contain ALL members that are currently part of the zone.

<updates deviceID="1004567890AA">
  <zoneUpdated>
    <zone master="1004567890AA">
      <member ipaddress="192.168.1.131">1004567890AA</member>
      <member ipaddress="192.168.1.130">3004567890BB</member>
      <member ipaddress="192.168.1.132">F9BC35A6D825</member>
      <member ipaddress="192.168.1.133">B8BD47C7F452</member>
    </zone>
  </zoneUpdated>
</updates>

Update received by each MEMBER device that is a part of the new zone. The response will contain ALL members that are currently part of the zone.

<updates deviceID="3004567890BB">
  <zoneUpdated>
    <zone master="1004567890AA" senderIPAddress="192.168.1.131" senderIsMaster="true">
      <member ipaddress="192.168.1.131">1004567890AA</member>
      <member ipaddress="192.168.1.130">3004567890BB</member>
      <member ipaddress="192.168.1.132">F9BC35A6D825</member>
      <member ipaddress="192.168.1.133">B8BD47C7F452</member>
    </zone>
  </zoneUpdated>
</updates>

Zone Create

The /setZone service creates a new multi-room zone for the device. The device that issues the command is the MASTER device by default.

The POST method of this service request will generate a zoneUpdated websocket event, which contains the updated zone information. The event will also be sent to each MEMBER device of the zone.

Figure 1 - Service Request

http://192.168.1.131:8090/setZone

Figure 1a - Service Request, POST Body
When creating a zone, ensure that the zone master attribute value and the first member node value are the same.

<zone master="1004567890AA">
  <member ipaddress="192.168.1.131">1004567890AA</member>
  <member ipaddress="192.168.1.130">3004567890BB</member>
</zone>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/setZone</status>

Figure 1c - Service Websocket Update Events
Update received by the MASTER device that created the new zone.

<updates deviceID="1004567890AA">
  <zoneUpdated>
    <zone master="1004567890AA">
      <member ipaddress="192.168.1.131">1004567890AA</member>
      <member ipaddress="192.168.1.130">3004567890BB</member>
    </zone>
  </zoneUpdated>
</updates>

Update received by each MEMBER device that is a part of the new zone.

<updates deviceID="3004567890BB">
  <zoneUpdated>
    <zone master="1004567890AA" senderIPAddress="192.168.1.131" senderIsMaster="true">
      <member ipaddress="192.168.1.130">3004567890BB</member>
    </zone>
  </zoneUpdated>
</updates>

Zone Remove Member

The /removeZoneSlave service adds new members to an existing multi-room zone for the device. A multi-room zone must exist prior to issuing this service call (use the setZone service to create a new zone if necessary).

The POST method of this service request will generate a zoneUpdated websocket event, which contains the updated zone information. The event will also be sent to each MEMBER device (both new and existing members) of the zone.

Figure 1 - Service Request

http://192.168.1.131:8090/removeZoneSlave

Figure 1a - Service Request, POST Body
Ensure that the zone master attribute value contains the MASTER zone device id.

<zone master="1004567890AA">
  <member ipaddress="192.168.1.130">3004567890BB</member>
</zone>

Figure 1b - Service Response, ST-10 Speaker

<?xml version="1.0" encoding="UTF-8" ?>
<status>/removeZoneSlave</status>

Figure 1c - Service Websocket Update Events
Update received by the MASTER device that created the zone. The response will contain ALL members that are currently part of the zone.

<updates deviceID="1004567890AA">
  <zoneUpdated>
    <zone master="1004567890AA">
      <member ipaddress="192.168.1.131">1004567890AA</member>
      <member ipaddress="192.168.1.132">F9BC35A6D825</member>
      <member ipaddress="192.168.1.133">B8BD47C7F452</member>
    </zone>
  </zoneUpdated>
</updates>

Update received by each MEMBER device that is a part of the new zone. The response will contain ALL members that are currently part of the zone.

<updates deviceID="3004567890BB">
  <zoneUpdated>
    <zone master="1004567890AA" senderIPAddress="192.168.1.131" senderIsMaster="true">
      <member ipaddress="192.168.1.131">1004567890AA</member>
      <member ipaddress="192.168.1.132">F9BC35A6D825</member>
      <member ipaddress="192.168.1.133">B8BD47C7F452</member>
    </zone>
  </zoneUpdated>
</updates>

Zone Status

The /getZone service returns information about multi-room zone setup for the device.

Figure 1 - Service Request

http://192.168.1.131:8090/getZone

Figure 1a - Service Response, ST-10 Speaker
Response returned if the device is not part of a zone.

<?xml version="1.0" encoding="UTF-8" ?>
<zone />

Figure 1b - Service Response, ST-10 Speaker
Response returned if the device is a MASTER of a zone. In this case, the MASTER is the ST-10 device and the (one and only) group member is the ST-300.

<?xml version="1.0" encoding="UTF-8" ?>
<zone master="1004567890AA">
  <member ipaddress="192.168.1.131">1004567890AA</member>
  <member ipaddress="192.168.1.130">3004567890BB</member>
</zone>

Figure 1c - Service Response, ST-10 Speaker
Response returned if the device is a MEMBER of a zone. In this case, the MASTER is the ST-10 device and the (one and only) group member is the ST-300.

<?xml version="1.0" encoding="UTF-8" ?>
<zone master="1004567890AA" senderIPAddress="192.168.1.131" senderIsMaster="true">
  <member ipaddress="192.168.1.130">3004567890BB</member>
</zone>
Clone this wiki locally