Tracking links
The tracked links of a campaign's emails.
List a campaign's tracking links in the current workspace
/v1/campaigns/{campaignId}/tracking-linkstracking-links.listOrdered by id. Read-only. Requires ReadAccess.
Parameters
400 workspace_required).Response 200
data is a list of TrackingLinkModel. Each item has these fields. The response also carries pagination.
curl -X GET "https://api.ken.so/v1/campaigns/812/tracking-links?limit=1" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": [
{
"id": 812,
"campaignId": 812,
"name": "string",
"domainName": "string",
"textValue": "string",
"createdAt": "2026-09-23T15:02:11Z",
"createdBy": 1,
"modifiedAt": "2026-09-23T15:02:11Z",
"modifiedBy": 1
}
],
"pagination": {
"nextCursor": "eyJpZCI6ODE1fQ",
"hasMore": true,
"total": 1,
"isTotalCapped": true
}
}Create a tracking link on a campaign in the current workspace
/v1/campaigns/{campaignId}/tracking-linkstracking-links.createReturns 201 and Location. Requires WriteAccess.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 201
data is a TrackingLinkModel.
curl -X POST "https://api.ken.so/v1/campaigns/812/tracking-links" \
-H "Authorization: Bearer $KEN_API_KEY" \
-H "Ken-Version: 2026-11-02" \
-H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"domainName": "string",
"textValue": "string"
}'{
"success": true,
"data": {
"id": 812,
"campaignId": 812,
"name": "string",
"domainName": "string",
"textValue": "string",
"createdAt": "2026-09-23T15:02:11Z",
"createdBy": 1,
"modifiedAt": "2026-09-23T15:02:11Z",
"modifiedBy": 1
}
}Return one tracking link in the current workspace
/v1/tracking-links/{trackingLinkId}tracking-links.getA missing or cross-workspace id is not_found. Requires ReadAccess.
Parameters
400 workspace_required).Response 200
data is a TrackingLinkModel.
curl -X GET "https://api.ken.so/v1/tracking-links/812" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
{
"success": true,
"data": {
"id": 812,
"campaignId": 812,
"name": "string",
"domainName": "string",
"textValue": "string",
"createdAt": "2026-09-23T15:02:11Z",
"createdBy": 1,
"modifiedAt": "2026-09-23T15:02:11Z",
"modifiedBy": 1
}
}Update a tracking link
/v1/tracking-links/{trackingLinkId}tracking-links.updateAbsent fields stay unchanged. JSON null clears textValue. Requires WriteAccess. A new domainName goes through the URL reputation check, and changing it after mail with the link went out counts against a daily cap (429 rate_limited with Retry-After once UrlReputation:Mode is Enforce). A new domainName on a link served from a Kenso shared tracking host is 409 shared_host_link_frozen, and off a paid plan 402 plan_limit_reached (refusal.codelink_edit_requires_paid_plan), when Redirects:LinkEdits:Mode is Enforce.
Parameters
400 workspace_required).Request body
application/json, optional.
Response 200
data is a TrackingLinkModel.
curl -X PATCH "https://api.ken.so/v1/tracking-links/812" \
-H "Authorization: Bearer $KEN_API_KEY" \
-H "Ken-Version: 2026-11-02" \
-H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"domainName": "string",
"textValue": "string"
}'{
"success": true,
"data": {
"id": 812,
"campaignId": 812,
"name": "string",
"domainName": "string",
"textValue": "string",
"createdAt": "2026-09-23T15:02:11Z",
"createdBy": 1,
"modifiedAt": "2026-09-23T15:02:11Z",
"modifiedBy": 1
}
}Soft-delete a tracking link and deactivate the links generated from it
/v1/tracking-links/{trackingLinkId}tracking-links.deleteRequires Delivery edit access (owners, admins and editors by default). Returns 204.
Parameters
400 workspace_required).Response 204
curl -X DELETE "https://api.ken.so/v1/tracking-links/812" \ -H "Authorization: Bearer $KEN_API_KEY" \ -H "Ken-Version: 2026-11-02" \ -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID"
HTTP/1.1 204 No Content