Review-response feed
Overview
Returns a paginated review-response feed across the partner's whole company tree, plus an overall average rating and a per-publisher KPI tile strip. The hipages tile unifies reviews across all connected sites; all others use a simple AVG of rated rows.
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/feed
Authentication
-
Requires a bearer token in the
Authorization: Bearer <bearer-token>header. -
Who can call it: Partner tokens.
-
Mounted under the
partnerprefix (partner-admin user,bundle_id=1). -
Scope defaults to every store under the authenticated user.
-
Narrowing params (
store_id/client_location_id,account_id/client_account_id) must pass an ownership check, so the partner can only reach stores/accounts inside its own hierarchy. -
Same controller method as the account-side alias (Review-response feed (account-friendly route alias)); the partner role reaches a wider default scope.
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. If both range bounds are present and limit is omitted, the feed returns the full result set (no pagination); otherwise it paginates. |
limit | integer | optional | Page size. Default 10 (25 for hipages users, who are also hard-capped at 25). |
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 and must belong to the auth company tree. Narrows scope to one store. |
client_location_id | string (max 255) | optional | Alternative to store_id; resolved to a store. Tree-scoped. |
account_id | integer | optional | Must be an existing account with bundle_id=3 (an account), not soft-deleted; tree-scoped. Narrows to that account's stores. |
client_account_id | string (max 255) | optional | Alternative to account_id;. Tree-scoped. |
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 | A scalar is normalized to an array in prepareForValidation. Each element must be an integer. |
status | string | optional | Response state: 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",
"account_id": 7,
"review_site_id": 44,
"rating": [
4,
5
],
"status": "complete",
"search": "Amanda 883555",
"limit": 10,
"page": 1,
"sort_by": "desc"
}Response
data[]— oneResponseFeeditem per review:id(int) — review id.source_platform(string) — originating platform (the review site'snameas-is), falling back to the normalised review-site slug.review(object) —id,reviewer,rating,message,review_date(null when0000-00-00 00:00:00).reviewsite(object) —id,name(Maps.Google → Google),link,review_site_logo,review_site_color,auth_type,scraping_enabled(bool),posting_enabled(bool).store(object) —id,name(appends- {storeid}when present),slug,address(composed from company address/city/state).store_reviewsite(object) —id,url,landing_page_url,connection_status,is_connected(bool, per-site derived: Google id 44 = token present; Facebook id 3 = token+external_id; Caring id 20 = external_id; elseconnection_status==='connected').flag(array) — status-flag chips (flag,title,statusColor,icon, optionallinks);''when you setstandalone_type.plan(string) — plan name from the latestUpdatedReviewResponse, or''.review_flag(object|null) — raw flag model.is_flaggable(bool) — full flag-policy result.flag_status(string) — flag-status enum value, or'none'.flag_details(object|null) —reason,reason_identifier,flag_reason_detail,flag_date(ISO-8601), populated only when a flag row exists.response_capabilities(object) — universal result gating Submit / Request-Revision.response(object|null) —id,status,public_contents,private_contents,response_date(null when0000-00-00 00:00:00),deleted; null when absent or an unverified auto-response.- hipages-only (present only when the row is a hipages-partner review):
flagging(window_days,expires_at,reason),is_legacy,is_qualified,is_off_platform,classification_label,job_id,sub_dimensions,is_profanity,badges,has_history,moderation(suppressed_at/excluded_from_rating_at/hidden_from_public_at/released_to_public_at/deleted_at). avg_rating(float) — overall average rating across the scoped stores, rounded to 2dp (additional meta).kpi_by_publisher(array) — one tile per publisher with reviews in scope:review_site_id,review_site_name,review_site_color,rating(float|null),total_reviews(int),was_bridged(bool; true for the hipages unified tile).[]when no stores in scope (additional meta).- Pagination meta (
current_page,last_page,per_page,total, links) present when the result is 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": "2026-03-10T08:00:00Z"
},
"reviewsite": {
"id": 44,
"name": "Google",
"review_site_color": "#4285F4"
},
"store": {
"id": 8748,
"name": "Downtown - LOC-001"
},
"response": {
"id": 300,
"status": "complete",
"public_contents": "Thank you!",
"private_contents": null,
"response_date": "2026-03-11T10:00:00Z"
},
"flag": [
{
"flag": "complete",
"title": "Posted live",
"statusColor": "success",
"icon": "fa-thumbs-up"
}
],
"plan": "Premium",
"is_flaggable": true,
"flag_status": "none",
"flag_details": null,
"response_capabilities": {
"manual": true,
"ai": true,
"reason": null
}
},
{
"id": 1620,
"source_platform": "hipages",
"review": {
"id": 1620,
"reviewer": "Alice K",
"rating": 4,
"message": "Quick response, fair pricing.",
"review_date": "2026-05-12T10:00:00+10:00"
},
"reviewsite": {
"id": 100,
"name": "hipages",
"review_site_color": "#FF6B00"
},
"store": {
"id": 26,
"name": "Demo store #1 - DEMO-001"
},
"response": {
"id": 5501,
"status": "pending",
"public_contents": null,
"private_contents": "Homeowner mentioned a minor scheduling concern - hipages service team only.",
"response_date": "2026-05-12 10:30:00"
},
"flag": [],
"plan": "Review Management",
"is_flaggable": true,
"flag_status": "none",
"flag_details": null,
"response_capabilities": {
"manual": true,
"ai": true,
"reason": null
},
"flagging": {
"window_days": 90,
"expires_at": "2026-08-10T10:00:00+10:00",
"reason": null
},
"is_legacy": false,
"is_qualified": true,
"is_off_platform": false,
"classification_label": null,
"is_profanity": false,
"badges": [],
"has_history": true,
"moderation": {
"suppressed_at": null,
"excluded_from_rating_at": null,
"hidden_from_public_at": null,
"released_to_public_at": null,
"deleted_at": null
}
}
],
"avg_rating": 4.2,
"kpi_by_publisher": [
{
"review_site_id": 100,
"review_site_name": "hipages",
"review_site_color": "#FF6B00",
"rating": 4.3,
"total_reviews": 332,
"was_bridged": true
},
{
"review_site_id": 44,
"review_site_name": "Google",
"review_site_color": "#4285F4",
"rating": 4.5,
"total_reviews": 87,
"was_bridged": false
},
{
"review_site_id": 3,
"review_site_name": "Facebook",
"review_site_color": "#1877F2",
"rating": 4.7,
"total_reviews": 24,
"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": 443
}
}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/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", "account_id": 7, "review_site_id": 44, "rating": [4, 5], "status": "complete", "search": "Amanda 883555", "limit": 10, "page": 1, "sort_by": "desc"}'Updated 8 days ago
