Text links clicked

Overview

Get which links in texts were clicked.

Use this to see what customers acted on.

You'll need an account token and the campaign's id. Clicks are counted over the campaign's life unless you send a window (start_date, end_date).

Returns click counts per link, most clicked first. Links that weren't clicked are listed with 0.

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/click-urls

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.
data[]array of objectsOne row per tracked link in the campaign's texts, most clicked first. [] when there are none.
data[].idintegerThe link's id. Use it as click_url_id in Click events for a link.
data[].url_namestringThe link's name.
data[].placeholderstringThe template placeholder for the link, e.g. directTo_manager.
data[].destination_urlstring or nullWhere the link goes. For a landing page, the landing page's preview URL.
data[].click_countintegerClicks in the window.
data[].unique_ipsintegerDistinct IP addresses that clicked.
data[].last_clickedstring or nullWhen it was last clicked (ISO 8601); null if never.

Response payload

{
  "data": {
    "status": "success",
    "data": [
      {
        "id": 45,
        "url_name": "Direct to Manager",
        "placeholder": "directTo_manager",
        "destination_url": "https://example.com/manager",
        "click_count": 25,
        "unique_ips": 20,
        "last_clicked": "2026-06-15T10:30:00.000Z"
      }
    ]
  }
}

Examples

Success payload

A campaign with a clicked link: see Response payload.

A campaign with no tracked links:

{
  "data": {
    "status": "success",
    "data": []
  }
}

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
200Click counts per link.
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/click-urls" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?