Generate last month's report
Overview
Generate a report covering the previous calendar month.
Use this on a schedule for a monthly digest.
You'll need the store_id. The report is the combined report across all the location's review sites, with the theme from the account's industry. If a report for last month already exists (and hasn't failed), it's returned unchanged (200, deduped: true) and nothing is counted; otherwise a new one is generated and counts against your allowance.
Returns a report id to poll with Check report status.
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
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/account/insight-report/generate
Authentication
Partner or Account token
store_idmust 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
| Field | Type | Required | Description |
|---|---|---|---|
store_id | integer | Yes | The location to report on. Must exist and be inside your account tree, have at least 10 reviews in the last 48 months, and have at least one linked review site that reports can use. |
The other fields of Generate an insight report (review_site_id, year, month, theme, force) are checked if you send them, but not used: the period is always the previous calendar month.
Request payload
{
"store_id": 3007
}Response body
The payload is inside data. Status 202 when a new report is queued; 200 when last month's report already exists. The fields are the same as Generate an insight report.
| Field | Type | Description |
|---|---|---|
insight_report_id | integer | The report's id. Use it as report_id in Check report status. |
store_id | integer | The location. |
review_site_id | null | null: the report combines all the location's review sites. |
publisher | string | all. |
year | integer | The year of the previous calendar month. |
month | integer | The previous calendar month. |
theme | string | The report theme, from the account's industry (general when no industry is set). |
status | string | pending, queued, processing, complete or failed. A new report is usually queued. |
task_id | string or null | The report generator's task id. |
review_count | integer or null | How many reviews the report analysed. null until it's complete. |
result_summary | object or null | The report itself. null until it's complete; see Check report status. |
failure_reason | string or null | Why the report failed, when it did. |
failure_details | string or null | More detail on the failure, when there is any. |
created_at | string or null | When the report was requested (ISO 8601). |
completed_at | string or null | When the report finished (ISO 8601). null while it's running. |
remaining | integer or null | Only on 202. Insight reports left on the location's allowance this period; null when there's no cap. |
overage | boolean | Only on 202. true when this report was billed as overage. |
usage_log_id | integer | Only on 202. The id of the usage record for this report. |
deduped | boolean | Only on 200. true: last month's report already existed 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": 286,
"store_id": 3007,
"review_site_id": null,
"publisher": "all",
"year": 2026,
"month": 9,
"theme": "business-services",
"status": "queued",
"task_id": "3f2b8c1e-5d4a-4e7b-9c6f-2a1d0e8b7c5a",
"review_count": null,
"result_summary": null,
"failure_reason": null,
"failure_details": null,
"created_at": "2026-10-01T09:00:00+00:00",
"completed_at": null,
"remaining": 4,
"overage": false,
"usage_log_id": 5123
}
}Examples
Success payload
A new report queued (202): see Response payload.
Last month's report already exists (200):
{
"data": {
"insight_report_id": 286,
"store_id": 3007,
"review_site_id": null,
"publisher": "all",
"year": 2026,
"month": 9,
"theme": "business-services",
"status": "queued",
"task_id": "3f2b8c1e-5d4a-4e7b-9c6f-2a1d0e8b7c5a",
"review_count": null,
"result_summary": null,
"failure_reason": null,
"failure_details": null,
"created_at": "2026-10-01T09:00:00+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 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 store_id missing
{
"message": "The store id field is required.",
"errors": {
"store_id": [
"The store id field is required."
]
}
}429 Too many requests
{
"message": "Too Many Attempts."
}| Status | Meaning |
|---|---|
200 | Last month's report already exists; it's returned and nothing is counted. |
202 | A new report is queued. Poll Check report status. |
401 | The token is missing, expired or invalid. |
403 | The 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. |
404 | The location's partner couldn't be found. |
422 | store_id 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; or the account's industry isn't supported yet. |
429 | The report provider is rate-limiting requests. Try again later. |
500 | Unexpected server error. |
502 | The report provider returned an error or rejected the request. |
504 | The report provider is unreachable or timed out. |
Example request
curl --request POST \
--url "https://production-api.shoutaboutus.com/api/v1/account/insight-report/generate" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"store_id": 3007}'Updated 17 days ago
