Conversational API: Disconnecting specific participant from conference fails with 404

Ran into a weird issue today with the Conversations API when attempting to programmatically eject a specific participant from an active conference call. I am utilizing the DELETE /api/v2/conversations/conferences/{conversationId}/participants/{participantId} endpoint within a CXone Studio script via GetRESTProxy. The objective is to isolate a problematic agent while maintaining the conference for the remaining participants. I have verified that the conversationId and participantId are correctly populated from the session data, and the OAuth token possesses the requisite conversations:write scope. Despite this, the API consistently returns an HTTP 404 Not Found response, suggesting the resource path is invalid, even though the conference is visibly active in the UI. I have attempted to include the divisionId header as per some undocumented suggestions, but the outcome remains unchanged. The JSON payload returned is simply {"code": "notFound", "message": "No participant with id 'abc-123' found in conversation 'xyz-789'."}. I suspect there might be a nuance regarding how participant IDs are scoped within the conference context versus the broader conversation entity. Is there a specific prerequisite state or header required to successfully disconnect a participant from a conference via the REST API, or is this a known limitation of the endpoint?

# Use PUT instead of DELETE to set status to 'terminated'
# DELETE often fails on active legs due to resource locking
await platformClient.conversations.updateParticipant(
 conversationId, participantId, {"status": "terminated"}
)

If I remember correctly, the 404 stems from trying to delete a participant resource that is still actively routing media. Switching to a status update via PUT to terminate the leg usually bypasses the lock and achieves the ejection without breaking the conference bridge.

If I remember correctly…
Cause: analytics endpoints are cached so they lag during k6 spikes. try the websockets api instead for real-time data…
Solution: use genesyscloud.dataaction in Terraform to …

This looks like a scope mismatch in your GetRESTProxy request. The conference participant endpoint requires conversations:write, not just conversations:read. Also, ensure the participantId is the internal UUID, not the external ID. Try this payload structure to bypass the wrapper’s signature validation issues:

const res = GetRESTProxy("DELETE", `/api/v2/conversations/conferences/${convId}/participants/${partId}`, {}, { scopes: ["conversations:write"] });