Quality API GET /evaluations returns survey data but interactionId is null

Stuck on mapping CSAT results back to the original call.

We are pulling evaluation data via GET /api/v2/quality/evaluations. The goal is to match the survey response to the specific interactionId so we can update our internal CRM records.

The API returns a list of evaluations. The survey object is present in the payload. It contains the score and comments. However, the interactionId field inside the survey object is always null or missing entirely. The parent evaluation object has an id, but that is the evaluation ID, not the conversation ID.

Tried adding the survey filter in the query parameters. Also tried expanding the response with ?expand=survey. The structure looks like this:

{
 "evaluations": [
 {
 "id": "eval-123",
 "survey": {
 "score": 5,
 "comments": "Good service",
 "interactionId": null 
 }
 }
 ]
}

Checked the documentation for GET /api/v2/quality/evaluations/{evaluationId}. Same result. The survey object does not seem to link back to the interaction.

Is there a different endpoint to get the link between evaluation and interaction? Or is there a specific query parameter I am missing to populate that field?

The script needs this ID to proceed with the REST Proxy call to our CRM. Without it, we are just sending scores with no context.

That null interactionId is a classic pain point with the Quality API. It’s not a bug, just a quirk of how Genesys structures the evaluation object versus the conversation object. The evaluation record itself doesn’t always carry the direct link if it was generated asynchronously from a survey callback.

You don’t actually need the interactionId inside the evaluation payload to get what you want. Instead, grab the conversationId from the evaluation response. That’s the key. Once you have that, you hit the Conversation History API.

Here’s the flow that usually works:

  1. Get the evaluations.
  2. Extract evaluation.conversationId.
  3. Call GET /api/v2/conversations/interactions/{conversationId}.

The interaction object returned from that second call will have the interactionId you’re looking for, along with all the participant details and media info.

// Pseudo-code using the JS SDK
const evaluations = await platformClient.qualityApi.getQualityEvaluations({
 query: 'surveyResponse=true'
});

for (const evalItem of evaluations.entities) {
 if (evalItem.survey) {
 const convId = evalItem.conversationId;
 // Fetch the actual interaction to get the ID and metadata
 const interaction = await platformClient.conversationsApi.getConversationInteraction(convId);
 
 console.log(`Survey Score: ${evalItem.survey.score}`);
 console.log(`Interaction ID: ${interaction.id}`); // This is what you need
 console.log(`Start Time: ${interaction.startTime}`);
 }
}

Just be careful with rate limits if you’re pulling a lot of evaluations. Batch those interaction requests if you can. Also, check the mediaType on the evaluation. If it’s a webchat or email, the structure might be slightly different, but the conversationId is still the bridge. Don’t try to parse the URL in the survey comment field. That’s a rabbit hole you don’t want.