---
title: "Analytics Dashboard API Reference"
description: "Endpoints for managing analytics dashboards with flexible, config-driven widgets. Each widget defines its own data source and visualization."
canonical: "https://linkbreakers.com/help/api/analytics-dashboard"
---

# Analytics Dashboard

Endpoints for managing analytics dashboards with flexible, config-driven widgets. Each widget defines its own data source and visualization.

## Analytics Dashboard

## [#](#analytics-dashboard-object)The ChatDisplayMessage is a user-visible chat message for rendering in the UI object

ChatDisplayMessage is a user-visible chat message for rendering in the UI

id

string

sender

string

"user" or "assistant"

text

string

timestamp

string (date-time)

Example object

```json
{
  "id": "string",
  "sender": "string",
  "text": "string",
  "timestamp": "2026-10-25T13:17:43.727Z"
}
```

GET

`/v1/analytics/dashboards`

Requires auth

## [#](#list-analytics-dashboards)List analytics dashboards

Requires the \`analytics:read\` scope.

### [#](#list-analytics-dashboards-parameters)Parameters

#### query parameters

linkId

string

query

Restricts the result to the dashboard scoped to this link. Takes precedence over scope when both are set.

scope

string

query

Restricts the result by scope. Unset returns every dashboard.

##### Allowed values

`DASHBOARD_SCOPE_UNSPECIFIED`

Every dashboard in the workspace, link-scoped or not.

`DASHBOARD_SCOPE_WORKSPACE`

Only the workspace-wide dashboard, the one with no link.

`DASHBOARD_SCOPE_LINK`

Only dashboards tied to a link.

pageSize

integer (int64)

query

Maximum number to return. Defaults to 100, capped at 1000.

pageToken

string

query

Cursor from a previous response's next\_page\_token. Empty starts at the first page. Pages are ordered by (created\_at, id), which never change, so a record cannot move between pages while a client is walking them.

cursor

string

query

Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.

### [#](#list-analytics-dashboards-response)Response

200

Everything worked as expected.

dashboards

array<object>

nextPageToken

string

Cursor to continue listing dashboards. Empty on the last page.

totalCount

integer (int64)

How many records exist in total, so a client can tell a complete answer from a page of one. A local-first client reads absence from this list as deletion, and may only do so when the count it was given matches what it received: without that, one page would look like the whole model and everything beyond it would be removed locally.

### [#](#list-analytics-dashboards-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 GET "https://api.linkbreakers.com/v1/analytics/dashboards?linkId={linkId}&scope={scope}&pageSize={pageSize}&pageToken={pageToken}&cursor={cursor}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "dashboards": [
    {
      "chatMessages": [
        {}
      ],
      "config": {
        "gridColumns": 0,
        "widgets": []
      },
      "createdAt": "2026-10-25T13:17:43.711Z",
      "id": "string",
      "linkId": "string",
      "name": "string",
      "updatedAt": "2026-10-25T13:17:43.711Z"
    }
  ],
  "nextPageToken": "string",
  "totalCount": 0
}
```

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

GET

`/v1/analytics/dashboards/{dashboardId}/widgets/{widgetId}/summary`

Requires auth

## [#](#get-a-stored-widget-assistant-summary)Get a stored widget assistant summary

Returns the last generated analysis, and whether the underlying values have changed since. Requires the \`analytics:read\` scope.

### [#](#get-a-stored-widget-assistant-summary-parameters)Parameters

#### path parameters

dashboardId

string

Required

path

widgetId

string

Required

path

### [#](#get-a-stored-widget-assistant-summary-response)Response

200

Everything worked as expected.

result

object

AnalyticsWidgetResult is a generated result for an on-demand widget tab.

### [#](#get-a-stored-widget-assistant-summary-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 GET "https://api.linkbreakers.com/v1/analytics/dashboards/{dashboardId}/widgets/{widgetId}/summary" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{
  "result": {
    "currentCount": 0,
    "generatedAt": "2026-10-25T13:17:43.715Z",
    "sourceCount": 0,
    "stale": false,
    "text": "string",
    "widgetId": "string"
  }
}
```

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

POST

`/v1/analytics/dashboards`

Requires auth

## [#](#create-analytics-dashboard)Create analytics dashboard

Requires the \`analytics:write\` scope.

### [#](#create-analytics-dashboard-parameters)Parameters

#### header parameters

Idempotency-Key

string

header

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

### [#](#create-analytics-dashboard-request)Request body

config

object

DashboardConfig is the structured configuration for a dashboard

id

string

Client-supplied dashboard id. Generated server-side when empty.

linkId

string

Link to scope this dashboard to. Empty creates the workspace-wide dashboard.

name

string

Display name. Defaults to "Default Dashboard" when empty.

useDefaultWidgets

boolean

Fill the dashboard with a starter set instead of leaving it empty, for a dashboard made in one step rather than agreed in a conversation. Without link\_id it is the workspace set (scans over time, top links, geography, technology and more). With link\_id it is the link set: scans over time, geography, technology, peak hours, and new versus returning visitors, which is everything any link records. The service applies it to any link; whether it suits one is the caller's judgement, since a workflow that collects answers deserves widgets for them. Ignored when config is set, and hidden from the assistant, which agrees its widgets with the user and would otherwise stack them on top of these.

### [#](#create-analytics-dashboard-response)Response

200

Everything worked as expected.

dashboard

object

AnalyticsDashboard represents a workspace's analytics dashboard

### [#](#create-analytics-dashboard-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/dashboards" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"config":{"gridColumns":0,"widgets":[{"dataSource":{},"id":"string","position":{},"size":{},"title":"string","visualization":{}}]},"id":"string","linkId":"string","name":"string","useDefaultWidgets":false}'
```

Sample payload (application/json)

```json
{
  "config": {
    "gridColumns": 0,
    "widgets": [
      {
        "dataSource": {},
        "id": "string",
        "position": {},
        "size": {},
        "title": "string",
        "visualization": {}
      }
    ]
  },
  "id": "string",
  "linkId": "string",
  "name": "string",
  "useDefaultWidgets": false
}
```

Typical response

```json
{
  "dashboard": {
    "chatMessages": [
      {
        "id": "string",
        "sender": "string",
        "text": "string",
        "timestamp": "2026-10-25T13:17:43.715Z"
      }
    ],
    "config": {
      "gridColumns": 0,
      "widgets": [
        {}
      ]
    },
    "createdAt": "2026-10-25T13:17:43.715Z",
    "id": "string",
    "linkId": "string",
    "name": "string",
    "updatedAt": "2026-10-25T13:17:43.715Z"
  }
}
```

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

POST

`/v1/analytics/dashboards/{dashboardId}/widgets/{widgetId}/summary`

Requires auth

## [#](#generate-a-widget-assistant-summary)Generate a widget assistant summary

Analyses the widget's current values and stores the result. Consumes platform credits, so it runs only when requested. Requires the \`analytics:write\` scope.

### [#](#generate-a-widget-assistant-summary-parameters)Parameters

#### path parameters

dashboardId

string

Required

path

Dashboard holding the widget

widgetId

string

Required

path

Widget whose values should be analysed

#### header parameters

Idempotency-Key

string

header

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

### [#](#generate-a-widget-assistant-summary-request)Request body

force

boolean

Regenerate even when the stored result is still current

### [#](#generate-a-widget-assistant-summary-response)Response

200

Everything worked as expected.

result

object

AnalyticsWidgetResult is a generated result for an on-demand widget tab.

### [#](#generate-a-widget-assistant-summary-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/dashboards/{dashboardId}/widgets/{widgetId}/summary" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"force":false}'
```

Sample payload (application/json)

```json
{
  "force": false
}
```

Typical response

```json
{
  "result": {
    "currentCount": 0,
    "generatedAt": "2026-10-25T13:17:43.715Z",
    "sourceCount": 0,
    "stale": false,
    "text": "string",
    "widgetId": "string"
  }
}
```

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

PUT

`/v1/analytics/dashboards/{id}`

Requires auth

## [#](#update-analytics-dashboard)Update analytics dashboard

Requires the \`analytics:write\` scope.

### [#](#update-analytics-dashboard-parameters)Parameters

#### path parameters

id

string

Required

path

ID of the dashboard to update.

#### header parameters

Idempotency-Key

string

header

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

### [#](#update-analytics-dashboard-request)Request body

config

object

DashboardConfig is the structured configuration for a dashboard

name

string

### [#](#update-analytics-dashboard-response)Response

200

Everything worked as expected.

dashboard

object

AnalyticsDashboard represents a workspace's analytics dashboard

### [#](#update-analytics-dashboard-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 PUT "https://api.linkbreakers.com/v1/analytics/dashboards/{id}" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Idempotency-Key: string" \
  -H "Content-Type: application/json" \
  --data '{"config":{"gridColumns":0,"widgets":[{"dataSource":{},"id":"string","position":{},"size":{},"title":"string","visualization":{}}]},"name":"string"}'
```

Sample payload (application/json)

```json
{
  "config": {
    "gridColumns": 0,
    "widgets": [
      {
        "dataSource": {},
        "id": "string",
        "position": {},
        "size": {},
        "title": "string",
        "visualization": {}
      }
    ]
  },
  "name": "string"
}
```

Typical response

```json
{
  "dashboard": {
    "chatMessages": [
      {
        "id": "string",
        "sender": "string",
        "text": "string",
        "timestamp": "2026-10-25T13:17:43.716Z"
      }
    ],
    "config": {
      "gridColumns": 0,
      "widgets": [
        {}
      ]
    },
    "createdAt": "2026-10-25T13:17:43.716Z",
    "id": "string",
    "linkId": "string",
    "name": "string",
    "updatedAt": "2026-10-25T13:17:43.716Z"
  }
}
```

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

DELETE

`/v1/analytics/dashboards/{id}`

Requires auth

## [#](#delete-analytics-dashboard)Delete analytics dashboard

Delete a dashboard and its associated assistant conversation. Requires the \`analytics:write\` scope.

### [#](#delete-analytics-dashboard-parameters)Parameters

#### path parameters

id

string

Required

path

### [#](#delete-analytics-dashboard-response)Response

200

Everything worked as expected.

No structured schema available for this section.

### [#](#delete-analytics-dashboard-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 DELETE "https://api.linkbreakers.com/v1/analytics/dashboards/{id}" \
  -H "Authorization: Bearer YOUR_TOKEN"
```

Typical response

```json
{}
```

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

Cookies

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

---

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