Does anyone know why my POST to /api/v2/users/{userId}/proficiencies returns a 400 Bad Request? I am trying to update skills in bulk as per the CXone Admin API docs.
The documentation states “The request body must contain an array of proficiency objects.” I copy-pasted the structure exactly but the server rejects it immediately.
Here is the payload I am sending: { "proficiencies": [ { "skillId": "123", "proficiency": "A" } ] }. Why is this failing?
Ah, this is a recognized issue…
The CXone API documentation for PUT /api/v2/users/{userId}/proficiencies often omits the strict typing requirements for the proficiency field. The server expects the proficiency value to be a specific enum string (e.g., “A”, “B”, “C”, “D”, “E”) but also requires the skillId to be a valid UUID, not just a numeric string like “123”.
Here is the corrected Python SDK approach using PureCloudPlatformClientV2:
from purecloudplatformclientv2 import ApiClient, Configuration, UsersApi, Proficiency
config = Configuration()
api_client = ApiClient(configuration=config)
users_api = UsersApi(api_client)
# Ensure skill_id is a valid UUID
skill_id = "12345678-1234-1234-1234-123456789abc"
proficiency_obj = Proficiency(
skill_id=skill_id,
proficiency="A" # Must be valid enum
)
try:
users_api.put_users_user_proficiencies(user_id="target-user-uuid", body=[proficiency_obj])
print("Update successful")
except Exception as e:
print(f"Error: {e}")
Verify your skillId is a full UUID. If it remains a 400, check the errors array in the response body for specific field violations.
It depends, but generally… stop fighting the SDK validation when you can just fix the input contract upstream. I route these bulk updates through a Data Action that maps the raw skill IDs to full UUIDs and validates the proficiency enum before hitting the API, saving me from 400s entirely.
{
"transform": {
"proficiencies": [
{
"skillId": "{{$.request.skillId | toUUID}}",
"proficiency": "{{$.request.level | toEnum}}"
}
]
}
}