Email results for a campaign
Overview
Get one campaign's email numbers: sent, delivered, opened, clicked, unsubscribed, failed.
Use this to judge a campaign.
You'll need 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 (timeseries.by_day) always covers the last 7 days, whatever the window.
Returns the email 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/email
Authentication
Account token
- The campaign must belong to the caller's own company. Any other id, including a campaign of another account, 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 email address (all time). |
data.kpis.sent | integer | Emails sent in the window. |
data.kpis.delivered | integer | Emails delivered in the window. |
data.kpis.opened | integer | Emails opened in the window. |
data.kpis.clicked | integer | Emails with a link clicked in the window. |
data.kpis.unsubscribed | integer | Unsubscribes in the window. |
data.kpis.failed | integer | Emails that failed in the window. |
data.kpis.processed | integer | Email 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.open_rate | number | opened as a percentage of sent. |
data.kpis.rates.click_rate | number | clicked as a percentage of sent. |
data.kpis.rates.unsubscribe_rate | number | unsubscribed 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 emails created in the window. |
data.kpis.kiosk_sent | integer | Kiosk email requests created in the window. |
data.timeseries | object | Daily counts. |
data.timeseries.by_day[] | array of objects | One row per day for the last 7 days (today and the 6 days before), oldest first. |
data.timeseries.by_day[].date | string | The day, Y-m-d. |
data.timeseries.by_day[].sent | integer | Emails sent that day. |
data.timeseries.by_day[].delivered | integer | Emails delivered that day. |
data.timeseries.by_day[].opened | integer | Emails opened that day. |
data.timeseries.by_day[].clicked | integer | Emails clicked that day. |
data.timeseries.by_day[].unsubscribed | integer | Unsubscribes that day. |
data.timeseries.by_day[].failed | integer | Emails that failed that day. |
data.timeseries.by_day[].processed | integer | Email requests created that day. |
Response payload
{
"data": {
"status": "success",
"data": {
"kpis": {
"recipients_valid": 1,
"sent": 1,
"delivered": 1,
"opened": 1,
"clicked": 0,
"unsubscribed": 0,
"failed": 0,
"processed": 1,
"rates": {
"processed_rate": 100,
"delivery_rate": 100,
"open_rate": 100,
"click_rate": 0,
"unsubscribe_rate": 0,
"sent_vs_audience_rate": 100
},
"tests_sent": 0,
"kiosk_sent": 0
},
"timeseries": {
"by_day": [
{
"date": "2026-09-25",
"sent": 0,
"delivered": 0,
"opened": 0,
"clicked": 0,
"unsubscribed": 0,
"failed": 0,
"processed": 0
},
{
"date": "2026-09-26",
"sent": 0,
"delivered": 0,
"opened": 0,
"clicked": 0,
"unsubscribed": 0,
"failed": 0,
"processed": 0
},
{
"date": "2026-09-27",
"sent": 0,
"delivered": 0,
"opened": 0,
"clicked": 0,
"unsubscribed": 0,
"failed": 0,
"processed": 0
},
{
"date": "2026-09-28",
"sent": 0,
"delivered": 0,
"opened": 0,
"clicked": 0,
"unsubscribed": 0,
"failed": 0,
"processed": 0
},
{
"date": "2026-09-29",
"sent": 0,
"delivered": 0,
"opened": 0,
"clicked": 0,
"unsubscribed": 0,
"failed": 0,
"processed": 0
},
{
"date": "2026-09-30",
"sent": 0,
"delivered": 0,
"opened": 0,
"clicked": 0,
"unsubscribed": 0,
"failed": 0,
"processed": 0
},
{
"date": "2026-10-01",
"sent": 1,
"delivered": 1,
"opened": 1,
"clicked": 0,
"unsubscribed": 0,
"failed": 0,
"processed": 1
}
]
}
}
}
}Examples
Success payload
See Response payload.
Error payload
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 email metrics. |
401 | The token is missing, expired or invalid. |
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/email" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json'Updated 17 days ago
Did this page help you?
