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

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://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 partner prefix (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:
FieldTypeRequiredDescription
range_startstring Y-m-d H:i:soptionalStart of the review-date window; pair with range_end.
range_endstring Y-m-d H:i:soptionalEnd of window. If both range bounds are present and limit is omitted, the feed returns the full result set (no pagination); otherwise it paginates.
limitintegeroptionalPage size. Default 10 (25 for hipages users, who are also hard-capped at 25).
pageintegeroptionalPage number.
sort_fieldstringoptionalSort column.
sort_bystringoptionalOne of asc,ASC,desc,DESC.
typestringoptionalOne of report,download.
store_idintegeroptionalMust be an existing location and must belong to the auth company tree. Narrows scope to one store.
client_location_idstring (max 255)optionalAlternative to store_id; resolved to a store. Tree-scoped.
account_idintegeroptionalMust be an existing account with bundle_id=3 (an account), not soft-deleted; tree-scoped. Narrows to that account's stores.
client_account_idstring (max 255)optionalAlternative to account_id;. Tree-scoped.
is_pdfintegeroptional0 or 1; switches review-site logos to local asset paths.
review_site_idintegeroptionalFilter feed to one publisher.
ratinginteger or array of integersoptionalA scalar is normalized to an array in prepareForValidation. Each element must be an integer.
statusstringoptionalResponse state: one of complete,pending,escalate pending,escalated,error,flagged,removed.
searchstring (max 255)optionalKeyword 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[] — one ResponseFeed item per review:
  • id (int) — review id.
  • source_platform (string) — originating platform (the review site's name as-is), falling back to the normalised review-site slug.
  • review (object) — id, reviewer, rating, message, review_date (null when 0000-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; else connection_status==='connected').
  • flag (array) — status-flag chips (flag, title, statusColor, icon, optional links); '' when you set standalone_type.
  • plan (string) — plan name from the latest UpdatedReviewResponse, 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 when 0000-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

{
  "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

StatusMeaning
401The bearer token is missing, expired or invalid
422The request failed validation — the response names the fields
500Unexpected 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"}'

Did this page help you?