Generate an insight report

Overview

Start generating a report for a location over a period.

Use this when you want a fresh report.

You'll need the store_id. Optionally pick a review site, a period (year, and month for a single month) and a theme; with no year, the report covers the previous calendar month.

Returns a report id to poll with Check report status. Counts against your allowance. If a report for the same location, review site, period and theme already exists (and hasn't failed), that report is returned instead (200, deduped: true) and nothing is counted.

Prerequisites

  • A bearer token. See Authentication.
  • The location's id (store_id). The location needs at least 10 reviews in the last 48 months, and at least one linked review site that reports can use.
  • Insight reports must be on the location's plan.

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

POST /api/v1/account/insight-report

Authentication

Partner or Account token

  • store_id must be inside your own account tree. A Partner token can generate reports for any location under the partner; an Account token only for its own locations.
  • A location outside your tree is rejected with 422.

Rate limit

60 requests per minute, counted per user (the token’s user). See Rate limits.

Request parameters

None.

Request body

FieldTypeRequiredDescription
store_idintegerYesThe location to report on. Must exist and be inside your account tree.
review_site_idintegerNoOne review site to report on. Must exist and be linked to the location. Leave it out for a combined report across all the location's review sites (publisher is all).
yearintegerNoThe report year, 2000 to 2100. Leave it out for a report on the previous calendar month (any month you send is then ignored).
monthintegerNoThe report month, 1 to 12. Used only with year; with year and no month, the report covers the whole year.
themestringNoThe report theme, at most 64 characters, e.g. home-services. Leave it out to use the account's industry, or general when no industry is set.
forcebooleanNotrue generates a new report even when one already exists for the same location, review site, period and theme. The new report counts against your allowance. Defaults to false.

Request payload

{
  "store_id": 3007,
  "review_site_id": 44,
  "year": 2026,
  "month": 8,
  "theme": "home-services"
}

Response body

The payload is inside data. Status 202 when a new report is queued; 200 when an existing report is returned.

FieldTypeDescription
insight_report_idintegerThe report's id. Use it as report_id in Check report status.
store_idintegerThe location.
review_site_idinteger or nullThe review site, or null for a combined report.
publisherstringThe review site's source, e.g. maps.google.com, or all for a combined report.
yearintegerThe report year.
monthinteger or nullThe report month, or null for a full-year report.
themestringThe report theme.
statusstringpending, queued, processing, complete or failed. A new report is usually queued.
task_idstring or nullThe report generator's task id.
review_countinteger or nullHow many reviews the report analysed. null until it's complete.
result_summaryobject or nullThe report itself. null until it's complete; see Check report status.
failure_reasonstring or nullWhy the report failed, when it did.
failure_detailsstring or nullMore detail on the failure, when there is any.
created_atstring or nullWhen the report was requested (ISO 8601).
completed_atstring or nullWhen the report finished (ISO 8601). null while it's running.
remaininginteger or nullOnly on 202. Insight reports left on the location's allowance this period; null when there's no cap.
overagebooleanOnly on 202. true when this report was billed as overage.
usage_log_idintegerOnly on 202. The id of the usage record for this report.
dedupedbooleanOnly on 200. true: an existing report was returned and nothing was counted.

The response also carries the allowance in headers: X-Feature (insight_report), X-Feature-Limit, X-Feature-Used, X-Feature-Remaining (unlimited when there's no cap) and X-Feature-Hard-Stop (1 or 0).

Response payload

{
  "data": {
    "insight_report_id": 284,
    "store_id": 3007,
    "review_site_id": 44,
    "publisher": "maps.google.com",
    "year": 2026,
    "month": 8,
    "theme": "home-services",
    "status": "queued",
    "task_id": "7cf307e7-ed49-4016-aeed-084f215bc211",
    "review_count": null,
    "result_summary": null,
    "failure_reason": null,
    "failure_details": null,
    "created_at": "2026-09-28T14:47:44+00:00",
    "completed_at": null,
    "remaining": 4,
    "overage": false,
    "usage_log_id": 5123
  }
}

Examples

Success payload

A new report queued (202): see Response payload.

A report for the same location, review site, period and theme already exists (200):

{
  "data": {
    "insight_report_id": 284,
    "store_id": 3007,
    "review_site_id": 44,
    "publisher": "maps.google.com",
    "year": 2026,
    "month": 8,
    "theme": "home-services",
    "status": "queued",
    "task_id": "7cf307e7-ed49-4016-aeed-084f215bc211",
    "review_count": null,
    "result_summary": null,
    "failure_reason": null,
    "failure_details": null,
    "created_at": "2026-09-28T14:47:44+00:00",
    "completed_at": null,
    "deduped": true
  }
}

Error payload

403 Insight report allowance used up

{
  "message": "Limit reached for 'Insight Report': 5 of 5 units consumed this period.",
  "status": "error",
  "errors": {
    "remaining": 0
  }
}

422 Review site not linked to the location

{
  "message": "The selected review site is not linked to the given store.",
  "errors": {
    "review_site_id": [
      "The selected review site is not linked to the given store."
    ]
  }
}

422 Not enough reviews

{
  "message": "This location needs at least 10 reviews in the last 48 months before an insight report can be generated.",
  "errors": {
    "store_id": [
      "This location needs at least 10 reviews in the last 48 months before an insight report can be generated."
    ]
  }
}

422 Industry not supported yet

{
  "message": "Insight reports are not available for this account's industry yet. Please contact support.",
  "status": "error",
  "errors": {
    "reference": {
      "rd_request_id": null,
      "rd_error_code": null
    }
  }
}

422 Location outside your tree

{
  "message": "The selected store id does not belong to your company hierarchy.",
  "errors": {
    "store_id": [
      "The selected store id does not belong to your company hierarchy."
    ]
  }
}

502 Report provider error

{
  "message": "Insight report provider returned an error.",
  "status": "error",
  "errors": {
    "reference": {
      "rd_request_id": null,
      "rd_error_code": null
    }
  }
}

429 Too many requests

{
  "message": "Too Many Attempts."
}
StatusMeaning
200A report for the same location, review site, period and theme already exists; it's returned and nothing is counted.
202A new report is queued. Poll Check report status.
401The token is missing, expired or invalid.
403The insight report allowance is used up on a hard-stop plan, insight reports aren't on the location's plan, or the location has no active plan.
404The location's partner couldn't be found.
422A field is missing or invalid; the location is outside your tree, has too few reviews, has no review site reports can use, or isn't set up with the report provider yet; the review site isn't linked to the location; or the account's industry isn't supported yet.
429The report provider is rate-limiting requests. Try again later.
500Unexpected server error.
502The report provider returned an error or rejected the request.
504The report provider is unreachable or timed out.

Example request

curl --request POST \
  --url "https://production-api.shoutaboutus.com/api/v1/account/insight-report" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"store_id": 3007, "review_site_id": 44, "year": 2026, "month": 8, "theme": "home-services"}'

Did this page help you?