# List clicks per link

> The tracked links of a broadcast (broadcast_id) or template (template_id), most clicked by people first, with total, bot and unique clicks, and the all-time…

Source: https://docs.pidgely.com/api-reference/metrics/list-links/

`GET https://api.pidgely.com/metrics/links`

The tracked links of a broadcast (`broadcast_id`) or template (`template_id`), most clicked by people first, with total, bot and unique clicks, and the all-time `totals` of that broadcast or template.

Pidgely extension. The tracked links of a broadcast (`broadcast_id`) or template (`template_id`), most clicked by people first, with total, bot and unique clicks, and the all-time totals of that broadcast or template. Requires a `full_access` key.

**Authorization:** `Bearer pdg_…`. An API key with `full_access`. A `sending_access` key gets `401 restricted_api_key`.

## Query parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `broadcast_id` | string | No | The broadcast (one of broadcast_id or template_id). UUID. |
| `template_id` | string | No | The template (one of broadcast_id or template_id). UUID. |

## Request

This endpoint is not in the [SDKs](https://docs.pidgely.com/sdks/) yet; call it over HTTP.

```bash tab="cURL"
curl -X GET 'https://api.pidgely.com/metrics/links?broadcast_id=0199d7f6-4c8d-7e1a-9b3f-2d6a5c0e7f19' \
  -H "Authorization: Bearer $PIDGELY_API_KEY"
```

## Response

`200 OK`

```json
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "url": "https://acme.com/changelog",
      "clicks": 180,
      "bot_clicks": 31,
      "unique_clicks": 121,
      "unique_human_clicks": 98,
      "last_clicked_at": "2026-10-12 16:44:41.000000+00"
    },
    {
      "url": "https://acme.com/pricing",
      "clicks": 53,
      "bot_clicks": 10,
      "unique_clicks": 39,
      "unique_human_clicks": 33,
      "last_clicked_at": "2026-10-12 16:44:41.000000+00"
    }
  ],
  "totals": {
    "key": "0199d7f6-4c8d-7e1a-9b3f-2d6a5c0e7f19",
    "sent": 1200,
    "delivered": 1188,
    "hard_bounced": 7,
    "soft_bounced": 5,
    "complained": 0,
    "delayed": 14,
    "suppressed": 3,
    "failed": 0,
    "unsubscribed": 4,
    "opens": 1630,
    "machine_opens": 402,
    "unique_opens": 702,
    "unique_human_opens": 455,
    "clicks": 233,
    "bot_clicks": 41,
    "unique_clicks": 160,
    "unique_human_clicks": 131,
    "delivery_rate": 0.99,
    "bounce_rate": 0.0059,
    "soft_bounce_rate": 0.0042,
    "complaint_rate": 0,
    "open_rate": 0.383,
    "raw_open_rate": 0.591,
    "click_rate": 0.1103,
    "click_to_open_rate": 0.2879,
    "unsubscribe_rate": 0.0034
  }
}
```

### Response fields

| Name | Type | Required | Description |
|---|---|---|---|
| `object` | string | Yes | Object type. |
| `has_more` | boolean | No | Whether another page exists. |
| `data` | object[] | Yes | Items of this page. |
| `data[].url` | string | Yes | Public `https` URL that receives the events. |
| `data[].clicks` | integer | Yes | — |
| `data[].bot_clicks` | integer | Yes | — |
| `data[].unique_clicks` | integer | Yes | — |
| `data[].unique_human_clicks` | integer | Yes | — |
| `data[].last_clicked_at` | string | Yes | Timestamp in UTC. |
| `totals` | object | Yes | — |

## Errors

Errors have the shape `{"statusCode", "name", "message"}`. See [Errors](https://docs.pidgely.com/errors/) for the full list.

| Status | Name | When |
|---|---|---|
| 401 | `missing_api_key`, `restricted_api_key` | No `Authorization: Bearer` header, or a `sending_access` key called an endpoint that needs `full_access`. |
| 403 | `invalid_api_key`, `validation_error` | The API key is invalid or revoked, or the request is not allowed for this account (unverified domain, plan limit, paused account). |
| 422 | `validation_error` | A field is missing or invalid; `message` names it. |
| 429 | `rate_limit_exceeded` | Too many requests per second. Wait for `Retry-After` seconds. |
