KPI cards (partner)
Overview
Returns period-over-period KPI cards (review counts, average ratings, response rate, average response time, awaiting-response backlog, sentiment split) for the partner's review-response report.
Prerequisites
- A bearer token. Callable with Partner tokens.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/partner/report/review-response/kpi
Authentication
-
Requires a bearer token in the
Authorization: Bearer <bearer-token>header. -
Who can call it: Partner tokens.
-
Mounted under the
partner/reportgroup. -
The handler hard-gates on
company.bundle_id == 1(partner only). -
Store set resolves by precedence:
store_id→ single store; elseaccount_id(abundle_id=3 account); else all of the partner-user's stores. -
account_id/store_id/client_*are all validated by an ownership check, so the partner can only reach its own tree.
Rate limit
- No rate limit.
Request body
- Body:
| Field | Type | Required | Description |
|---|---|---|---|
range_start | string | yes | Y-m-d H:i:s |
range_end | string | yes | Y-m-d H:i:s |
store_id | integer | no | must belong to auth company; filters to one store |
account_id | integer | no | an account (company.bundle_id=3) under this partner |
client_location_id | string | no | external location id; resolved to a store_id |
client_account_id | string | no | external account id; resolved to an account_id |
{
"range_start": "2024-01-01 00:00:00",
"range_end": "2024-12-31 23:59:59",
"account_id": 7
}Response
data.reviews_current(int) — reviews in rangedata.reviews_previous(int) — reviews in equivalent prior perioddata.avg_rating(float) /avg_rating_previous(float)data.response_rate_pct(float) /response_rate_pct_previous(float) — responded/total × 100data.avg_response_time_in_days(string) — e.g."1.5 Days"data.awaiting_response(int) — plan-aware backlog countdata.reviews_sentiments(object) —positiveReviews/neutralReviews/negativeReviewscounts (each with a matching*_percent)
200 Success — KPI swap (2026-06) · 200
200{
"data": {
"reviews_current": 580,
"reviews_previous": 530,
"avg_rating": 4.3,
"avg_rating_previous": 4.1,
"response_rate_pct": 89.66,
"response_rate_pct_previous": 84.2,
"avg_response_time_in_days": "1.5 Days",
"awaiting_response": 14,
"reviews_sentiments": {
"negativeReviews": 50,
"negativeReviews_percent": 8.62,
"positiveReviews": 450,
"positiveReviews_percent": 77.59,
"neutralReviews": 80,
"neutralReviews_percent": 13.79
}
}
}Errors
| Status | Meaning |
|---|---|
401 | The bearer token is missing, expired or invalid |
422 | The request failed validation — the response names the fields |
500 | Unexpected server error |
Example request
curl --request POST \
--url "https://production-api.shoutaboutus.com/api/v1/partner/report/review-response/kpi" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"range_start": "2024-01-01 00:00:00", "range_end": "2024-12-31 23:59:59", "account_id": 7}'Updated 9 days ago
Did this page help you?
