Click events for a link

Overview

Get the individual click events on a tracked link: when, from where.

Use this for detailed click analysis.

You'll need the link id (id from Email links clicked or Text links clicked). Events are listed from the day the link was created unless you send a window (start_date, end_date).

Returns the events, newest first, 20 per page unless you set limit.

Prerequisites

Base URL

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

Endpoint

GET /api/v1/campaign/click-url/{click_url_id}/events

Authentication

Account token

  • The link must belong to a campaign of the caller's own company. Any other id returns 404 Click URL not found.

Rate limit

120 requests per minute, counted per user (the token’s user). See Rate limits.

Request parameters

ParameterInTypeRequiredDescription
click_url_idpathintegerYesThe tracked link's id (digits only).
start_datequerystringNoStart of the window, Y-m-d. Default: the day the link was created. If it's after end_date, the two are swapped.
end_datequerystringNoEnd of the window, Y-m-d. Default: today.
pagequeryintegerNoPage number, from 1. Default 1.
limitqueryintegerNoEvents per page, 10 to 100. Values below 10 are raised to 10; above 100 returns 422. Default 20.

Request body

None.

Request payload

None.

Response body

The payload is inside data.

FieldTypeDescription
statusstringsuccess.
dataobjectThe page of events.
data.current_pageintegerThis page's number.
data.per_pageintegerEvents per page (limit).
data.totalintegerEvents across all pages.
data.last_pageintegerNumber of the last page.
data.click_urlobjectThe tracked link.
data.click_url.idintegerThe link's id.
data.click_url.namestringThe link's name.
data.click_url.placeholderstringThe template placeholder for the link.
data.click_url.urlstring or nullWhere the link goes.
data.click_url.channel_typestringemail or sms.
data.events[]array of objectsThe clicks, newest first.
data.events[].idintegerThe event's id.
data.events[].eventstringAlways click.
data.events[].ipstringIP address of the click.
data.events[].user_agentstringBrowser user agent of the click.
data.events[].refererstring or nullReferring page, when the browser sent one.
data.events[].metadataobject or nullExtra details stored with the click.
data.events[].created_atstringWhen the click happened (ISO 8601).
data.events[].customer_dataobjectThe request that was clicked: with email for an email, with phone_number for a text. Left out when the click isn't tied to a request.
data.events[].customer_data.idintegerThe email or text request's id.
data.events[].customer_data.emailstringThe recipient's email address (email requests).
data.events[].customer_data.phone_numberstringThe recipient's phone number (text requests).
data.events[].customer_data.statusstringThe request's status.
data.events[].customer_data.sent_atstring or nullWhen the request was sent (ISO 8601).
data.events[].customer_data.customer_namestring or nullThe customer's name.
data.events[].customer_data.requestor_namestring or nullName of the person who asked for the review.

Response payload

{
  "data": {
    "status": "success",
    "data": {
      "current_page": 1,
      "per_page": 20,
      "total": 150,
      "last_page": 8,
      "click_url": {
        "id": 45,
        "name": "Direct to Manager",
        "placeholder": "directTo_manager",
        "url": "https://example.com/manager",
        "channel_type": "email"
      },
      "events": [
        {
          "id": 123,
          "event": "click",
          "ip": "192.168.1.1",
          "user_agent": "Mozilla/5.0...",
          "referer": "https://gmail.com",
          "metadata": null,
          "created_at": "2026-06-15T10:30:00.000Z",
          "customer_data": {
            "id": 88,
            "email": "[email protected]",
            "status": "clicked",
            "sent_at": "2026-06-15T09:00:00.000Z",
            "customer_name": "Jane Smith",
            "requestor_name": "Front Desk"
          }
        }
      ]
    }
  }
}

Examples

Success payload

See Response payload.

Error payload

404 Click URL not found

{
  "message": "Click URL 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."
    ]
  }
}

422 limit above 100

{
  "message": "The limit field must not be greater than 100.",
  "errors": {
    "limit": [
      "The limit field must not be greater than 100."
    ]
  }
}

429 Too many requests

{
  "message": "Too Many Attempts."
}
StatusMeaning
200One page of click events.
401The token is missing, expired or invalid.
404No tracked link with that id in your company (Click URL not found).
422A date isn't Y-m-d, or limit is above 100.
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/click-url/45/events?page=1&limit=20" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?