Review-response feed (account-friendly route alias)
Overview
Account-friendly alias of the review-response feed (Review-response feed) — same controller method, mounted under reports/response. This lets an account user reading their own reviews and a partner-admin reading across accounts both work. Returns the paginated feed, overall avg_rating, and the per-publisher KPI strip.
Prerequisites
- A bearer token. Callable with Partner and Account tokens.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/reports/response/feed
Authentication
-
Requires a bearer token in the
Authorization: Bearer <bearer-token>header. -
Who can call it: Partner and Account tokens.
-
Mounted at the top-level
reports/responsegroup (no partner/account prefix, role-agnostic). -
The reachable scope follows the caller's own auth company tree. With no narrowing params the feed defaults to every store under the authenticated user. An account-tradie sees only their stores; a partner-admin sees their whole tree.
-
store_id/client_location_idandaccount_id/client_account_idmust sit inside your own account tree, which resolvesclient_*identifiers differently for account (bundle_id=3) vs partner (bundle_id=1) callers. -
So the reachable set differs per role even though the params are identical.
Rate limit
- No rate limit.
Request body
- Body:
| Field | Type | Required | Description |
|---|---|---|---|
range_start | string Y-m-d H:i:s | optional | Start of the review-date window; pair with range_end. |
range_end | string Y-m-d H:i:s | optional | End of window. Both bounds present and limit omitted ⇒ full (unpaginated) result; otherwise paginated. |
limit | integer | optional | Page size. Default 10 (hard cap 25 for hipages users). |
page | integer | optional | Page number. |
sort_field | string | optional | Sort column. |
sort_by | string | optional | One of asc,ASC,desc,DESC. |
type | string | optional | One of report,download. |
store_id | integer | optional | Must be an existing location; tree-scoped via an ownership check. Narrows to one store. |
client_location_id | string (max 255) | optional | Alternative to store_id;. Tree-scoped. |
account_id | integer | optional | Must be an existing account with bundle_id=3, not soft-deleted; tree-scoped. Narrows to that account's stores. |
client_account_id | string (max 255) | optional | Alternative to account_id;. Tree-scoped; account vs partner resolution differs (see Auth). |
is_pdf | integer | optional | 0 or 1; switches review-site logos to local asset paths. |
review_site_id | integer | optional | Filter feed to one publisher. |
rating | integer or array of integers | optional | Scalar normalized to array in prepareForValidation. |
status | string | optional | One of complete,pending,escalate pending,escalated,error,flagged,removed. |
search | string (max 255) | optional | Keyword search over reviewer/customer name, review body, review title, hipages job id, or store/location name. |
{
"range_start": "2024-01-01 00:00:00",
"range_end": "2024-12-31 23:59:59",
"store_id": 123,
"rating": [
4,
5
],
"status": "complete",
"search": "Amanda",
"limit": 10,
"page": 1,
"sort_by": "desc"
}Response
data[]— per review:id,source_platform,review(id/reviewer/rating/message/review_date),reviewsite(id/name/link/review_site_logo/review_site_color/auth_type/scraping_enabled/posting_enabled),store(id/name/slug/address),store_reviewsite(id/url/landing_page_url/connection_status/is_connected),flag(chip array),plan,review_flag,is_flaggable,flag_status,flag_details,response_capabilities,response(or null), plus the hipages-only block (flagging,is_legacy,is_qualified,is_off_platform,classification_label,job_id,sub_dimensions,is_profanity,badges,has_history,moderation) when the row is a hipages review.avg_rating(float) — overall average across scoped stores, 2dp.kpi_by_publisher(array) — per-publisher tiles (review_site_id,review_site_name,review_site_color,rating,total_reviews,was_bridged);[]when no stores in scope.- Pagination meta (
current_page,last_page,per_page,total) when paginated.
200 Success · 200
200{
"data": [
{
"id": 500,
"source_platform": "google",
"review": {
"id": 500,
"reviewer": "Jane Smith",
"rating": 4.5,
"message": "Great service!",
"review_date": "2024-03-10T08:00:00.000000Z"
},
"reviewsite": {
"id": 44,
"name": "Google",
"link": "https://google.com/maps",
"review_site_logo": "https://cdn.example.com/img-google.png",
"review_site_color": "#4285F4",
"auth_type": "oauth",
"scraping_enabled": true,
"posting_enabled": true
},
"store": {
"id": 15,
"name": "Downtown Location - LOC-001",
"slug": "downtown-location",
"address": "123 Main St, New York, NY"
},
"store_reviewsite": {
"id": 88,
"url": "https://maps.google.com/...",
"landing_page_url": null,
"connection_status": "connected",
"is_connected": true
},
"flag": [
{
"flag": "complete",
"title": "This response has successfully been posted on the review site.",
"statusColor": "success",
"icon": "fa-regular:thumbs-up"
}
],
"plan": "Premium",
"review_flag": null,
"is_flaggable": true,
"flag_status": "none",
"flag_details": null,
"response_capabilities": {
"manual": true,
"ai": true,
"reason": null
},
"response": {
"id": 300,
"status": "complete",
"public_contents": "Thank you for your review!",
"private_contents": null,
"response_date": "2024-03-11T10:00:00.000000Z",
"deleted": null
}
}
],
"avg_rating": 4.2,
"kpi_by_publisher": [
{
"review_site_id": 44,
"review_site_name": "Google",
"review_site_color": "#4285F4",
"rating": 4.2,
"total_reviews": 148,
"was_bridged": false
}
],
"links": {
"first": "...?page=1",
"last": "...?page=15",
"prev": null,
"next": "...?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 15,
"per_page": 10,
"to": 10,
"total": 148
}
}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/reports/response/feed" \
--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", "store_id": 123, "rating": [4, 5], "status": "complete", "search": "Amanda", "limit": 10, "page": 1, "sort_by": "desc"}'Updated 8 days ago
