POST /api/v2/conversations/{conversationId}/disconnect returns 409 Conflict with specific participant

Trying to drop a single participant from an active conference call via the Conversations API. The docs state: “To disconnect a specific participant, send a POST request to /api/v2/conversations/{conversationId}/disconnect with the participant ID in the body.”

I’m using the standard client credentials flow, and the token has conversations:write. The call is up, I can see the participants in the GET response. Here is the request payload:

{
 "participantIds": ["p-12345678-90ab-cdef-1234-567890abcdef"]
}

Getting a 409 Conflict back. The response body is:

{
 "message": "Cannot disconnect participant p-12345678-90ab-cdef-1234-567890abcdef: Participant is not in a disconnectable state",
 "errors": []
}

The participant is definitely in the conference. I checked the state field in the participant object from the GET endpoint. It says connected. The mediaState is connected. There is no disconnecting flag.

I’ve tried waiting 5 seconds after the participant joins. No change. I’ve tried using the participantId from the initial invite versus the one in the conversation details. Both fail with 409.

Is there a race condition with the media stream? The docs don’t mention any prerequisite state check before calling disconnect. Just that you need the ID.

Code snippet for context (Python requests):

import requests
import json

url = f"https://mycompany.mygenesiscustomer.com/api/v2/conversations/{conv_id}/disconnect"
headers = {
 "Authorization": f"Bearer {access_token}",
 "Content-Type": "application/json"
}
payload = json.dumps({"participantIds": ["p-12345678-90ab-cdef-1234-567890abcdef"]})

response = requests.post(url, headers=headers, data=payload)
print(response.status_code)
print(response.text)

Status is 409. Text matches the error above.

Checked the audit logs. Nothing shows up for this attempt. Seems like the request isn’t even hitting the disconnect logic properly. Or the state machine is stuck.

Anyone seen this? Is there a specific media state I’m missing? The docs are sparse on error conditions for this endpoint. Just says “Participant is not in a disconnectable state”. What does that even mean? connected should be disconnectable.

Also, tried omitting the array wrapper.

{ "participantId": "p-12345678-90ab-cdef-1234-567890abcdef" }

Same 409.

Running out of ideas. The token is fresh. Scopes are correct. Endpoint is correct. Body is correct. State is connected. Error says it’s not disconnectable. Circular.

Cause:
The body needs to explicitly specify which participant to disconnect, otherwise the API defaults to disconnecting the initiator.

Solution:

{
 "participantId": "the-target-participant-id"
}