Send review request (test-review-request — deprecated alias)
Overview
Create a one-off audience row and queue an Email and/or SMS review request for a campaign (dispatched after DB commit onto the messaging queue). Branches on whether email and/or phone is supplied. Serves both production and test sends via the is_test flag. A non-test send increments the campaign's total_audience and schedules a follow-up email when the email channel has a follow-up template.
Deprecated path. POST /campaign/test-review-request is a backward-compatible alias that points at the same sendReviewRequest handler as the canonical POST /campaign/review-request (documented as Send review request (email and/or SMS)). Migrate callers to review-request.
Prerequisites
- A bearer token in the
Authorizationheader.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/campaign/test-review-request
Authentication
-
Requires a bearer token in the
Authorization: Bearer <bearer-token>header. -
Account — authentication, ACCOUNT-scope group. If not owned by the caller it returns 403 ("You are not authorized to send a review request for this campaign"). Store must have an active plan (400 otherwise).
Rate limit
- No rate limit.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
campaign_id | integer | Required | Must be an existing campaign inside your own account tree. |
customer_name | string | Required | max 255; trimmed. |
email | string | Conditional | required_without:phone; nullable, email:rfc,dns, max 255. Drives the Email send. |
phone | string | Conditional | required_without:email; nullable, min 7, max 20. Drives the SMS send. |
is_test | boolean | Optional | nullable. When true, tags every downstream row as test and skips follow-ups; does not increment total_audience. Defaults false. |
keywords | object | Optional | nullable map; each key max 100 chars. Empty/null values skipped. |
keywords.* | string | Optional | nullable value per keyword. |
At least one of email or phone is required.
{
"campaign_id": 123,
"customer_name": "John Doe",
"email": "[email protected]",
"phone": "+15551234567",
"is_test": true,
"keywords": {
"paragraph_1": "Thanks for visiting our store today!"
}
}How it works
- 200
{ status: "success", message }where message reflects which channel(s) were queued ("Email and SMS.", "Email.", or "SMS review request sent successfully"). - 403 if the caller does not own the campaign.
- 400 for: no active plan. A requested channel is missing/disabled or lacks a valid template. Missing review-site URLs in the landing page / email template (returns the per-site error list); or "Failed to send review request" if nothing was created.
- 422 on validation failure.
Response
200 OK · 200
200{
"data": {
"status": "success",
"message": "Email and SMS review requests sent successfully"
}
}403 Not owned · 403
403{
"status": "error",
"message": "You are not authorized to send a review request for this campaign",
"errors": []
}400 No active plan · 400
400{
"status": "error",
"message": "Store does not have an active plan",
"errors": []
}Errors
| Status | Meaning |
|---|---|
400 | No active plan |
401 | The bearer token is missing, expired or invalid |
403 | Not owned |
422 | Returned on validation failure |
500 | Unexpected server error |
Example request
curl --request POST \
--url "https://production-api.shoutaboutus.com/api/v1/campaign/test-review-request" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"campaign_id": 123, "customer_name": "John Doe", "email": "[email protected]", "phone": "+15551234567", "is_test": true, "keywords": {"paragraph_1": "Thanks for visiting our store today!"}}'Updated 11 days ago
