PATCH /conversations/voice/conversations/{id} transfer action failing with 400 in Kotlin

Trying to implement a programmatic queue transfer for voice conversations using the Kotlin SDK (genesys-cloud-kotlin). The goal is to move an active call to a different queue without dropping it, essentially mimicking the ‘Transfer to Queue’ action in Architect but via code.

I’m hitting the endpoint PATCH /api/v2/conversations/voice/conversations/{conversationId}. The documentation suggests using an actions array with a transfer type. Here’s the JSON payload I’m constructing and sending:

{
 "actions": [
 {
 "type": "transfer",
 "target": {
 "id": "8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c",
 "type": "queue"
 },
 "method": "blind"
 }
 ]
}

The queue ID is valid, and I’ve verified it via the GET /api/v2/queues endpoint. The conversation is in a connected state. When I execute the patchConversationVoiceConversation method, I get a 400 Bad Request response. The error body is pretty sparse:

{
 "message": "Invalid action parameters",
 "code": "bad_request"
}

I’ve tried changing the method to warm, but the result is identical. I also attempted to include a reason object, thinking maybe that’s required for audit trails, but that didn’t help either.

One thing I noticed is that the SDK model ConversationTransferAction has a target field that expects a ConversationTransferTarget. I’m instantiating it directly. Is there a specific scope I’m missing? I have conversations:read and conversations:write. I thought queue:transfer might be needed, but I don’t see that scope in the standard OAuth docs for this endpoint.

Also, looking at the server logs, the request seems to be reaching the API gateway, so it’s not a network issue. It feels like the payload structure is slightly off, but it matches the examples in the Swagger UI pretty closely.

Anyone else hit this wall with the Kotlin SDK? Or am I just blind to a required field in the transfer action schema?