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 on /api/v2/flohevents.

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 on /api/v2/flohevents 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.

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 call /api/v2/conversations/voice/{id}/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/voice/{conv_id}/transfer", 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.