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), both Y-m-d.

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://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 404 Campaign not found.

Rate limit

120 requests per minute, counted per user (the token’s user). See Rate limits.

Request parameters

ParameterInTypeRequiredDescription
campaignIdpathintegerYesThe campaign's id (digits only). It must belong to your own company.
start_datequerystringNoStart of the window, Y-m-d. Default: the day the campaign was created. If it's after end_date, the two are swapped.
end_datequerystringNoEnd of the window, Y-m-d. Default: today.

Request body

None.

Request payload

None.

Response body

The payload is inside data.

FieldTypeDescription
statusstringsuccess.
dataobjectThe report.
data.kpisobjectTotals for the window. Test sends are left out except in tests_sent.
data.kpis.recipients_validintegerRecipients in the campaign with a valid email address (all time).
data.kpis.sentintegerEmails sent in the window.
data.kpis.deliveredintegerEmails delivered in the window.
data.kpis.openedintegerEmails opened in the window.
data.kpis.clickedintegerEmails with a link clicked in the window.
data.kpis.unsubscribedintegerUnsubscribes in the window.
data.kpis.failedintegerEmails that failed in the window.
data.kpis.processedintegerEmail requests created in the window.
data.kpis.ratesobjectPercentages, 2 decimals; 0 when the base is 0.
data.kpis.rates.processed_ratenumberprocessed as a percentage of recipients_valid.
data.kpis.rates.delivery_ratenumberdelivered as a percentage of sent.
data.kpis.rates.open_ratenumberopened as a percentage of sent.
data.kpis.rates.click_ratenumberclicked as a percentage of sent.
data.kpis.rates.unsubscribe_ratenumberunsubscribed as a percentage of sent.
data.kpis.rates.sent_vs_audience_ratenumbersent as a percentage of recipients_valid.
data.kpis.tests_sentintegerTest emails created in the window.
data.kpis.kiosk_sentintegerKiosk email requests created in the window.
data.timeseriesobjectDaily counts.
data.timeseries.by_day[]array of objectsOne row per day for the last 7 days (today and the 6 days before), oldest first.
data.timeseries.by_day[].datestringThe day, Y-m-d.
data.timeseries.by_day[].sentintegerEmails sent that day.
data.timeseries.by_day[].deliveredintegerEmails delivered that day.
data.timeseries.by_day[].openedintegerEmails opened that day.
data.timeseries.by_day[].clickedintegerEmails clicked that day.
data.timeseries.by_day[].unsubscribedintegerUnsubscribes that day.
data.timeseries.by_day[].failedintegerEmails that failed that day.
data.timeseries.by_day[].processedintegerEmail 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."
}
StatusMeaning
200The email metrics.
401The token is missing, expired or invalid.
404No campaign with that id in your company (Campaign not found).
422start_date or end_date isn't Y-m-d.
429More than 120 requests in a minute from this user.
500Unexpected 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'

Did this page help you?