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.