POST /api/v2/conversations/calls/{id}/participants/{participantId}/disconnect returning 404 on active participant

Getting a 404 when trying to drop a specific agent from a conference call via the API. The conversation is active, the participant ID looks correct, but the endpoint claims it doesn’t exist.

We’re using this to trigger cleanup spans in our OpenTelemetry pipeline. The flow is:

  1. Get conversation details via /api/v2/conversations/calls/{id}.
  2. Extract the participant ID for the agent we want to remove.
  3. Call the disconnect endpoint.

Here’s the participant object from the GET response:

{
 "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
 "name": "Agent Smith",
 "state": "connected",
 "direction": "inbound"
}

And the POST request:

POST /api/v2/conversations/calls/conv-123/participants/a1b2c3d4-e5f6-7890-abcd-ef1234567890/disconnect
Authorization: Bearer <token>

Response:

{
 "code": "notFound",
 "message": "Participant a1b2c3d4-e5f6-7890-abcd-ef1234567890 not found in conversation conv-123",
 "status": 404
}

I’ve verified the token has conversation:write scope. The participant is definitely in the call. I see this issue sometimes when the state changes rapidly between the GET and POST. Is there a race condition here? Or do I need to use a different endpoint for conference bridges specifically?

Our OTel context injection fails if the disconnect call throws, so we need a reliable way to handle this.