I’m trying to sync agent skill proficiencies from our internal system to NICE CXone. The goal is to keep my OpenTelemetry trace context intact while updating these records in bulk.
I’m hitting the PUT /api/v2/users/{userId}/skills endpoint. When I send a single skill update, it works fine. But when I try to batch update multiple skills for the same user in a single request, I get a 409 Conflict.
Here’s the payload I’m sending:
[
{
"skillId": "skill-123",
"proficiency": "advanced"
},
{
"skillId": "skill-456",
"proficiency": "basic"
}
]
The error response looks like this:
{
"errors": [
{
"code": "CONFLICT",
"message": "The resource state has changed since the last update."
}
]
}
I’m including the If-Match header with the ETag from the previous GET request. The documentation says this endpoint supports bulk updates, but it seems like it’s treating each skill update as a separate optimistic lock check.
Should I be splitting these into separate requests? Or is there a way to bypass the conflict check for bulk operations? I need to keep the latency low for my tracing pipeline.
headers = {
"Authorization": f"Bearer {access_token}",
"If-Match": etag,
"Content-Type": "application/json"
}
response = requests.put(
f"https://{org_id}.platform.cxone.com/api/v2/users/{user_id}/skills",
headers=headers,
json=payload
)
The response code is 409. I’ve verified the ETag is correct. The user hasn’t changed any other attributes. Just the skills.
Any ideas?