---
title: "Analytics Data API Reference"
description: "Endpoints for retrieving aggregated analytics data for dashboard widgets including geographic breakdown, device distribution, and visitor trends."
canonical: "https://linkbreakers.com/help/api/analytics-data"
---

# Analytics Data

Endpoints for retrieving aggregated analytics data for dashboard widgets including geographic breakdown, device distribution, and visitor trends.

## Analytics Data

## [#](#analytics-data-object)The AttributeValueDataPoint is one value of an attribute with how many visitors hold it object

AttributeValueDataPoint is one value of an attribute with how many visitors hold it

label

string

percentage

number (double)

visitorCount

integer (int32)

Example object

```json
{
  "label": "string",
  "percentage": 0,
  "visitorCount": 0
}
```

POST

`/v1/analytics/attributes/distribution`

Requires auth

## [#](#get-visitor-attribute-distribution)Get visitor attribute distribution

Returns how visitors are spread across the values of one attribute, for example how many gave each rating. Requires the \`analytics:read\` scope.

### [#](#get-visitor-attribute-distribution-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-visitor-attribute-distribution-request)Request body

endDate

string (date-time)

key

string

limit

integer (int32)

Maximum number of values (default 10)

linkId

string

startDate

string (date-time)

### [#](#get-visitor-attribute-distribution-response)Response

200

Everything worked as expected.

data

array<object>

total

integer (int32)

### [#](#get-visitor-attribute-distribution-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/attributes/distribution" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.681Z","key":"string","limit":0,"linkId":"string","startDate":"2026-10-24T05:04:27.681Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.681Z",
  "key": "string",
  "limit": 0,
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.681Z"
}
```

Typical response

```json
{
  "data": [
    {
      "label": "string",
      "percentage": 0,
      "visitorCount": 0
    }
  ],
  "total": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/attributes/metric`

Requires auth

## [#](#get-visitor-attribute-metric)Get visitor attribute metric

Returns count, average, minimum and maximum for a visitor attribute, plus how much of the audience carries it. Requires the \`analytics:read\` scope.

### [#](#get-visitor-attribute-metric-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-visitor-attribute-metric-request)Request body

endDate

string (date-time)

Inclusive end timestamp

key

string

Attribute key, for example "rating"

linkId

string

Optional link filter (UUID). Attributes belong to the visitor rather than to a link, so this filters the audience: visitors who interacted with the link, whatever set the attribute.

startDate

string (date-time)

Inclusive start timestamp

### [#](#get-visitor-attribute-metric-response)Response

200

Everything worked as expected.

audienceCount

integer (int32)

Visitors in the audience, whether or not they have the attribute

averageValue

number (double)

coverageRate

number (double)

Share of the audience carrying the attribute, 0 to 1

maxValue

number (double)

minValue

number (double)

totalCount

integer (int32)

Visitors carrying the attribute at all

usableCount

integer (int32)

Values that parsed as numbers, so the denominator for averages. Lower than total\_count when some values do not match the attribute's declared type.

### [#](#get-visitor-attribute-metric-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/attributes/metric" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.682Z","key":"string","linkId":"string","startDate":"2026-10-24T05:04:27.682Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.682Z",
  "key": "string",
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.682Z"
}
```

Typical response

```json
{
  "audienceCount": 0,
  "averageValue": 0,
  "coverageRate": 0,
  "maxValue": 0,
  "minValue": 0,
  "totalCount": 0,
  "usableCount": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/attributes/values`

Requires auth

## [#](#list-visitor-attribute-values)List visitor attribute values

Returns the individual recorded values of one attribute, most recent first. Intended for free text such as comments. Requires the \`analytics:read\` scope.

### [#](#list-visitor-attribute-values-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#list-visitor-attribute-values-request)Request body

endDate

string (date-time)

key

string

limit

integer (int32)

Maximum number of values (default 50)

linkId

string

startDate

string (date-time)

### [#](#list-visitor-attribute-values-response)Response

200

Everything worked as expected.

data

array<object>

total

integer (int32)

### [#](#list-visitor-attribute-values-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/attributes/values" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.682Z","key":"string","limit":0,"linkId":"string","startDate":"2026-10-24T05:04:27.682Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.682Z",
  "key": "string",
  "limit": 0,
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.682Z"
}
```

Typical response

```json
{
  "data": [
    {
      "recordedAt": "2026-10-24T05:04:27.682Z",
      "value": "string"
    }
  ],
  "total": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/breakdown`

Requires auth

## [#](#get-dimension-breakdown)Get dimension breakdown

Returns a ranked breakdown of events by any dimension (browser, platform, device type, country, city, visit type). Requires the \`analytics:read\` scope.

### [#](#get-dimension-breakdown-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-dimension-breakdown-request)Request body

dimension

string

Dimension to break down by: "browser", "platform", "device\_type", "country", "city", "visit\_type"

endDate

string (date-time)

Inclusive end timestamp

limit

integer (int32)

Maximum number of results (default 10)

linkId

string

Optional link filter (UUID); when omitted aggregates workspace-wide

startDate

string (date-time)

Inclusive start timestamp

### [#](#get-dimension-breakdown-response)Response

200

Everything worked as expected.

data

array<object>

Ordered list of dimension values by event count (descending)

total

integer (int32)

Total number of events in the date range

### [#](#get-dimension-breakdown-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/breakdown" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"dimension":"string","endDate":"2026-10-24T05:04:27.682Z","limit":0,"linkId":"string","startDate":"2026-10-24T05:04:27.682Z"}'
```

Sample payload (application/json)

```json
{
  "dimension": "string",
  "endDate": "2026-10-24T05:04:27.682Z",
  "limit": 0,
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.682Z"
}
```

Typical response

```json
{
  "data": [
    {
      "code": "string",
      "eventCount": 0,
      "label": "string",
      "percentage": 0
    }
  ],
  "total": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/devices`

Requires auth

## [#](#get-device-distribution)Get device distribution

Retrieve event distribution across device types. Requires the \`analytics:read\` scope.

### [#](#get-device-distribution-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-device-distribution-request)Request body

endDate

string (date-time)

Inclusive end timestamp

linkId

string

Optional link filter (UUID); when omitted aggregates workspace-wide

startDate

string (date-time)

Inclusive start timestamp

### [#](#get-device-distribution-response)Response

200

Everything worked as expected.

data

array<object>

Device type breakdown

totalEvents

integer (int32)

Total number of events in the date range

### [#](#get-device-distribution-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/devices" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.682Z","linkId":"string","startDate":"2026-10-24T05:04:27.682Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.682Z",
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.682Z"
}
```

Typical response

```json
{
  "data": [
    {
      "deviceType": "string",
      "eventCount": 0,
      "percentage": 0
    }
  ],
  "totalEvents": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/funnel`

Requires auth

## [#](#get-workflow-step-funnel)Get workflow step funnel

Returns the workflow steps visitors reached, in distinct visitors, ordered from arrival to exit, with the conversion rate and drop-off at each step. Requires the \`analytics:read\` scope.

### [#](#get-workflow-step-funnel-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-workflow-step-funnel-request)Request body

endDate

string (date-time)

Inclusive end timestamp

linkId

string

Optional link filter (UUID); when omitted aggregates workspace-wide

startDate

string (date-time)

Inclusive start timestamp

### [#](#get-workflow-step-funnel-response)Response

200

Everything worked as expected.

completionRate

number (double)

Conversion rate of the final step

entryVisits

integer (int64)

Journeys that arrived; the denominator of every rate

steps

array<object>

Steps in the order a visitor meets them, arrival first

### [#](#get-workflow-step-funnel-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/funnel" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.682Z","linkId":"string","startDate":"2026-10-24T05:04:27.682Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.682Z",
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.682Z"
}
```

Typical response

```json
{
  "completionRate": 0,
  "entryVisits": 0,
  "steps": [
    {
      "branches": [
        {}
      ],
      "conversionRate": 0,
      "dropOffFromPrevious": 0,
      "identifiedVisitors": 0,
      "interactionRate": 0,
      "interactions": 0,
      "occurrences": 0,
      "stepAction": "string",
      "stepKind": "string",
      "visits": 0
    }
  ]
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/geo`

Requires auth

## [#](#get-geographic-breakdown)Get geographic breakdown

Retrieve geographic distribution of events grouped by country or city. Requires the \`analytics:read\` scope.

### [#](#get-geographic-breakdown-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-geographic-breakdown-request)Request body

endDate

string (date-time)

Inclusive end timestamp

groupBy

string

Group by "country" or "city"

limit

integer (int32)

Maximum number of results (default 10)

linkId

string

Optional link filter (UUID); when omitted aggregates workspace-wide

startDate

string (date-time)

Inclusive start timestamp

### [#](#get-geographic-breakdown-response)Response

200

Everything worked as expected.

data

array<object>

Ordered list of locations by event count (descending)

totalEvents

integer (int32)

Total number of events in the date range

### [#](#get-geographic-breakdown-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/geo" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.684Z","groupBy":"string","limit":0,"linkId":"string","startDate":"2026-10-24T05:04:27.684Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.684Z",
  "groupBy": "string",
  "limit": 0,
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.684Z"
}
```

Typical response

```json
{
  "data": [
    {
      "eventCount": 0,
      "location": "string",
      "percentage": 0
    }
  ],
  "totalEvents": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/hours`

Requires auth

## [#](#get-hour-of-day-distribution)Get hour of day distribution

Retrieve event counts aggregated by hour of day for identifying peak activity times. Requires the \`analytics:read\` scope.

### [#](#get-hour-of-day-distribution-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-hour-of-day-distribution-request)Request body

endDate

string (date-time)

linkId

string

Optional link filter (UUID); when omitted aggregates workspace-wide

startDate

string (date-time)

### [#](#get-hour-of-day-distribution-response)Response

200

Everything worked as expected.

data

array<object>

totalEvents

integer (int32)

### [#](#get-hour-of-day-distribution-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/hours" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.684Z","linkId":"string","startDate":"2026-10-24T05:04:27.684Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.684Z",
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.684Z"
}
```

Typical response

```json
{
  "data": [
    {
      "eventCount": 0,
      "hour": 0
    }
  ],
  "totalEvents": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/timeseries`

Requires auth

## [#](#get-grouped-time-series)Get grouped time series

Retrieve time-bucketed event counts grouped by a dimension like country, city, device type, or visit type. Requires the \`analytics:read\` scope.

### [#](#get-grouped-time-series-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-grouped-time-series-request)Request body

endDate

string (date-time)

groupBy

string (enum)

GroupByDimension defines the available dimensions for grouping analytics data. Add new dimensions here as the platform grows.

##### Allowed values

`GROUP_BY_DIMENSION_UNSPECIFIED`

`GROUP_BY_DIMENSION_COUNTRY`

`GROUP_BY_DIMENSION_CITY`

`GROUP_BY_DIMENSION_DEVICE_TYPE`

`GROUP_BY_DIMENSION_VISIT_TYPE`

`GROUP_BY_DIMENSION_BROWSER`

`GROUP_BY_DIMENSION_PLATFORM`

intervalInMinutes

integer (int32)

limit

integer (int32)

Max number of groups to return (top N by volume). Default 5.

linkId

string

Optional link filter (UUID); when omitted aggregates workspace-wide

startDate

string (date-time)

### [#](#get-grouped-time-series-response)Response

200

Everything worked as expected.

series

array<object>

totalEvents

integer (int32)

Total events across all series

### [#](#get-grouped-time-series-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/timeseries" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.684Z","groupBy":"GROUP_BY_DIMENSION_UNSPECIFIED","intervalInMinutes":0,"limit":0,"linkId":"string","startDate":"2026-10-24T05:04:27.684Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.684Z",
  "groupBy": "GROUP_BY_DIMENSION_UNSPECIFIED",
  "intervalInMinutes": 0,
  "limit": 0,
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.684Z"
}
```

Typical response

```json
{
  "series": [
    {
      "label": "string",
      "points": [
        {}
      ]
    }
  ],
  "totalEvents": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/top-links`

Requires auth

## [#](#get-top-performing-links)Get top performing links

Retrieve links ranked by event count for identifying best performing QR codes and links. Requires the \`analytics:read\` scope.

### [#](#get-top-performing-links-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-top-performing-links-request)Request body

endDate

string (date-time)

limit

integer (int32)

Max number of links to return (default 10)

linkId

string

Optional link filter (UUID); when omitted aggregates workspace-wide

startDate

string (date-time)

### [#](#get-top-performing-links-response)Response

200

Everything worked as expected.

data

array<object>

totalEvents

integer (int32)

### [#](#get-top-performing-links-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/top-links" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.684Z","limit":0,"linkId":"string","startDate":"2026-10-24T05:04:27.684Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.684Z",
  "limit": 0,
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.684Z"
}
```

Typical response

```json
{
  "data": [
    {
      "eventCount": 0,
      "name": "string",
      "shortlink": "string"
    }
  ],
  "totalEvents": 0
}
```

Base URL: `https://api.linkbreakers.com`

POST

`/v1/analytics/visitors`

Requires auth

## [#](#get-visitor-trends)Get visitor trends

Retrieve new vs returning visitor counts over time. Requires the \`analytics:read\` scope.

### [#](#get-visitor-trends-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

Makes retrying this request safe. See components.parameters.IdempotencyKey.

### [#](#get-visitor-trends-request)Request body

endDate

string (date-time)

Inclusive end timestamp

intervalInMinutes

integer (int32)

Bucket size in minutes (e.g. 60 for hourly, 1440 for daily)

linkId

string

Optional link filter (UUID); when omitted aggregates workspace-wide

startDate

string (date-time)

Inclusive start timestamp

### [#](#get-visitor-trends-response)Response

200

Everything worked as expected.

data

array<object>

Time-bucketed visitor trend data

totalNew

integer (int32)

Total new visitors in the range

totalReturning

integer (int32)

Total returning visitors in the range

### [#](#get-visitor-trends-error)Error response

400-599

All endpoints may return an unexpected error payload when a request cannot be processed.

error

object

Required

Wrapped error response.

Example request (cURL)

```bash
curl -X POST "https://api.linkbreakers.com/v1/analytics/visitors" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"endDate":"2026-10-24T05:04:27.684Z","intervalInMinutes":0,"linkId":"string","startDate":"2026-10-24T05:04:27.684Z"}'
```

Sample payload (application/json)

```json
{
  "endDate": "2026-10-24T05:04:27.684Z",
  "intervalInMinutes": 0,
  "linkId": "string",
  "startDate": "2026-10-24T05:04:27.684Z"
}
```

Typical response

```json
{
  "data": [
    {
      "newVisitorCount": 0,
      "returningVisitorCount": 0,
      "timestamp": "2026-10-24T05:04:27.684Z"
    }
  ],
  "totalNew": 0,
  "totalReturning": 0
}
```

Base URL: `https://api.linkbreakers.com`

Cookies

We use cookies to measure our ads with Meta and Google. Our own analytics are cookie-free and run either way. [Privacy statement](https://linkbreakers.com/privacy#cookies)

---

Source: https://linkbreakers.com/help/api/analytics-data
