The PATCH request to /api/v2/conversations/voice/{conversationId}/participants/{participantId} keeps throwing a 409 Conflict. We’re trying to push real-time routing metadata from an external CRM into the conversation object so the supervisor dashboard can track skill overrides mid-interaction. The admin interface handles attribute binding without issue. The API refuses the write while the leg state sits at connected.
Payload looks like this:
{
"attributes": {
"crm_case_id": "8842190",
"priority_override": "high",
"queue_target": "billing-escalation"
}
}
We’ve run through the standard checks. Direct PATCH returns {"code":"conflict","message":"Conversation state does not allow modification."}. Switched to the JavaScript Platform SDK client.conversations.patchConversationParticipant() with the exact same JSON structure. Got the identical 409 back. Tried bubbling the attributes up to the conversation level at /api/v2/conversations/voice/{conversationId} instead. The gateway replied with a 400 Bad Request, complaining that participant scope is mandatory for attribute mapping. We also attempted a GET request to verify the current attribute state before patching, but the response payload omits the custom keys entirely. OAuth token definitely has conversation:write and routing:write scopes attached. Validation passes clean.
Documentation claims participant attributes remain mutable during active sessions. The conflict error keeps blocking the write anyway. Dashboard refresh cycles run every thirty seconds. We need those values synced before the supervisor view polls the next batch. The timestamp on the response header looks slightly delayed. Might be a caching layer on the edge node. Logs show the request hits the router but drops before the state machine processes it. Checking the raw headers now.