Analytics
Get a summary of testimonial activity for a project: approval rate, sources, sentiment, and a daily trend.
GET /testimonials/analyticsAuthentication
Send your API key as a bearer token. See Authentication .
Query parameters
| Parameter | Type | Required | Notes |
projectId | UUID | yes | The project to read. |
formBuilderId | UUID | no | Only count submissions from this form. |
since | date | no | Only count submissions on or after this date. ISO date or date time. |
Response
{
"total": 128,
"approvedCount": 94,
"pendingCount": 22,
"rejectedCount": 12,
"approvalRate": 0.73,
"sourceBreakdown": [
{ "source": "form", "count": 80 },
{ "source": "import", "count": 40 },
{ "source": "manual", "count": 8 }
],
"sentimentBreakdown": [
{ "sentiment": "positive", "count": 90 },
{ "sentiment": "neutral", "count": 20 },
{ "sentiment": "negative", "count": 8 },
{ "sentiment": "unanalyzed", "count": 10 }
],
"platformBreakdown": [
{ "platform": "Google", "count": 30 },
{ "platform": "Trustpilot", "count": 10 }
],
"trend": [
{ "date": "2026-08-27", "count": 4 },
{ "date": "2026-08-28", "count": 7 }
]
}Response fields
| Field | Type | Notes |
total | number | All submissions in scope. |
approvedCount | number | Submissions with status approved. |
pendingCount | number | Submissions with status pending. |
rejectedCount | number | Submissions with status rejected. |
approvalRate | number or null | Approved divided by the number of reviewed submissions. null when none are reviewed. |
sourceBreakdown | array | Count per source: form, manual, import, migration. |
sentimentBreakdown | array | Count per sentiment: positive, neutral, negative, plus unanalyzed. |
platformBreakdown | array | Count per import platform, for example Google or Trustpilot. |
trend | array | Count per day. Each item has an ISO date and a count. |
Example
curl "https://app.contendar.com/api/v1/testimonials/analytics?projectId=YOUR_PROJECT_ID&since=2026-08-01" \
-H "Authorization: Bearer ck_your_key_here"Related pages
Was this helpful?