Skip to Content
Retargeting Pixels on every Link 🎉
Link Squeeze LogoLink Squeeze Docs
FeaturesToolsPricingBlog
CTRL K
CTRL K
    • How to Add Custom Domains to Link Squeeze
    • How to Shorten Links Using Link Squeeze
    • How to Shorten Shopify URLs Using Link Squeeze
    • How to Add Google Ads Tag to Link Squeeze
    • How to Add Meta Pixel to Link Squeeze
    • How to Add Retargeting Pixels to links in Link Squeeze
    • How to Create a Custom Audience on Facebook and Instagram
    • Authentication
    • Links
    • Click Analytics
    • Domains
    • Pixels
    • Webhooks
    • Errors & Rate Limits
  • Features
  • Tools
  • Pricing
  • Blog
    • How to Add Custom Domains to Link Squeeze
    • How to Shorten Links Using Link Squeeze
    • How to Shorten Shopify URLs Using Link Squeeze
    • How to Add Google Ads Tag to Link Squeeze
    • How to Add Meta Pixel to Link Squeeze
    • How to Add Retargeting Pixels to links in Link Squeeze
    • How to Create a Custom Audience on Facebook and Instagram
    • Authentication
    • Links
    • Click Analytics
    • Domains
    • Pixels
    • Webhooks
    • Errors & Rate Limits

On This Page

  • The click object
  • List clicks
  • Click statistics
Question? Give us feedback
API ReferenceClick Analytics

Click analytics

Two endpoints report on clicks: a raw log of individual clicks, and an aggregated time series of click counts. Both are nested under a link and both require the links:read scope.

MethodPathScopeReturns
GET/v1/links/{id}/clickslinks:readPaginated log of single clicks
GET/v1/links/{id}/statslinks:readClick counts grouped by period

A link belonging to another account returns 404 not_found from both endpoints.

The click object

{ "id": "c41d8b30-9e57-4a22-b6f8-1d0e7a94c2b5", "ip": "203.0.113.42", "country": "US", "visitor_id": "visitor-9f2c1b", "referrer": "https://twitter.com/", "device": "mobile", "browser": "Safari", "platform": "iOS", "created_at": "2026-08-28T10:16:31.000000Z" }
FieldTypeDescription
iduuidThe click’s identifier
ipstring | nullIP address the click came from
countrystring | nullTwo-letter country code resolved from the IP
visitor_idstring | nullPseudonymous visitor identifier, stable across clicks from the same visitor
referrerstring | nullThe page the visitor came from, when the browser sent one
devicestring | nullDevice category, for example mobile or desktop
browserstring | nullBrowser name
platformstring | nullOperating system
created_attimestampWhen the click was recorded

Any of the enriched fields can be null — referrer when the visitor navigated directly, country when the IP could not be resolved, and the device fields when the user agent could not be parsed.

The click object carries a link_id field in webhook deliveries, where the link it belongs to would otherwise be ambiguous. It is omitted from this endpoint’s responses, because the link is already named in the request path.

List clicks

GET /v1/links/{id}/clicks

Scope: links:read

Returns the raw click log for a link, newest first, in the standard paginated shape.

Query parameterTypeDescription
pageintegerPage to return. Defaults to 1.
per_pageintegerResults per page. Defaults to 15, maximum 100.
curl "https://app.linksqueeze.io/api/v1/links/9b1f4e2a-6c3d-4a17-9f2e-7c8d5a1b3e40/clicks?per_page=100" \ -H "Authorization: Bearer $LINKSQUEEZE_API_KEY" \ -H "Accept: application/json"
{ "data": [ { "id": "c41d8b30-9e57-4a22-b6f8-1d0e7a94c2b5", "ip": "203.0.113.42", "country": "US", "visitor_id": "visitor-9f2c1b", "referrer": "https://twitter.com/", "device": "mobile", "browser": "Safari", "platform": "iOS", "created_at": "2026-08-28T10:16:31.000000Z" } ], "links": { "first": "...", "last": "...", "prev": null, "next": "..." }, "meta": { "current_page": 1, "per_page": 100, "total": 128 } }

Click statistics

GET /v1/links/{id}/stats

Scope: links:read

Returns click counts grouped into time buckets — the shape you want for a chart, without paging through every individual click.

Query parameterTypeDescription
group_bystringOne of day, week, or month. Defaults to day.
fromdateOnly count clicks from this date onward. Inclusive, from the start of the day.
todateOnly count clicks up to this date. Inclusive, through the end of the day.
curl "https://app.linksqueeze.io/api/v1/links/9b1f4e2a-6c3d-4a17-9f2e-7c8d5a1b3e40/stats?group_by=day&from=2026-07-01&to=2026-07-31" \ -H "Authorization: Bearer $LINKSQUEEZE_API_KEY" \ -H "Accept: application/json"
{ "data": [ { "period": "2026-07-01", "clicks": 2 }, { "period": "2026-07-02", "clicks": 1 } ] }
FieldTypeDescription
perioddateThe start of the bucket, as YYYY-MM-DD
clicksintegerNumber of clicks recorded within that bucket

Buckets are sorted oldest first. period is always the first day of the bucket: the day itself for day, the Monday for week, and the first of the month for month.

Empty periods are omitted. A day with no clicks does not appear in the response as a zero — it is simply absent. If you are drawing a chart, generate the full range of periods yourself and fill in the gaps with 0.

This response is not paginated and has no links or meta object. Narrow it with from and to rather than by paging.

An invalid group_by value is rejected with 422 validation_error.

Last updated on August 28, 2026
LinksDomains
Link Squeeze LogoLink Squeeze

Branded short links with built-in retargeting pixels for performance marketers.

Product
  • Pricing
  • Sign up
  • Log in
  • Use cases
  • Docs
  • API
  • Blog
Free tools
  • Link shortener
  • UTM builder
  • Link Preview Generator
  • All tools
Legal
  • Privacy policy
  • Terms of service
  • Support
Compare
  • Bitly
  • Rebrandly
  • Short.io
  • Replug
  • Dub
© 2026 Link Squeeze. All rights reserved.Made for marketers who measure everything.