GET
/api/v1/csat
Fetch CSAT survey responses and aggregate satisfaction stats.
Authentication: API key required
Behavior
- The route returns survey rows and aggregate stats for the shop resolved from the API key.
- scope defaults to shop. When scope is brand and the authenticated shop belongs to a brand, results include surveys from every shop in that brand.
- Survey rows are ordered by createdAt descending and paginated with page and limit.
- limit defaults to 10 and is capped at 100.
- startDate defaults to 7 days ago at the start of the day; endDate defaults to now and is normalized to the end of that day.
- conversationId is serialized as a string because CRM conversation IDs are BigInt values.
Query parameters
- page (optional)
Zero-based page number. Defaults to 0.
- limit (optional)
Page size. Defaults to 10 and is capped at 100.
- scope (optional)
Either shop or brand. Defaults to shop.
- startDate (optional)
Date or ISO datetime used as the beginning of the survey createdAt filter.
- endDate (optional)
Date or ISO datetime used as the end of the survey createdAt filter.
Response
Response example
{
"success": true,
"surveys": [
{
"id": 42,
"mark": 5,
"comment": "Great support",
"graphNodes": {},
"nodeIds": [],
"messageId": 123,
"createdAt": "2026-07-28T10:00:00.000Z",
"shopDomain": "example.myshopify.com",
"conversationId": "987654321012345678",
"customer": {
"id": 123,
"email": "dev@example.com",
"name": "Ada Lovelace",
"phone": "+33612345678"
}
}
],
"total": 1,
"stats": {
"totalSurveys": 1,
"averageRating": 5,
"satisfactionRate": 100,
"ratingDistribution": {
"1": 0,
"2": 0,
"3": 0,
"4": 0,
"5": 1
}
},
"scope": "shop",
"dateRange": {
"startDate": "2026-07-01T00:00:00.000Z",
"endDate": "2026-07-28T23:59:59.999Z"
},
"pagination": {
"page": 0,
"limit": 10
}
}