Quality API: Correlating CSAT survey responses to specific conversation IDs via /api/v2/analytics/quality/evaluations

Stuck on mapping CSAT survey results back to the actual conversation objects in Genesys Cloud. We’re building a custom dashboard for our QA team and need to show the CSAT score alongside the transcript for each interaction.

The issue is the Quality API doesn’t seem to expose the CSAT score directly in the evaluation list, and the Analytics API responses are pretty opaque when it comes to joining data.

Here’s what I’ve tried so far:

  1. Quality Evaluations Endpoint: Called GET /api/v2/quality/evaluations with expand=score,survey. The response returns the evaluation details, including a surveyId if one exists, but the actual CSAT score (1-5) isn’t in the payload. It just gives me the survey instance ID.

  2. Survey Responses Endpoint: Tried fetching the survey details using GET /api/v2/surveys/responses/{surveyId}. This works and returns the raw answers. However, the response doesn’t include the conversationId or interactionId that I can use to join back to the conversation transcript via the Conversations API. It’s just a bag of answers with a timestamp.

  3. Analytics API: Looked at GET /api/v2/analytics/conversations/queries. I can build a query to pull interactions with a specific surveyScore, but the response only gives me aggregated metrics or a list of interaction IDs without the actual survey text or detailed breakdown. Plus, filtering by specific survey questions seems impossible here.

Is there a documented way to get the conversationId inside the survey response payload? Or is the intended pattern to fetch all evaluations, then for each evaluation with a surveyId, fetch the survey response, and then try to match timestamps? That seems incredibly inefficient and prone to race conditions.

Here’s a sample of the survey response I’m getting (sanitized):

{
 "id": "survey-123",
 "surveyId": "my-csat-survey",
 "responses": [
 {
 "questionId": "q1",
 "value": "5",
 "type": "rating"
 }
 ],
 "timestamp": "2023-10-27T15:30:00Z"
}

No conversation ID in sight. Am I missing an expand parameter or a different endpoint entirely? We’re using the Python SDK, so if there’s a helper method I’m overlooking, that would be great too.