Linkly
MARKETING · MARKETING
Short links, their conversions, custom domains, and webhooks in the account they connected.
Acts as the person, not as itself
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Credentials never touch the agent
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Every call on the record
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
What an agent can do
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
linkly_delete_api_v1_link_by_link_id_webhooks_by_hook_idWRITEStop sending one link's events to a webhook URL. `hook_id` is the webhook URL itself -- pass it exactly as List a link's webhooks returned it, unencoded; this integration percent-encodes it for the wire via DELETE /api/v1/link/{link_id}/webhooks/{hook_id}
linkly_delete_api_v1_workspace_by_workspace_id_domains_by_domain_idWRITERemove a custom domain from a workspace. Every short link already published on that domain STOPS RESOLVING -- this is not a soft delete and there is no restore for it via DELETE /api/v1/workspace/{workspace_id}/domains/{domain_id}
linkly_delete_api_v1_workspace_by_workspace_id_linksWRITEMove one or more links, named by id in the body, to the workspace's trash. Recoverable with Restore links via DELETE /api/v1/workspace/{workspace_id}/links
linkly_delete_api_v1_workspace_by_workspace_id_links_by_idWRITEMove one link to the workspace's trash; recoverable with Restore links. Deleting a link already in the trash is a no-op that still answers 200, while an id absent from the workspace answers 404 via DELETE /api/v1/workspace/{workspace_id}/links/{id}
linkly_delete_api_v1_workspace_by_workspace_id_webhooks_by_hook_idWRITEStop sending a workspace's events to a webhook URL. `hook_id` is the webhook URL itself -- pass it exactly as List a workspace's webhooks returned it, unencoded; this integration percent-encodes it for the wire via DELETE /api/v1/workspace/{workspace_id}/webhooks/{hook_id}
linkly_get_api_v1_conversionsREADList a workspace's recorded conversions -- purchases, signups and custom events attributed to a link -- most recent first via GET /api/v1/conversions
linkly_get_api_v1_get_link_by_idREADRead one link by id without naming its workspace, returned wrapped as `{"link": ...}`. Use Get a link when you have the workspace id via GET /api/v1/get_link/{id}
linkly_get_api_v1_link_by_idREADRead one link in a workspace: destination, short URL, UTM parameters, rules and configuration. Click counts are NOT included -- use Get click analytics for a time series or List links for per-link totals via GET /api/v1/link/{id}
linkly_get_api_v1_link_by_link_id_webhooksREADList the webhook subscriptions attached to one link. Each subscription's id IS its URL -- pass it back verbatim to unsubscribe via GET /api/v1/link/{link_id}/webhooks
linkly_get_api_v1_workspace_by_workspace_id_clicksREADRead a workspace's clicks as a time series, filtered by link, date range, country, browser, platform, referer or ISP, and optionally pivoted. Set `format` to `csv` or `tsv` for a non-JSON export via GET /api/v1/workspace/{workspace_id}/clicks
linkly_get_api_v1_workspace_by_workspace_id_clicks_counters_by_counterREADAggregate a workspace's clicks by one dimension (country, city, platform, referer, link_id, a UTM field and others), ordered by count descending. At most 10,000 groups are returned, while `total` always counts every click -- so a truncated result's `count` values sum to less than `total` via GET /api/v1/workspace/{workspace_id}/clicks/counters/{counter}
linkly_get_api_v1_workspace_by_workspace_id_domainsREADList the custom short-link domains configured on a workspace, which links in that workspace may use as their `domain` via GET /api/v1/workspace/{workspace_id}/domains
linkly_get_api_v1_workspace_by_workspace_id_links_exportREADExport every link in a workspace, as JSON or as CSV. A `csv` export answers with CSV text rather than JSON, which this integration reports under a `raw` key via GET /api/v1/workspace/{workspace_id}/links/export
linkly_get_api_v1_workspace_by_workspace_id_list_linksREADList a workspace's links with their click totals, paginated and sortable, searchable by text and filterable on exact field matches (domain, slug and the five UTM fields). Pass `deleted=true` to list the trash instead via GET /api/v1/workspace/{workspace_id}/list_links
linkly_get_api_v1_workspace_by_workspace_id_webhooksREADList the webhook subscriptions attached to a whole workspace. Each subscription's id IS its URL -- pass it back verbatim to unsubscribe via GET /api/v1/workspace/{workspace_id}/webhooks
linkly_get_api_v1_workspacesREADList every workspace this API key can reach, with its id and name -- the call that supplies the `workspace_id` most other tools take, and the one this integration probes a pasted key with via GET /api/v1/workspaces
linkly_patch_api_v1_workspace_by_workspace_id_domains_by_id_faviconWRITESet the favicon URL a custom domain serves on its redirect pages via PATCH /api/v1/workspace/{workspace_id}/domains/{id}/favicon
linkly_post_api_v1_conversionsWRITEReport a purchase, signup or custom event that happened after someone clicked a Linkly link. Attribution needs the `linkly_cid` the landing page captured; an unattributable conversion answers 202 with `attributed: false` and is DISCARDED rather than stored, so do not retry it. Pass `event_id` to make reporting idempotent via POST /api/v1/conversions
linkly_post_api_v1_domainsWRITEAdd a custom short-link domain to a workspace named in the body. A CNAME record pointing at `domains.linklyhq.com` must already resolve, or Linkly refuses the domain via POST /api/v1/domains
linkly_post_api_v1_linkWRITECreate a short link from `url` plus `workspace_id`, or update an existing one by passing its `id`. Carries custom slugs, UTM parameters, retargeting pixels, Open Graph metadata, expiry and redirect rules via POST /api/v1/link
linkly_post_api_v1_link_by_link_id_webhooksWRITESend this link's events to a URL: a POST for each `click`, plus `link.updated` and `link.deleted`. Branch on the JSON `event` field via POST /api/v1/link/{link_id}/webhooks
linkly_post_api_v1_linksWRITECreate or update up to 1000 links in one request. The body is a JSON ARRAY whose items use the single-link schema -- include `id` to update, omit it to create, and give each item a `workspace_id`. Answers 200 even when some items fail, so inspect each result's own `status` via POST /api/v1/links
linkly_post_api_v1_workspace_by_workspace_id_domainsWRITEAdd a custom short-link domain to the workspace named in the PATH. A CNAME record pointing at `domains.linklyhq.com` must already resolve, or Linkly refuses the domain via POST /api/v1/workspace/{workspace_id}/domains
linkly_post_api_v1_workspace_by_workspace_id_linksWRITECreate a short link in the workspace named in the PATH, or update one by passing its `id`. The same shape as Create or update a link, with the workspace taken from the path instead of the body via POST /api/v1/workspace/{workspace_id}/links
linkly_post_api_v1_workspace_by_workspace_id_links_restoreWRITERestore soft-deleted links by id, rebuilding each short URL from its preserved `full_url`. A link whose short URL has since been taken by a live link is skipped and reported under `conflicts` via POST /api/v1/workspace/{workspace_id}/links/restore
linkly_post_api_v1_workspace_by_workspace_id_webhooksWRITESend every link's events in this workspace to a URL: a POST for each `click`, `link.created`, `link.updated` and `link.deleted`. Branch on the JSON `event` field via POST /api/v1/workspace/{workspace_id}/webhooks
Often connected alongside
Put Linkly behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.