Step one: the inbound queue routes contacts through a Studio flow that triggers a startMedia() action to spin up a WebRTC session for the agent softphone. The flow passes the contact_id and queue_id correctly, but the media server consistently rejects the handshake. Step two: the softphone client (v2.14.3) logs a 403 FORBIDDEN when the startMedia() block executes, and the Studio flow immediately falls through to the fallback IVR.
The payload returned from the media gateway looks like this:
{
"code": "webRTC_session_init_failure",
"message": "SDP negotiation failed: missing ice_candidate",
"request_id": "req_88f2a1c9",
"timestamp": "2024-05-18T14:22:11Z"
}
Step three: the Studio routing block expects a session_id from the media server before dropping the contact into the agent queue. When the startMedia() action fails, the flow falls back to playPrompt() which just reads a disconnected message. The softphone SDK initializes the peer connection with iceServers pointing to eu-turn-01.niceincontact.com, but the candidate gathering never completes. Firewall rules allow UDP 3478-3481, so it’s not a network block. The startMedia() config has force_reconnect set to true, but the gateway still returns the 403.
Checking the interaction_id in the Architect logs shows the media server times out waiting for the SDP answer. The codec_priority array only contains opus and g722, which should be fine for modern browsers. The REST Proxy endpoint POST /api/v2/interactions/{interactionId}/media throws a 400 when manually testing the same payload. The ICE candidates aren’t making it past the TURN server. Network traces show the STUN binding request succeeds, but the candidate exchange stalls right at the relay allocation phase. The flow hangs on the media action, drops the contact, and the queue metrics tank.
media_server_region: eu-west-1
softphone_sdk: 2.14.3
studio_flow_version: 14
error_code: 403 FORBIDDEN
ice_transport_policy: all