Quality API: CSAT responses missing interaction_id in POST /api/v2/quality/evaluations

Hey folks,

Running into a pretty frustrating data gap with the Genesys Cloud Quality API. We’re trying to build a custom dashboard that links CSAT survey results directly to specific interaction metadata (like agent ID, duration, and queue). The idea is simple: pull the evaluation, get the CSAT score, and join it to the conversation record.

I’m hitting POST /api/v2/quality/evaluations with a basic request body to fetch evaluations for a specific user over the last week. The call succeeds with a 200 OK, but the returned JSON payload for evaluations that include a CSAT response is missing the interaction.id field. It’s just null. Without that ID, I can’t map the score back to the actual call or chat session.

Here’s the payload I’m sending:

{
 "dateRange": {
 "startDateTime": "2023-10-01T00:00:00.000Z",
 "endDateTime": "2023-10-31T23:59:59.999Z"
 },
 "filter": {
 "userId": "abc-123-def-456"
 },
 "pageSize": 100
}

The response comes back with the evaluation ID, the score, and the surveyId, but interaction is always {} or null for CSAT-only evaluations. I’ve tried adding include parameters and checking the evaluationType filter, but nothing changes. It seems like the API treats CSAT responses as standalone entities rather than tied interactions in the evaluation response.

Is there a different endpoint I should be using to get the interaction ID? Or is there a way to fetch the interaction details from the surveyId directly? We’ve been trying to stitch this together via separate API calls to /conversations but the latency is killing us. Any pointers on how to reliably get that link would be great.

The documentation for POST /api/v2/quality/evaluations is clear on this point. It’s a search endpoint. It returns a summary of evaluations. It does not return full interaction objects. The interactionId field is often null or generic in the summary response because the Quality service aggregates data for performance. You can’t join on it directly from this call.

You need to do a two-step fetch. First, get the evaluation IDs. Then, fetch the details for each one. Or better yet, use the analytics API if you need historical joins. But for real-time or recent data, here is the pattern that works for our WFM dashboards.

// 1. Get evaluations
const evals = await platformClient.quality.evaluationsApi.postQualityEvaluations({
 body: {
 query: `userId:12345 AND dateRange:now-7d..now`
 }
});

// 2. Iterate and fetch details to get the real interactionId
const details = [];
for (const evalItem of evals.entities) {
 const detail = await platformClient.quality.evaluationsApi.getQualityEvaluation(evalItem.id);
 if (detail.interaction) {
 details.push({
 evalId: evalItem.id,
 interactionId: detail.interaction.id, // This is the key you need
 score: detail.scores[0].value
 });
 }
}

The interaction object in the detail response contains the id and type. Use that ID to query /api/v2/analytics/conversations/summary or /api/v2/conversations/ depending on the type. Don’t try to cram everything into one API call. The Quality API is not designed for that. It’s slow if you loop too fast. Add a delay between requests if you have many evaluations. We hit rate limits every week when agents have high volume. Check your error logs for 429s.