Is there a supported way to batch update agent skill proficiencies through the CXone Admin API without hitting rate limits or getting rejected by the validator?
We’re building a Kotlin service that syncs our internal HR system with CXone. The goal is to push updated skill levels for a department of 50 agents at once. I’ve been looking at the PUT /api/v2/agents/{agentId}/skills endpoint, but that only handles one agent at a time. Looping through 50 agents sequentially is taking forever and we’re hitting timeout issues on the client side.
I tried to be clever and construct a custom JSON payload to hit the generic PATCH /api/v2/admin/users endpoint, thinking maybe I could merge the skill data into the user profile update. Here’s the payload I constructed:
{
"skills": [
{
"skillId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"proficiency": "expert"
},
{
"skillId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"proficiency": "intermediate"
}
]
}
The API responds with a 422 Unprocessable Entity and the error message says "skills" is not a valid property for user updates. Fair enough, I guess skills are handled separately from the core user object.
I also looked for a bulk endpoint like POST /api/v2/admin/skills/bulk-update or something similar in the Swagger docs, but I’m drawing a blank. The only references I find are for bulk creation of skills, not updating agent assignments or proficiencies.
Our Kotlin code uses the standard OkHttp client for these requests. I’ve implemented basic OAuth2 token handling, so auth isn’t the issue here. It’s purely about the endpoint strategy. If I have to stick to individual PUT calls, is there a recommended concurrency pattern? We’re currently using CompletableFuture to fire off requests in batches of 5, but it feels hacky and fragile.
Anyone solved this cleanly? We don’t want to break the sync process during peak hours when the API might be sluggish.