WebRTC softphone transfer failing on SDK v1.2.4 launcher event

Is it possible to trigger a softphone call transfer from the web messaging sdk v1.2.4? The launcher fires a custom event but architect drops it with a 403 when sending the event.

CET deployment runs fine locally. pre-chat passes a valid token, yet the media session handshake fails with webrtc:signaling:timeout after 12s. it doesn’t even hit routing.

{ "action": "transfer_call", "target": "queue:supervisors" }

console just spits out the error and the mic stays hot.

Have you tried bypassing the launcher’s custom event entirely and using the SDK’s native transfer API? The 403 when sending events suggests the token scope is too limited for direct API calls from the client side. The SDK handles its own auth context, so forcing a custom event through architect often breaks the handshake.

Try this instead in your handler:

const { activeCall } = useCalls();
activeCall.transfer('queue:supervisors');

The webrtc:signaling:timeout happens because the media session is trying to renegotiate while the event is being processed asynchronously. By using the built-in method, the signaling stays in the same thread. Also check if your org has “Allow softphone transfers” enabled in the security settings, sometimes that blocks client-side actions even with valid tokens. If it still times out, check the network tab for any blocked WebSocket frames.

1 Like

don’t trust that launcher event for transfers. it’s usually a scope mismatch on the client token. the web messaging sdk doesn’t have the rights to push flohevents directly from the browser.

use the backend proxy instead. your bot should initiate a voice consult transfer with a valid Bearer token. keep the client side dumb.

check your oauth scopes. conversation:write is mandatory. missing it throws the 403 you’re seeing.

yeah, backend proxy is the way to go. browser tokens rarely have conversation:write. i handle this in a node lambda triggered by the web event. it calls the transfer endpoint with a service account token. keeps the handshake clean.

stop trying to push transfer logic through the web launcher. it’s not built for that. use the backend proxy.

requests.post(f"/api/v2/conversations/calls/{conv_id}/participants/{participant_id}/consult/queue", headers={"Authorization": f"Bearer {token}"}, json={"to": {"id": "queue:supervisors"}})

client tokens don’t have conversation:write. you’re getting 403 because the browser isn’t allowed to write flohevents directly. keep the client dumb.

2 Likes