PUT /api/v2/conversations/voice/{conversationId}/participants/{participantId} returning 409 Conflict on attribute update

Running into a weird issue with the Genesys Cloud Conversations API. I need to push a custom attribute onto a specific participant mid-call for downstream analytics. The documentation says I should use a PATCH or PUT request to update the participant object, but I keep hitting a 409 Conflict error.

Here’s the setup. I’m using Python requests to make the call. I have a valid OAuth token with the conversation:participant:write scope. The conversation is active, and I’ve verified the conversation ID and participant ID are correct by logging them right before the request.

endpoint = f"https://myorg.mygen.com/api/v2/conversations/voice/{conv_id}/participants/{part_id}"
headers = {
 "Authorization": f"Bearer {access_token}",
 "Content-Type": "application/json"
}
payload = {
 "attributes": {
 "internal_priority": "high"
 }
}
response = requests.put(endpoint, headers=headers, json=payload)
print(response.status_code)
print(response.text)

The response body looks like this:

{
 "errors": [
 {
 "code": "CONFLICT",
 "message": "The resource you are trying to update has been modified by another cess."
 }
 ]
}

I’ve tried switching to PATCH, same result. I’ve also tried including the lastModified timestamp from the initial GET request in the header, but that doesn’t seem to help either. The docs mention optimistic locking, but there’s no clear example on how to handle the ETag or versioning for participant attributes specifically.

Is there a specific header I’m missing? Or maybe the payload structure is wrong? I’ve tried wrapping the attributes in a participant object too, no luck. It feels like the API expects a full participant object replacement, but that seems risky mid-call.

Any ideas on how to bypass this conflict? I’m just trying to set a flag.