Text results for a campaign
Overview
Get one campaign's text numbers: sent, delivered, clicked, failed.
Use this to judge a campaign.
You'll need an account token and the campaign's id. The totals cover the campaign's life unless you send a window (start_date, end_date); test sends are counted separately in tests_sent. The daily series has one row per day of the window.
Returns the text metrics.
Prerequisites
- A bearer token. See Authentication.
- The campaign's id (
campaignId), from List campaigns. - Optional: a window (
start_date,end_date), bothY-m-d.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
GET /api/v1/campaign/{campaignId}/report/sms
Authentication
Account token
- Only account users can call it: the company behind the token must be an account. Partner and location users get
403. - The campaign must belong to the caller's own company. Any other id returns
404Campaign not found.
Rate limit
120 requests per minute, counted per user (the token’s user). See Rate limits.
Request parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
campaignId | path | integer | Yes | The campaign's id (digits only). It must belong to your own company. |
start_date | query | string | No | Start of the window, Y-m-d. Default: the day the campaign was created. If it's after end_date, the two are swapped. |
end_date | query | string | No | End of the window, Y-m-d. Default: today. |
Request body
None.
Request payload
None.
Response body
The payload is inside data.
| Field | Type | Description |
|---|---|---|
status | string | success. |
data | object | The report. |
data.kpis | object | Totals for the window. Test sends are left out except in tests_sent. |
data.kpis.recipients_valid | integer | Recipients in the campaign with a valid phone number (all time). |
data.kpis.sent | integer | Texts sent in the window. |
data.kpis.delivered | integer | Texts delivered in the window. |
data.kpis.clicked | integer | Texts with the link clicked in the window. |
data.kpis.failed | integer | Texts that failed in the window. |
data.kpis.processed | integer | Text requests created in the window. |
data.kpis.rates | object | Percentages, 2 decimals; 0 when the base is 0. |
data.kpis.rates.processed_rate | number | processed as a percentage of recipients_valid. |
data.kpis.rates.delivery_rate | number | delivered as a percentage of sent. |
data.kpis.rates.click_rate | number | clicked as a percentage of sent. |
data.kpis.rates.sent_vs_audience_rate | number | sent as a percentage of recipients_valid. |
data.kpis.tests_sent | integer | Test texts created in the window. |
data.kpis.kiosk_sent | integer | Kiosk text requests created in the window. |
data.timeseries | object | Daily counts. |
data.timeseries.by_day[] | array of objects | One row per day of the window, oldest first. |
data.timeseries.by_day[].date | string | The day, Y-m-d. |
data.timeseries.by_day[].sent | integer | Texts sent that day. |
data.timeseries.by_day[].delivered | integer | Texts delivered that day. |
data.timeseries.by_day[].clicked | integer | Texts clicked that day. |
data.timeseries.by_day[].failed | integer | Texts that failed that day. |
data.timeseries.by_day[].processed | integer | Text requests created that day. |
Response payload
{
"data": {
"status": "success",
"data": {
"kpis": {
"recipients_valid": 0,
"sent": 0,
"delivered": 0,
"clicked": 0,
"failed": 0,
"processed": 0,
"rates": {
"processed_rate": 0,
"delivery_rate": 0,
"click_rate": 0,
"sent_vs_audience_rate": 0
},
"tests_sent": 0,
"kiosk_sent": 0
},
"timeseries": {
"by_day": [
{
"date": "2026-10-01",
"sent": 0,
"delivered": 0,
"clicked": 0,
"failed": 0,
"processed": 0
}
]
}
}
}
}Examples
Success payload
See Response payload.
Error payload
403 Not an account user
{
"message": "This action is unauthorized."
}404 Campaign not found
{
"message": "Campaign not found",
"status": "error",
"errors": []
}422 Date not in Y-m-d
{
"message": "The start date field must match the format Y-m-d.",
"errors": {
"start_date": [
"The start date field must match the format Y-m-d."
]
}
}429 Too many requests
{
"message": "Too Many Attempts."
}| Status | Meaning |
|---|---|
200 | The text metrics. |
401 | The token is missing, expired or invalid. |
403 | The company behind the token isn't an account. |
404 | No campaign with that id in your company (Campaign not found). |
422 | start_date or end_date isn't Y-m-d. |
429 | More than 120 requests in a minute from this user. |
500 | Unexpected server error. |
Example request
curl --request GET \
--url "https://production-api.shoutaboutus.com/api/v1/campaign/4823/report/sms" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json'Updated 17 days ago
Did this page help you?
