API reference · Metrics
List clicks per link
GET
https://api.pidgely.com/metrics/linksThe 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 yet; call it over HTTP.
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
{
"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 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. |