---
title: "List clicks for a link"
method: GET
path: "/api/links/{id}/clicks"
tags: ["Click Analytics"]
---

# List clicks for a link

`GET /api/links/{id}/clicks`

## Request

- Base URL: `https://www.flyn.to`
- URL: `https://www.flyn.to/api/links/{id}/clicks`
- Auth: HTTP bearer

Raw click events for one link in the caller's workspace, newest first. Bots are filtered out on the redirect, so these are human clicks, except that clicks recorded when a password-protected link is unlocked are not bot-filtered.

**Auth:** API key (`Bearer flyn_sk_live_...`) or an MCP OAuth access token (`Bearer flyn_mcp_at_...`). The dashboard session cookie is not accepted.

**Plan:** every plan may call it. On Free only the last 30 days are returned (a rolling read window) and country, city, device, os, browser and referrer are null. Pro, Lifetime or Team (a member of a paying owner's workspace has the effective plan `team`) get full detail and unlimited history. Any team role.

**Rate limit:** 30 requests per 60 s per client IP, fixed window, in memory per server instance, checked before authentication.

## Query parameters

- `page` integer
- `limit` integer

## Response `200`

The page of clicks.

- ClickList
  - `clicks` Click[], required
    - `id` string, uuid, required
    - `timestamp` string, date-time, required
    - `country` string, nullable, required: ISO country code, or "Unknown" when no geo data was available.
    - `city` string, nullable, required
    - `device` string, nullable, required: mobile, desktop or tablet.
    - `os` string, nullable, required
    - `browser` string, nullable, required
    - `referrer` string, nullable, required: Referring URL, or "Direct" when there was none.
  - `pagination` Pagination, required
    - `page` integer, required: Current page, starting at 1.
    - `limit` integer, required: Items per page after clamping.
    - `total` integer, required: Total matching items.
    - `totalPages` integer, required: ceil(total / limit).
    - `hasMore` boolean, required: True when another page exists.
  - `planLimits` object, required
    - `advancedAnalytics` boolean, required: False on Free: detail fields are null.
    - `retentionDays` integer, nullable, required: 30 on Free (a rolling read window), null when history is unlimited.

## Other responses

- `401`: Missing header, wrong prefix, unknown or revoked key, expired key, or an invalid MCP OAuth token. Messages: "Missing or invalid API key. Use: Authorization: Bearer flyn_sk_live_...", "Invalid or revoked API key", "API key has expired", "Invalid or expired OAuth token".
- `403`: The account is suspended.
- `404`: Not found in the workspace.
- `429`: More than 30 requests in the window. Counted per client IP. Retry-After gives the seconds until the window resets.
- `500`: Query error.

---

[API](https://skmtc.dev/flyn/apis/flyn-api.md) · [All operations](https://skmtc.dev/flyn/apis/flyn-api/llms.txt) · [OpenAPI document](https://skmtc.dev/flyn/apis/flyn-api/revisions/977962a98ccb?raw)
