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

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://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_id resolves to its store's company_id. It is validated by an ownership check, then re-checked against. Failures return Access 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:
FieldTypeRequiredDescription
review_idintegerrequiredMust be an existing review and belong to the caller's company hierarchy.
responsestringrequiredResponse 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_idintegeroptional (nullable)Identifier of the AI/smart response used, if any.
ai_responsestringoptional (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

{
  "data": {
    "status": "success",
    "response": "Your response has been submitted and will be posted live"
  }
}

Errors

StatusMeaning
400The request was rejected — the response explains why
401The bearer token is missing, expired or invalid
402The response feature limit of your plan is reached (X-Feature-* headers give the details)
403The token is valid but the record sits outside your account
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/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!"}'

Did this page help you?