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 trying to fetch the survey details for a specific conversation using GET /api/v2/quality/conversations/{conversationId}/surveys, but the response comes back with an empty list. 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/conversations/12345678-1234-1234-1234-123456789abc/surveys
  • Response body: []
  • Checked the survey form definition via GET /api/v2/quality/forms/surveys/{formId} and it shows the correct structure and is published.

If I query the surveys endpoint for other conversations, I see surveys for those interactions, just not the ones tied to this specific conversation ID. Is the survey only associated with the conversation if it was explicitly created via the API? 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/conversations/YOUR_CONVERSATION_ID/evaluations/YOUR_EVALUATION_ID" \
 -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.

1 Like