Skip to main content
Scope: secret key (lk_) for every links endpoint. Per-link performance for a time window, sorted by revenue. Paid plans.

Query parameters

integer
default:"30"
Last N days ending now (1–365). Alternative to from/to.
string (ISO 8601)
Start of an explicit window [from, to).
string (ISO 8601)
End of the window; defaults to now.
integer
default:"100"
Maximum links to return (max 500). Ignored when ids is set.
string
Comma-separated link UUIDs (max 500). Returns exactly those links — every one that belongs to your workspace, including links with no activity in the window (as zeros). Unknown ids and other workspaces’ ids are left out. Each row also carries external_id. A malformed id, or more than 500, is a 400.
string
include=settings attaches each link’s full link record under settings.

Response

object
The resolved { from, to } window.
One row per link, sorted by revenue descending: link_id, slug, channel, destination, clicks, visitors, conversions, revenue — plus external_id when ids is used.
Stats for the links you already know

Records — GET /api/v1/links?view=records

The links themselves, newest first, with no reporting window. Available on every plan.
integer
default:"100"
Page size (max 500).
string (ISO 8601)
Pass the previous response’s next_cursor to fetch the next page.
string
Only links on this channel (x is accepted for twitter).
string (uuid)
Only the links of one campaign.
string
Substring match on the slug.
string
Exact match on the external_id you set when creating the link.
Response: { "links": [LinkRecord], "next_cursor": "<iso>" | null }.

Create — POST /api/v1/links

Creates a campaign — one destination and one link per channel, or a single Smart Link — or adds links to an existing campaign. Returns 201 with every link created. Available on every plan (the Free tier’s link cap applies).

Body

string
required
The destination (https://…). Not needed — and ignored — with destination_id.
string
required
The campaign name. Not needed — and ignored — with destination_id.
string
One channel. Use channels for several, or smart: true for one Smart Link.
string[]
Several channels — one link each.
boolean
One Smart Link whose channel is inferred per click from the referer.
string
Your own id for the link (1–200 characters, matched exactly) — e.g. the id of the social post it was published in. Unique per workspace: if a link with this external_id already exists, the response is 200 with { destination_id, links: [thatLink] } and nothing is created, so retrying a create is always safe. Only allowed when the request creates exactly one link (one channel, or smart: true); otherwise 400.
object
Any JSON object (at most 4 KB serialized), stored on the link and returned with it.
string (uuid)
Add the link(s) to this existing campaign instead of creating a new one (404 if it isn’t in your workspace). The campaign keeps its URL, name, tags and folder; per-link settings you don’t send (campaign, targeting, expiry, password, retargeting) are inherited from its existing links. A campaign has one link per channel — a second link on the same channel needs a distinct external_id (otherwise 409), which is how one post published to two LinkedIn pages gets two links. If a custom slug is already used by that channel’s first link, the new one is numbered (launch-linkedin-2).
string
utm_campaign for the links. Defaults to the campaign name.
string
Custom slug: verbatim for one link, <slug>-<channel> for several. 409 if taken.
boolean
The destination is on a platform you don’t own (YouTube, Substack…). Own-site destinations must share the workspace’s one domain; set this for anything else.
Also accepted, as in the dashboard form: tags, targeting ({ mobile, desktop }), expires_at, max_clicks, expired_redirect_url, password, retargeting, folder_id.

Idempotency

Send an Idempotency-Key header (1–200 printable characters) to make any create safe to retry: Keys are scoped to your workspace and expire after 24 hours. Body key order doesn’t matter.

Channels

facebook, instagram, youtube, linkedin, twitter (send x or twitter), tiktok, newsletter, website, other, and the social networks threads, bluesky, mastodon, pinterest, reddit, telegram, discord, tumblr, google_business, nostr, lemmy, slack, devto. Each sets utm_source to its key and utm_medium to social (local for google_business). The same keys work in bulk import.
Every endpoint that returns a link (create, records view, include=settings, GET/PATCH /api/v1/links/:id) uses the shape above. external_id and metadata are null for links created without them.