Quality Management: Bulk Un-assigning Historical Evaluations for Departed Supervisors

I manage the backend for our Edge and WFM systems. We had a senior QA supervisor leave the company last week. She had over 150 ‘Pending’ evaluations assigned to her in the Quality Management module.

Our other supervisors are complaining that these pending evaluations are cluttering up the team’s shared ‘Quality’ view, but they can’t reassign them because they don’t have the permissions to take ownership of someone else’s evaluations. I tried using the DELETE /api/v2/quality/evaluations/{evaluationId} endpoint via script, but it completely destroys the evaluation record. We don’t want to delete them; we just want to remove her evaluatorUserId so they go back into the unassigned pool for someone else to claim. Is there an endpoint to strip the assignment without destroying the form?

This is a huge pain point. Deleting the evaluation destroys the metadata tied to that interaction forever, which ruins your sample rates.

You cannot use a DELETE request. You must use a PUT request to update the evaluation object. Specifically, use PUT /api/v2/quality/conversations/{conversationId}/evaluations/{evaluationId}. In the payload, you have to submit the entire evaluation object again, but set the evaluatorUserId field to null or an empty string "". That will detach the departed supervisor and return the evaluation to the generic pending queue.

Hi there! Analyst here from a 5k agent BPO.

Before you run that PUT script, make sure your OAuth client has the quality:evaluation:edit permission. Also, if the departed supervisor had already started filling out the form (e.g., it is in ‘In Progress’ state rather than ‘Pending’), stripping the User ID might cause the form to lock up. You usually want to change the status back to ‘Pending’ in that same PUT request if you want a new supervisor to start over with a clean slate.

If you don’t want to write a script, there is actually a UI workaround if you have the ‘Master Admin’ role!

Go to Admin → Quality → Evaluations. You can filter by the departed supervisor’s name. Select all the checkboxes on the left side of the grid, click the ‘Assign’ button at the top, and reassign them all in bulk to a ‘Dummy’ user or directly to the new supervisor. It saves you from having to loop through the API for 150 records.

be careful with that bulk put loop. hitting 150 sequential PUT /api/v2/quality/conversations/{conversationId}/evaluations/{evaluationId} requests will likely trip the rate limiter if you don’t space them out. the quality api isn’t as forgiving as the routing endpoints.

also, make sure you’re caching the full evaluation object before modifying it. if you fetch, modify, and update in a tight loop without storing the original response in redis, you might lose nested fields like scoreCardVersion or custom section data if the API returns a partial object on fetch.

here’s a quick python snippet using purecloud-platform-client-v2 that adds a jitter and checks for 429 status codes.

import time
import random

def update_eval_with_backoff(api_client, eval_id, new_eval_body):
 try:
 api_client.quality_api.update_conversation_evaluation(
 eval_id, new_eval_body
 )
 except Exception as e:
 if e.status == 429:
 # exponential backoff with jitter
 wait_time = (2 ** e.retry_after) + random.uniform(0, 1)
 time.sleep(wait_time)
 return update_eval_with_backoff(api_client, eval_id, new_eval_body)
 raise

don’t forget to invalidate your redis token cache if it expires mid-loop. the default ttl is 3600s but sometimes the gateway rejects slightly stale tokens.