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

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://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 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 phone number (all time).
data.kpis.sentintegerTexts sent in the window.
data.kpis.deliveredintegerTexts delivered in the window.
data.kpis.clickedintegerTexts with the link clicked in the window.
data.kpis.failedintegerTexts that failed in the window.
data.kpis.processedintegerText 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.click_ratenumberclicked as a percentage of sent.
data.kpis.rates.sent_vs_audience_ratenumbersent as a percentage of recipients_valid.
data.kpis.tests_sentintegerTest texts created in the window.
data.kpis.kiosk_sentintegerKiosk text requests created in the window.
data.timeseriesobjectDaily counts.
data.timeseries.by_day[]array of objectsOne row per day of the window, oldest first.
data.timeseries.by_day[].datestringThe day, Y-m-d.
data.timeseries.by_day[].sentintegerTexts sent that day.
data.timeseries.by_day[].deliveredintegerTexts delivered that day.
data.timeseries.by_day[].clickedintegerTexts clicked that day.
data.timeseries.by_day[].failedintegerTexts that failed that day.
data.timeseries.by_day[].processedintegerText 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."
}
StatusMeaning
200The text metrics.
401The token is missing, expired or invalid.
403The company behind the token isn't an account.
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/sms" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?