Get one text template
Overview
Get a template's content.
Use this to load it for editing. With campaign_id, the location's details are filled into the merge fields. If that campaign's text channel has a template, you get that template instead of smsTemplateId, with [landingPageUrl] set to the channel's landing page link.
You'll need the template id (value in List text templates).
Returns the template.
Prerequisites
- A bearer token. See Authentication.
- The template's id (
smsTemplateId), from List text templates. - Optional: a campaign id (
campaign_id) to preview the text for.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
GET /api/v1/campaign/template/sms/{smsTemplateId}
Authentication
Account token
- The template must belong to your account tree or be a shared (global) template; otherwise
422. campaign_id, when sent, must be one of your campaigns.
Rate limit
This endpoint has no rate limit.
Request parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
smsTemplateId | path | integer | Yes | The template's id (value in List text templates). Must be one of your account's templates or a shared template. |
campaign_id | query | integer | No | A campaign to preview the text for. Its location's details fill the merge fields. When the campaign's text channel has a template, that template is returned instead of smsTemplateId. Must be one of your campaigns. |
Request body
None.
Request payload
None.
Response body
The payload is inside data.
| Field | Type | Description |
|---|---|---|
status | string | success. |
data | object | The template. |
data.id | integer | The template's id. Use it as sms_template_id. |
data.company_id | integer or null | The account that owns the template. null for a shared (global) template. |
data.store_id | integer or null | The location the template is tied to, or null. |
data.name | string | The template's name. |
data.content | string or null | The message text. Merge fields in square brackets are filled in when you send campaign_id. |
data.json_content | object or null | Editor data, or null. |
data.landing_page_id | integer or null | The landing page template linked to this text, or null. |
data.review_site_id | integer or null | The review site linked to this text, or null. |
data.created_at | string or null | When the template was created (ISO 8601). null on shared templates. |
data.updated_at | string or null | When the template was last changed (ISO 8601). null on shared templates. |
Response payload
{
"data": {
"status": "success",
"data": {
"id": 469,
"company_id": 5994,
"store_id": 3007,
"name": "Simple & Direct",
"content": "Hi [customerName], thank you for choosing [locationName]! We'd love to hear about your experience. Share your feedback here: [landingPageUrl] Reply STOP to opt out. Sent by RM.",
"json_content": null,
"landing_page_id": 4548,
"review_site_id": null,
"created_at": "2026-09-23T10:43:44.000000Z",
"updated_at": "2026-09-23T10:43:44.000000Z"
}
}
}Examples
Success payload
See Response payload.
With campaign_id=4823 (a campaign with no text channel), the location's name fills [locationName]; [customerName] and [landingPageUrl] stay as they are:
{
"data": {
"status": "success",
"data": {
"id": 469,
"company_id": 5994,
"store_id": 3007,
"name": "Simple & Direct",
"content": "Hi [customerName], thank you for choosing Acme Coffee! We'd love to hear about your experience. Share your feedback here: [landingPageUrl] Reply STOP to opt out. Sent by RM.",
"json_content": null,
"landing_page_id": 4548,
"review_site_id": null,
"created_at": "2026-09-23T10:43:44.000000Z",
"updated_at": "2026-09-23T10:43:44.000000Z"
}
}
}A shared (global) template has no company_id or store_id:
{
"data": {
"status": "success",
"data": {
"id": 1,
"company_id": null,
"store_id": null,
"name": "Simple & Direct",
"content": "Hi [customerName], thank you for choosing [locationName]! We'd love to hear about your experience. Share your feedback here: [landingPageUrl] Reply STOP to opt out. Sent by RM.",
"json_content": null,
"landing_page_id": null,
"review_site_id": null,
"created_at": null,
"updated_at": null
}
}
}Error payload
422 Template doesn't exist
{
"message": "The selected id is invalid.",
"errors": {
"id": [
"The selected id is invalid."
]
}
}422 Not your template
{
"message": "The selected SMS template does not belong to your company.",
"errors": {
"id": [
"The selected SMS template does not belong to your company."
]
}
}422 Campaign doesn't exist
{
"message": "The selected campaign id is invalid.",
"errors": {
"campaign_id": [
"The selected campaign id is invalid."
]
}
}| Status | Meaning |
|---|---|
200 | The template. |
401 | The token is missing, expired or invalid. |
422 | The template doesn't exist or belongs to another account, or campaign_id doesn't exist. |
500 | Unexpected server error. |
Example request
curl --request GET \
--url "https://production-api.shoutaboutus.com/api/v1/campaign/template/sms/469" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json'Updated 17 days ago
