Quality API /api/v2/quality/evaluations returns empty interactions for CSAT survey IDs

Running into a wall trying to link CSAT survey responses back to the actual interaction records via the Quality API. The goal is simple: pull the evaluation data, find the survey response ID, and grab the transcript or details for that specific call.

Here’s the issue. I’m hitting GET /api/v2/quality/evaluations with the surveyResponseId filter, but the response comes back with an empty evaluations array. The survey definitely exists in the UI, and the ID matches what I’m passing.

  • Using Python requests with a valid access token from client_credentials grant
  • Endpoint: GET /api/v2/quality/evaluations?surveyResponseId=12345678-1234-1234-1234-123456789abc
  • Response body: { "evaluations": [], "pageSize": 20, "pageCount": 0, "pageNumber": 1, "totalRecords": 0 }
  • Checked the survey response object via GET /api/v2/surveys/responses/{id} and it shows status: submitted and has a valid interactionId

If I query the evaluations endpoint without the filter, I see evaluations for other interactions, just not the ones tied to this survey. Is the surveyResponseId filter only meant for post-interaction surveys that are part of the evaluation workflow? Or is there a different endpoint I should be hitting to get the interaction details from a survey response?

The docs for the Quality API are pretty sparse on the exact relationship between survey responses and evaluations. Feeling like I’m missing a basic config step here.

Sounds like a classic sync delay or a mismatch in how the ID is being passed. The Quality API doesn’t always pick up the surveyResponseId immediately after the survey closes. It usually takes a few minutes for the evaluation record to link properly.

First, check if you can find the evaluation ID manually in the UI for that specific survey. If it’s there, try querying by evaluationId directly to confirm the data exists. If that works, the issue is likely the filter syntax or timing.

Also, make sure you’re using the correct OAuth scope: quality:evaluation:read. Sometimes partial scopes cause silent failures where the query runs but returns nothing.

Here’s a quick curl to test the raw endpoint with a known valid ID:

curl -X GET "https://api.mypurecloud.com/api/v2/quality/evaluations?surveyResponseId=YOUR_ACTUAL_SURVEY_ID&pageSize=10" \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Accept: application/json"

If that returns empty, wait 10 minutes and try again. The indexing job runs on a schedule.