PATCH /api/v2/conversations/conferences/{id}/participants not dropping leg despite 200 OK?

I’m trying to cleanly eject a specific participant from an active conference using the Conversations API, but the call behavior is weird. I’m sending a PATCH to /api/v2/conversations/conferences/{conference_id}/participants/{participant_id} with a JSON body of { "participant": { "disconnected": true } }.

The API returns a 200 OK, which is what I expect. The response body confirms the participant status is updated. But the audio leg stays open. The user can still hear the other participants and vice versa. If I wait about 15 seconds, the connection drops, but it’s not immediate.

I’ve checked the SDK docs for genesyscloud_conversations and it looks like this endpoint is the standard way to handle participant control. Am I missing a header? Or is there a specific state I need to transition to before setting disconnected to true? I’ve tried adding "role": "removed" but that just throws a 400 validation error.

Here’s the curl equivalent I’m testing with:

curl -X PATCH "https://api.mypurecloud.com/api/v2/conversations/conferences/123456/participants/789012" \
 -H "Authorization: Bearer $TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
 "participant": {
 "disconnected": true
 }
 }'

The response is clean:

{
 "id": "789012",
 "status": "active",
 "disconnected": true
}

Why isn’t the media session terminating? I’ve verified the OAuth token has the conversation:write scope. It’s driving me nuts because the API says it worked, but the user experience says otherwise. I’m on EST, so I’m assuming the backend is processing in real-time. Is this a known delay with the media server?