Stats API

Read LinkTrail analytics over the REST API: overview KPIs with match quality, daily timeseries, breakdowns by dimension, monthly channels and events.

Note

Every endpoint on this page needs Authorization: Bearer <accessToken> and X-Workspace-Id: <id> — see Authentication. Paths are relative to https://backend.linktrail.io/v1.

MethodPathWhat it does
GET/stats/overview?range=KPIs and deltas against the previous period
GET/stats/timeseries?metric=&range=Clicks or installs per day
GET/stats/breakdown?dimension=&range=Totals grouped by a dimension
GET/stats/channels/monthly?range=Monthly totals by channel bucket
GET/stats/activeClicks in the last five minutes and the last hour
GET/stats/events?range=Post-install events by name, with revenue

Any member can read stats. range is one of 7d, 30d, 90d, 6m, 12m or 24m, and a range longer than the plan keeps history for answers 402: 7d and 30d work on every plan, 90d needs Starter, 6m and 12m need Growth, and 24m needs Scale. Each endpoint has a default range — 7d for overview, 90d for channels/monthly, 30d for the rest — so channels/monthly without a range answers 402 on Free. overview, timeseries, breakdown and channels/monthly also take linkId to scope the figures to one link.

Overview

GET /v1/stats/overview?range=30d → 200JSON
{ "clicks": 128400, "installs": 8220, "attributedInstalls": 5918, "cvr": "6.4%",
  "reengagements": 420, "fraudRate": "1.2%", "events": 3120, "revenue": 48230.5,
  "revenueByCurrency": [ { "currency": "USD", "amount": 40110.25, "events": 1502 },
                         { "currency": "EUR", "amount": 7900.25, "events": 290 },
                         { "currency": null, "amount": 220, "events": 11 } ],
  "fraudReasons": [ { "reason": "ctit_too_short", "count": 74 }, { "reason": "geo_mismatch", "count": 21 } ],
  "deltas": { "clicks": "+12.4%", "installs": "+4.1%", "attributedInstalls": "-1.2%", "cvr": "+0.8%" } }
  • The overview also carries matchQuality — how each install was attributed: { "deterministic": 128, "probabilistic": 0, "unattributed": 14 }. Deterministic is a click-token match; probabilistic is IP and platform, only when that matching is switched on.
  • revenueByCurrency splits revenue by each event's currency, with no conversion. currency: null groups events sent with a value but no currency. Show revenue as money only when there is at most one currency.
  • Count deltas are the percentage change against the previous period of the same length; the cvr delta is in percentage points.

Timeseries, breakdowns and events

GET /v1/stats/timeseries?metric=installs&range=7d → 200JSON
[ { "date": "2026-06-22", "value": 1830 } ]
GET /v1/stats/breakdown?dimension=campaign&range=30d → 200JSON
[ { "key": "Summer Sale", "clicks": 48000, "installs": 3300, "cvr": "6.9%" } ]
GET /v1/stats/events?range=30d → 200JSON
[ { "name": "purchase", "count": 1820, "revenue": 48230.5, "revenueByCurrency": [ { "currency": "USD", "amount": 40110.25, "events": 1502 }, { "currency": "EUR", "amount": 8120.25, "events": 301 } ] } ]

metric is clicks or installs, one zero-filled entry per UTC day. dimension is campaign, channel, geo, device or platform, sorted by installs. Events are sorted by count.