Short Links API
Branded short URLs for messages and campaigns. By default links resolve on the platform host (https://api.orbit.devotel.io/l/abc123); configure a vanity domain in Settings → General to mint links on your own host instead (e.g. https://go.yourbrand.com/abc123). The redirect handler (GET /l/:code) is mounted at the root of the API host and is rate-limited to 60 req/min per IP. Click data is captured asynchronously and exposed via the stats endpoint.
Base path: /api/v1/links (management) — public redirect at https://api.orbit.devotel.io/l/{code}
Authentication: API key (X-API-Key) or session JWT for management; the redirect itself is anonymous.
Envelope: Like every management endpoint, responses are wrapped as { "data": { … }, "meta": { "request_id": "…", "timestamp": "…" } }. The examples below show the data payload.
Using the SDKs
client.request() escape hatch above. See the Python SDK.
Returns the typed ApiResponse envelope. See the SDK index at SDK quickstart.
Default short-link host & branded domains
Every short link resolves through the redirect handler atGET /l/{code}. The host a link is minted on is resolved in this order:
- Your tenant’s branded short-link domain, if you’ve set one under Settings → General → Branded short-link domain. It must be a bare
https://host with no path, query, or fragment (for examplehttps://go.yourbrand.com) whose DNS is CNAME’d to Orbit’s redirector. A malformed value falls back to the platform default rather than blocking the send. - The platform default host —
https://api.orbit.devotel.io— used for every tenant that hasn’t configured a branded domain.
https://api.orbit.devotel.io/l/abc123, while a tenant on go.yourbrand.com gets https://go.yourbrand.com/l/abc123. Both terminate TLS and serve the same redirect.
The platform default is
api.orbit.devotel.io. Set a per-tenant branded domain if you want short, recognisable links your recipients trust.Operator configuration
Self-hosting operators choose the platform default short-link host through environment variables. Per-tenant branded domains always take precedence over both.Example — shorten a URL
short_url — on your branded host when one is configured, otherwise on the platform default. Embed short_url directly in outbound messages.
Insights
GET /api/v1/links/insights returns tenant-wide URL-shortener analytics in a single call: summary KPIs, the top links ranked by clicks, and a per-day click timeline. All parameters are optional.
verified_* counts pass a bot/preview filter, so the verified count is a strict human-only subset of the raw count (never larger). An empty tenant returns zeroed KPIs, an empty top_links array, and an empty timeline.
In the dashboard: the same aggregates power the cross-channel Insights → Link tracking page, and the SMS workspace surfaces a Link click-throughs panel (clicks, verified human clicks, tracked links, average per link over the last 7 days) alongside its delivery and cost metrics — so the messages where shortening is enabled have their click figures on the channel view itself.
Per-campaign link analytics
GET /api/v1/links/campaigns/{campaignId}/link-analytics rolls every tracked link minted for one SMS campaign into a single rollup: totals (minted links, raw clicks, verified human-only clicks, unique clicker recipients, attributed recipients, and the derived attribution rates), a per-channel breakdown, and a top-links ranking where each row carries its resolved short URL. A campaign with no shortened links reports zeroed totals — never a misleading or NaN rate.
by_channel array, and an empty top_links array; both attribution rates report 0 (never a NaN or misallocated rate):
window_days or top_limit are clamped to the bounds above rather than rejected.
Per-contact clicks
GET /api/v1/links/contacts/{contactId}/clicks resolves tracked short-link clicks back to a single recipient contact and returns the click history newest-first — useful for surfacing per-contact engagement in the CDP.
code, original_url, campaign_id, message_id) plus the click’s country and clicked_at. IP and user-agent are intentionally omitted here — the per-link stats endpoint is the device-forensics view; this history is the per-contact engagement view the Contacts detail page consumes for the CDP engagement panel.
Turn clickers into a retargetable segment
The same click attribution powers a one-shot audience builder:POST /api/v1/segments/from-clicks resolves the distinct recipient contacts who clicked a tracked short link (or any link in a campaign) and materialises them as a static, retargetable segment — with an optional recency window. See Segments for the request shape.
Landing Pages
No-code landing pages (microsites) are built from a block list and served under the same/links base path. A published page mints a trackable short URL and rolls up per-page visits and conversions by campaign and by originating message.
Create a draft, then publish it to mint the trackable short URL:
short_url yet — it stays null until the page is published:
status filter (draft, published, archived) alongside the standard cursor / limit pagination params. The analytics endpoint /api/v1/links/landing-pages/{id}/analytics accepts top_limit (1–50, default 10) to bound the per-campaign and per-message breakdowns:
totals with all three breakdown arrays empty.
See also
- Goal Tracking — pair clicks with conversions for attribution