PATCH /conversations/calls/{id}/participants failing with 400 when transferring to queue

Running into a weird validation error while trying to programmatically transfer an active call to a specific queue using the Conversations API. The goal is to handle the transfer logic on our backend service written in Kotlin using Ktor, rather than relying on the agent UI.

I’m hitting the endpoint PATCH /api/v2/conversations/calls/{conversationId}/participants/{participantId}. The payload looks correct based on the docs, but I keep getting a 400 Bad Request with the message Invalid participant state transition. Here’s the JSON body I’m sending:

{
 "from": {
 "id": "current-participant-id",
 "name": "System"
 },
 "to": {
 "id": null,
 "name": "Support Queue",
 "type": "queue",
 "queueId": "target-queue-id-123"
 },
 "transferType": "blind"
}

The conversationId and participantId are definitely valid. I verified the call is in connected state. I also checked the queueId and it exists and is active. The transferType is set to blind because we want a warm transfer handled later by the supervisor if needed, but even consult fails with the same error.

I noticed in the PureCloudJavaSdk source code that there’s a TransferCallRequest builder, but the underlying REST call seems identical. Is there a specific permission scope I’m missing? I have conversation:read and conversation:update. Maybe conversation:transfer?

Also, should the to object have a routingType field? I tried adding "routingType": "skills_based" but it didn’t help. The error response doesn’t give much detail on which field is causing the issue. Just “Invalid participant state transition”.

Any ideas what I’m missing here? The docs are a bit sparse on the exact JSON structure for queue transfers versus user transfers.