SMS report

Overview

Get SMS-channel KPIs (valid recipients, processed, sent, delivered, clicked, failed, tests, kiosk) plus computed rates and a per-day timeseries for one campaign.

Prerequisites

  • A bearer token. Callable with Account tokens.
  • The campaignId of the record you are targeting.

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

GET /api/v1/campaign/{campaignId}/report/sms

Authentication

  • Requires a bearer token in the Authorization: Bearer <bearer-token> header.

  • Who can call it: Account tokens.

  • Requires the user's own company bundle_id === 3 (ACCOUNT).

  • The campaign is scoped to the caller, so an account can only read its own campaigns (404 Campaign not found otherwise).

  • Non-account users get 403.

Rate limit

  • No rate limit.

Path parameters

ParameterTypeRequiredDescription
campaignIdintegerRequiredDigits only.

Query parameters

  • Query: start_date (string Y-m-d, optional) — defaults to the campaign's created_at start-of-day.
  • Query: end_date (string Y-m-d, optional) — defaults to now end-of-day. If start_date > end_date the two are swapped.

Response

  • data.status (string) — "success".
  • data.data.kpis.recipients_valid (int) — count of audience rows with is_phone_valid = 'valid', is_test = false.
  • data.data.kpis.sent / delivered / clicked / failed / processed (int) — non-test counts within the date window (sent_at / delivered_at / link_clicked_at / failed_at / created_at respectively; failed also requires status = 'failed').
  • data.data.kpis.tests_sent (int) — is_test = true requests created in window.
  • data.data.kpis.kiosk_sent (int) — non-test is_kiosk = true requests in window.
  • data.data.kpis.rates.processed_rate / delivery_rate / click_rate / sent_vs_audience_rate (float, 2dp) — percentages; 0 when denominator is 0.
  • data.data.timeseries.by_day[] (array) — one row per calendar day in range with date (Y-m-d), sent, delivered, clicked, failed, processed (all int).

200 Success · 200

{
  "data": {
    "status": "success",
    "data": {
      "kpis": {
        "recipients_valid": 1400,
        "sent": 1360,
        "delivered": 1320,
        "clicked": 210,
        "failed": 40,
        "processed": 1400,
        "rates": {
          "processed_rate": 100,
          "delivery_rate": 97.06,
          "click_rate": 15.44,
          "sent_vs_audience_rate": 97.14
        },
        "tests_sent": 5,
        "kiosk_sent": 100
      },
      "timeseries": {
        "by_day": [
          {
            "date": "2025-08-21",
            "sent": 120,
            "delivered": 118,
            "clicked": 18,
            "failed": 2,
            "processed": 120
          }
        ]
      }
    }
  }
}

Errors

StatusMeaning
401The bearer token is missing, expired or invalid
403The token is valid but the record sits outside your account
404The campaign id does not exist or is not yours (Campaign not found)
422The request failed validation — the response names the fields
500Unexpected server error

Example request

curl --request GET \
  --url "https://production-api.shoutaboutus.com/api/v1/campaign/123/report/sms" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?