Save response
Overview
Save (creates or updates) a response to a review and queues it for posting to the live review site. Runs posting/connection/feature gates, site-specific character-limit checks, records billable usage, dispatches the platform post job (Google/Facebook/Caring/RD), and audit-logs the result.
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/response/save
Authentication
-
Requires a bearer token in the
Authorization: Bearer <bearer-token>header. -
Who can call it: Partner and Account tokens.
-
Flat
/response/*route, account-scoped at the controller level. -
review_idresolves to its store'scompany_id. It is validated by an ownership check, then re-checked against. Failures returnAccess denied(403). -
Reachable scope is hierarchy-based. A partner-tier user can save responses for any store under its tree. An account user only for its own stores' reviews.
Rate limit
- No rate limit.
Request body
- Body:
| Field | Type | Required | Description |
|---|---|---|---|
review_id | integer | required | Must be an existing review and belong to the caller's company hierarchy. |
response | string | required | Response text. Length limits enforced per site: OpenTable (rs=16) ≤400 non-space chars; Optspot (rs=81) 80–160 chars; all sites ≤4000 chars. Must differ (case-insensitively) from the existing response. |
ai_response_id | integer | optional (nullable) | Identifier of the AI/smart response used, if any. |
ai_response | string | optional (nullable) | The AI/smart response text, if any. |
{
"review_id": 123,
"response": "Thank you for the wonderful review! We are thrilled you enjoyed your visit.",
"ai_response_id": 123,
"ai_response": "Thank you for the wonderful review!"
}Response
data.status(string) —"success".data.response(string) — confirmation message"Your response has been submitted and will be posted live".
Non-success paths return error envelopes: 403 Access denied / pre-subscription or unavailable response; 422 when posting is disabled for the site (posting) or the store↔site is not connected (connection). FeatureLimitException when the per-feature service limit/quota is exceeded; 400 for character-limit or duplicate-response violations.
200 OK · 200
200{
"data": {
"status": "success",
"response": "Your response has been submitted and will be posted live"
}
}Errors
| Status | Meaning |
|---|---|
400 | The request was rejected — the response explains why |
401 | The bearer token is missing, expired or invalid |
402 | The response feature limit of your plan is reached (X-Feature-* headers give the details) |
403 | The token is valid but the record sits outside your account |
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/response/save" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"review_id": 123, "response": "Thank you for the wonderful review! We are thrilled you enjoyed your visit.", "ai_response_id": 123, "ai_response": "Thank you for the wonderful review!"}'Updated 11 days ago
