lk_) for every links endpoint.
Performance — GET /api/v1/links
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.array
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.{ "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.
tags, targeting ({ mobile, desktop }),
expires_at, max_clicks, expired_redirect_url, password, retargeting, folder_id.
Idempotency
Send anIdempotency-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.
The link record
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.
