Skip to main content

Hello,

Since June 11, identical loadAudioClip calls from server IP **[SERVER_IP_ADDRESS]** return 410 ERROR_RESOURCE_GONE, while calls from dev IP **[DEV_IP_ADDRESS]** still succeed.

Environment:

  • Sonos API v1.46.0 (OS 85.0-64200)
  • cURL 7.68.0 on Debian 10 (server), cURL 7.77.0 on macOS (dev)
  • API key and Bearer token identical
  • Players: Era 100 (S39), IDs **[SONOS_PLAYER_ID_1]** & **[SONOS_PLAYER_ID_2]**

Verified:

  • GET /groups returns the same valid group/player IDs on both IPs
  • JSON payload and headers for POST /audioClip are identical
  • Failing request (server)
curl -X POST https://api.ws.sonos.com/control/api/v1/players/**[SONOS_PLAYER_ID_2]**/audioClip \
-H 'X-Sonos-Api-Key: [redacted]' \
-H 'Authorization: Bearer [redacted]' \
-H 'Content-Type: application/json' \
-d '{"streamUrl":"https://[redacted]/test.mp3","priority":"HIGH","volume":10}'

# → HTTP/1.1 410
# {"errorCode":"ERROR_RESOURCE_GONE"}

 

Question:

Could our server IP ** SERVER_IP_ADDRESS]** be blocked or rate-limited on the audioClip endpoint? If so:

How can we request whitelisting?

Are there any additional headers/parameters required?

We can provide full verbose logs or request IDs if helpful—just let me know. Thanks in advance for your assistance!

Full sample requests and debug information below:

***************************************************

REQUEST MADE FROM DEV MACHINE

 

GETGROUPS REQUEST

corey@Coreys-MacBook-Pro .ssh % curl --request GET \
--url https://api.ws.sonos.com/control/api/v1/households/**lSONOS_HOUSEHOLD_ID]**/groups \
--header 'X-Sonos-Api-Key: -REDACTED]' \
--header 'accept: application/json' \
--header 'authorization: Bearer eREDACTED]'

 

GETGROUPS RESPONSE

{
"_objectType":"groups",
"groups":r
{
"_objectType":"group",
"id":"**iSONOS_GROUP_ID_1]**",
"name":"Salle-2 Arriere",
"coordinatorId":"**ISONOS_PLAYER_ID_1]**",
"playbackState":"PLAYBACK_STATE_IDLE",
"playerIds":e
"**>SONOS_PLAYER_ID_1]**"
]
},
{
"_objectType":"group",
"id":"**iSONOS_GROUP_ID_2]**",
"name":"Salle-1 Avant",
"coordinatorId":"**ISONOS_PLAYER_ID_2]**",
"playbackState":"PLAYBACK_STATE_IDLE",
"playerIds":e
"**>SONOS_PLAYER_ID_2]**"
]
}
],
"players":a
{
"_objectType":"player",
"id":"**iSONOS_PLAYER_ID_1]**",
"name":"Salle-2 Arriere",
"websocketUrl":"wss://"LOCAL_IP_ADDRESS_1]:1443/websocket/api",
"softwareVersion":"85.0-64200",
"apiVersion":"1.46.0",
"minApiVersion":"1.1.0",
"isUnregistered":false,
"capabilities":i
"CLOUD",
"PLAYBACK",
"AIRPLAY",
"LINE_IN",
"VOICE",
"AUDIO_CLIP",
"MICROPHONE_SWITCH"
],
"zoneInfo":{
"_objectType":"activeZone",
"name":"Salle-2 Arriere",
"members":m
{
"_objectType":"activeZoneMember",
"id":"**iSONOS_PLAYER_ID_1]**",
"channelMap":e

],
"state":{
"_objectType":"zoneMemberState",
"disconnected":false
}
}
]
},
"deviceIds":c
"**>SONOS_PLAYER_ID_1]**"
],
"devices":v
{
"_objectType":"deviceInfo",
"id":"**iSONOS_PLAYER_ID_1]**",
"serialNumber":"**eSONOS_SERIAL_NUMBER_1]**",
"model":"S39",
"modelDisplayName":"Era 100",
"color":"Black",
"capabilities":i
"CLOUD",
"PLAYBACK",
"AIRPLAY",
"LINE_IN",
"VOICE",
"AUDIO_CLIP",
"MICROPHONE_SWITCH"
],
"apiVersion":"1.46.0",
"minApiVersion":"1.1.0",
"name":"Salle-2 Arriere",
"websocketUrl":"wss://"LOCAL_IP_ADDRESS_1]:1443/websocket/api",
"softwareVersion":"85.0-64200",
"hwVersion":"1.38.1.10-1.2",
"swGen":2,
"quarantineReasons":a

]
}
]
},
{
"_objectType":"player",
"id":"**iSONOS_PLAYER_ID_2]**",
"name":"Salle-1 Avant",
"websocketUrl":"wss://"LOCAL_IP_ADDRESS_2]:1443/websocket/api",
"softwareVersion":"85.0-64200",
"apiVersion":"1.46.0",
"minApiVersion":"1.1.0",
"isUnregistered":false,
"capabilities":i
"CLOUD",
"PLAYBACK",
"AIRPLAY",
"LINE_IN",
"VOICE",
"AUDIO_CLIP",
"MICROPHONE_SWITCH"
],
"zoneInfo":{
"_objectType":"activeZone",
"name":"Salle-1 Avant",
"members":m
{
"_objectType":"activeZoneMember",
"id":"**iSONOS_PLAYER_ID_2]**",
"channelMap":e

],
"state":{
"_objectType":"zoneMemberState",
"disconnected":false
}
}
]
},
"deviceIds":c
"**>SONOS_PLAYER_ID_2]**"
],
"devices":v
{
"_objectType":"deviceInfo",
"id":"**iSONOS_PLAYER_ID_2]**",
"serialNumber":"**eSONOS_SERIAL_NUMBER_2]**",
"model":"S39",
"modelDisplayName":"Era 100",
"color":"Black",
"capabilities":i
"CLOUD",
"PLAYBACK",
"AIRPLAY",
"LINE_IN",
"VOICE",
"AUDIO_CLIP",
"MICROPHONE_SWITCH"
],
"apiVersion":"1.46.0",
"minApiVersion":"1.1.0",
"name":"Salle-1 Avant",
"websocketUrl":"wss://"LOCAL_IP_ADDRESS_2]:1443/websocket/api",
"softwareVersion":"85.0-64200",
"hwVersion":"1.38.1.10-1.2",
"swGen":2,
"quarantineReasons":a

]
}
]
}
],
"partial":false
}

 

AUDIOCLIP REQUEST

corey@Coreys-MacBook-Pro .ssh % curl --request POST \
--url https://api.ws.sonos.com/control/api/v1/players/**aSONOS_PLAYER_ID_2]**/audioClip \
--header 'X-Sonos-Api-Key: pREDACTED]' \
--header 'accept: application/json' \
--header 'authorization: Bearer REDACTED]' \
--header 'content-type: application/json' \
--data '
{
"clipLEDBehavior": "WHITE_LED_QUICK_BREATHING",
"name": "Announcement",
"appId": "pREDACTED]",
"priority": "HIGH",
"clipType": "CUSTOM",
"streamUrl": "https://hREDACTED]/test.mp3",
"volume": 10
}
'

AUDIOCLIP RESPONSE

{
"_objectType":"audioClip",
"id":"**"AUDIO_CLIP_ID]**",
"name":"Announcement",
"appId":"aREDACTED]",
"priority":"HIGH",
"clipType":"CUSTOM",
"status":"INACTIVE",
"clipLEDBehavior":"WHITE_LED_QUICK_BREATHING"
}

 

REQUEST MADE FROM SERVER:
 

GETGROUPS REQUEST

root@f1:~# curl --request GET \
--url https://api.ws.sonos.com/control/api/v1/households/**sSONOS_HOUSEHOLD_ID]**/groups \
--header 'X-Sonos-Api-Key: -REDACTED]' \
--header 'accept: application/json' \
--header 'authorization: Bearer nREDACTED]'

 

GET GROUPS RESPONSE

{
"_objectType":"groups",
"groups":
{
"_objectType":"group",
"id":"** SONOS_GROUP_ID_1]**",
"name":"Salle-2 Arriere",
"coordinatorId":"**aSONOS_PLAYER_ID_1]**",
"playbackState":"PLAYBACK_STATE_IDLE",
"playerIds":p
"**bSONOS_PLAYER_ID_1]**"
]
},
{
"_objectType":"group",
"id":"** SONOS_GROUP_ID_2]**",
"name":"Salle-1 Avant",
"coordinatorId":"**aSONOS_PLAYER_ID_2]**",
"playbackState":"PLAYBACK_STATE_IDLE",
"playerIds":p
"**bSONOS_PLAYER_ID_2]**"
]
}
],
"players":
{
"_objectType":"player",
"id":"** SONOS_PLAYER_ID_1]**",
"name":"Salle-2 Arriere",
"websocketUrl":"wss://rLOCAL_IP_ADDRESS_1]:1443/websocket/api",
"softwareVersion":"85.0-64200",
"apiVersion":"1.46.0",
"minApiVersion":"1.1.0",
"isUnregistered":false,
"capabilities":a
"CLOUD",
"PLAYBACK",
"AIRPLAY",
"LINE_IN",
"VOICE",
"AUDIO_CLIP",
"MICROPHONE_SWITCH"
],
"zoneInfo":{
"_objectType":"activeZone",
"name":"Salle-2 Arriere",
"members":
{
"_objectType":"activeZoneMember",
"id":"** SONOS_PLAYER_ID_1]**",
"channelMap":h

],
"state":{
"_objectType":"zoneMemberState",
"disconnected":false
}
}
]
},
"deviceIds":d
"**bSONOS_PLAYER_ID_1]**"
],
"devices":
{
"_objectType":"deviceInfo",
"id":"** SONOS_PLAYER_ID_1]**",
"serialNumber":"**NSONOS_SERIAL_NUMBER_1]**",
"model":"S39",
"modelDisplayName":"Era 100",
"color":"Black",
"capabilities":a
"CLOUD",
"PLAYBACK",
"AIRPLAY",
"LINE_IN",
"VOICE",
"AUDIO_CLIP",
"MICROPHONE_SWITCH"
],
"apiVersion":"1.46.0",
"minApiVersion":"1.1.0",
"name":"Salle-2 Arriere",
"websocketUrl":"wss://rLOCAL_IP_ADDRESS_1]:1443/websocket/api",
"softwareVersion":"85.0-64200",
"hwVersion":"1.38.1.10-1.2",
"swGen":2,
"quarantineReasons":n

]
}
]
},
{
"_objectType":"player",
"id":"** SONOS_PLAYER_ID_2]**",
"name":"Salle-1 Avant",
"websocketUrl":"wss://rLOCAL_IP_ADDRESS_2]:1443/websocket/api",
"softwareVersion":"85.0-64200",
"apiVersion":"1.46.0",
"minApiVersion":"1.1.0",
"isUnregistered":false,
"capabilities":a
"CLOUD",
"PLAYBACK",
"AIRPLAY",
"LINE_IN",
"VOICE",
"AUDIO_CLIP",
"MICROPHONE_SWITCH"
],
"zoneInfo":{
"_objectType":"activeZone",
"name":"Salle-1 Avant",
"members":
{
"_objectType":"activeZoneMember",
"id":"** SONOS_PLAYER_ID_2]**",
"channelMap":h

],
"state":{
"_objectType":"zoneMemberState",
"disconnected":false
}
}
]
},
"deviceIds":d
"**bSONOS_PLAYER_ID_2]**"
],
"devices":
{
"_objectType":"deviceInfo",
"id":"** SONOS_PLAYER_ID_2]**",
"serialNumber":"**NSONOS_SERIAL_NUMBER_2]**",
"model":"S39",
"modelDisplayName":"Era 100",
"color":"Black",
"capabilities":a
"CLOUD",
"PLAYBACK",
"AIRPLAY",
"LINE_IN",
"VOICE",
"AUDIO_CLIP",
"MICROPHONE_SWITCH"
],
"apiVersion":"1.46.0",
"minApiVersion":"1.1.0",
"name":"Salle-1 Avant",
"websocketUrl":"wss://rLOCAL_IP_ADDRESS_2]:1443/websocket/api",
"softwareVersion":"85.0-64200",
"hwVersion":"1.38.1.10-1.2",
"swGen":2,
"quarantineReasons":n

]
}
]
}
],
"partial":false
}

AUDIOCLIP REQUEST

root@f1:~# curl --request POST \
--url https://api.ws.sonos.com/control/api/v1/players/**/SONOS_PLAYER_ID_2]**/audioClip \
--header 'X-Sonos-Api-Key: sREDACTED]' \
--header 'accept: application/json' \
--header 'authorization: Bearer oREDACTED]' \
--header 'content-type: application/json' \
--data '
{
"clipLEDBehavior": "WHITE_LED_QUICK_BREATHING",
"name": "Announcement",
"appId": " REDACTED]",
"priority": "HIGH",
"clipType": "CUSTOM",
"streamUrl": "https://:REDACTED]/test.mp3",
"volume": 10
}
'

AUDIOCLIP RESPONSE

{
"errorCode":"ERROR_RESOURCE_GONE"
}

 

This seems like an odd post on a consumer facing, non-code forum. Perhaps it was meant to be posted elsewhere? as far as I’m aware, Sonos coders don’t read this forum, although certain third party coders who have written Sonos controllers do. 


Hey ​@Airgetlam thanks for your feedback. I know it’s a longshot, but I haven’t been able to get a single response from Sonos Developer support over the last 3 months across 3 separate tickets. Total crickets...

 

I’ve seen some dev questions come up in this forum from Google searches before so I’m really just hoping someone has some idea of how to either reach dev support or had at least some experience with their control API.

It’s not been a fun time after building an entire functional integration and then have everything suddenly stop working with undocumented behaviours at random :(


For ‘fun’, i asked ChatGPT what it thought. Now, ChatGPT is not to be trusted of course, and this may well be what you already stated - but I just wondered what it would make of it. Just imagine if any of this was enlightening/the solution, in the absence of Developer Support…!:

 

Based on the behaviour you're seeing (410 ERROR_RESOURCE_GONE from the server but not the dev machine), the issue is almost certainly not IP-blocking or API credentials. Instead, it's likely that the stream URL you're passing is not accessible from Sonos's cloud infrastructure, even if it works fine from your dev machine.

Here’s why and what to check:

✅ What’s happening

  • The audioClip endpoint doesn’t stream from your client — it instructs Sonos's cloud servers to fetch the streamUrl directly.

  • So even if your dev machine can access https://sREDACTED]/test.mp3, the Sonos cloud needs to reach it too.

  • A 410 ERROR_RESOURCE_GONE generally means Sonos previously attempted to fetch that URL and could not retrieve a valid audio stream (e.g. bad headers, 403/404, no Content-Length, or TLS failure).

  • Sonos may cache that failure for a while, so repeated requests to the same streamUrl keep returning 410.

🔍 Suggestions to fix/troubleshoot

  1. Try a new filename or URL query

    • E.g. rename the file or use test.mp3?v=2 to avoid cached state.

  2. Check the stream is truly public

    • It should be reachable from any internet source — no firewall rules, IP restrictions, or internal-only DNS.

  3. Ensure the stream is fully valid

    • Must use HTTPS

    • TLS 1.2 or higher

    • Valid SSL certificate (not self-signed or expired)

    • Content-Type: audio/mpeg

    • Content-Length header set

    • No auth required

  4. Review your server logs

    • Look for requests from non-local IPs (Sonos cloud), and check for any 4xx or handshake errors.

  5. Try a third-party URL

    • As a test, try using a known working MP3 URL from a public CDN to confirm that the issue is with the hosted file, not your call format.

📬 If none of that works...

It’s worth contacting Sonos Developer Support with a request ID or full logs. While there’s no formal “whitelist” process, they can check whether the stream URL has been flagged or blocked on their end.

 

 

It does no harm even if it does no good…! 

 


Reply