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), 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/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
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[] | array of objects | One row per tracked link in the campaign's texts, most clicked first. [] when there are none. |
data[].id | integer | The link's id. Use it as click_url_id in Click events for a link. |
data[].url_name | string | The link's name. |
data[].placeholder | string | The template placeholder for the link, e.g. directTo_manager. |
data[].destination_url | string or null | Where the link goes. For a landing page, the landing page's preview URL. |
data[].click_count | integer | Clicks in the window. |
data[].unique_ips | integer | Distinct IP addresses that clicked. |
data[].last_clicked | string or null | When 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."
}| Status | Meaning |
|---|---|
200 | Click counts per link. |
401 | The token is missing, expired or invalid. |
403 | The company behind the token isn't an account. |
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/sms/click-urls" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json'Updated 17 days ago
Did this page help you?
