Email links clicked
Overview
Get which links in the email were clicked and how often.
Use this to see what customers acted on.
You'll need 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/email/click-urls
Authentication
Account token
- The campaign must belong to the caller's own company. Any other id, including a campaign of another account, 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 emails, 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, e.g. Google; (Follow-up) is added for a follow-up email's link. |
data[].is_follow_up | boolean | Whether the link is in a follow-up email. |
data[].placeholder | string | The template placeholder for the link, e.g. directTo_google. |
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": "Google",
"is_follow_up": false,
"placeholder": "directTo_google",
"destination_url": "https://maps.google.com/...",
"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
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. |
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/email/click-urls" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json'Updated 17 days ago
Did this page help you?
