PUT /conversations/voice/{id}/participants/{id} returns 409 Conflict when updating custom attributes

I’m trying to push a custom attribute onto a live voice conversation participant. The goal is to tag the interaction with a specific adherence flag so our WFM reports can pick it up later. We are in the US/Central timezone and dealing with high volume.

The API call looks correct based on the docs. Here is the payload I’m sending:

{
 "customAttributes": {
 "wfm_adherence_tag": "compliant"
 }
}

The request headers include the proper Authorization: Bearer token and Content-Type: application/json.

The response I get back is a 409 Conflict. The body of the error says:

{
 "message": "The resource is currently being modified by another process and cannot be updated.",
 "errors": []
}

This happens about 30% of the time. If I wait 5 seconds and retry, it works. But we can’t just sleep the thread in our Python script because we’re processing hundreds of these events per minute. It feels like a race condition with the system trying to update the participant state itself (maybe during wrap-up or state transitions).

Is there an If-Match header I need to include? I’ve tried leaving it out and I’ve tried setting it to *. Both result in the 409.

headers = {
 'Authorization': f'Bearer {access_token}',
 'Content-Type': 'application/json'
}
# tried this too:
# headers['If-Match'] = '*'

response = requests.put(url, headers=headers, json=payload)
print(response.status_code)

We’ve got a backlog of failed updates piling up. I don’t want to implement a full exponential backoff retry loop if there’s a cleaner way to handle this conflict. Maybe I’m missing a specific header or the format of the custom attribute is wrong?