# Dashboard

> Source: https://truto.one/docs/guides/dashboard/overview/

Open **Dashboard** in [app.truto.one](https://app.truto.one/dashboard) to see how much traffic one environment sent through Truto, how much of it failed, and which integrations and accounts it came from.

:::skip-reading{cli="truto analytics dashboard -o json" skill="truto-cli"}
:::

The Dashboard reports on the environment picked in the app's environment selector. Pick another environment to see its numbers. The same data is available from the API and the CLI, so you can pull it into your own reporting.

## Pick a range and filters

Three controls at the top drive the page:

- **Date range**: **This month** (the default), **Last month**, **Last 7 days**, **Last 30 days**, **Last 90 days**, or custom days. Truto keeps 90 days of traffic, so every range ends inside the last 90 days. Days are UTC.
- **Category**: one kind of traffic, such as **Unified API**, **Proxy and custom API**, **MCP**, **Admin API**, **Inbound webhooks**, **Webhook deliveries**, **RapidBridge sync jobs** or **Workflows and actions**. **All categories** is the default.
- **Integration**: one integration, or **All integrations**.

The category and integration filters apply to the charts and lists that support them. The headline numbers, account health and the integrations table always cover the whole environment.

Numbers are cached for up to six hours, so a call you made a minute ago may not show yet.

## What the page shows

| Section | What it tells you |
|---|---|
| Headline numbers | **API calls**, **Active integrations** (of those installed), **Active integrated accounts** (with how many need re-auth or have errors) and **Success rate**. Each tile compares the range with the span of the same length just before it, when Truto still has those days. |
| Account health and **Accounts needing attention** | How many accounts are active, and which integrations have accounts that need re-auth or have a post-install or validation error. |
| **API calls** and **Integration mix** | API calls per day, as a total, by category or by integration, and each integration's share. |
| **Reliability** | **Latency p95** (total time against time spent waiting on the provider; the gap is Truto), **Status codes** (API requests by HTTP status class) and **Errors by integration** (requests that returned HTTP 400 or above). |
| **Activity** | **Records synced** by RapidBridge sync jobs, **New connections**, **Webhook events** (with the share that failed) and **MCP tool calls**. |
| **Integrations** | Every integration with its API calls, share, accounts and accounts that need attention. You can search it and download it as CSV. |
| **Integrated accounts** | Accounts ranked by API calls in the range, with their current status. Search by account ID and load more. |
| **Traffic by hour** | API calls per hour over the last seven days of the range, in UTC. Collapsed until you click **Show**. |

**API calls** counts what billing counts: API requests and the background work they start, without queue events, inbound webhook ingress or requests that failed schema validation. **Success rate** is one minus the error rate, where an error is a request that returned HTTP 400 or above. Background work such as workflows, sync jobs and webhook deliveries has no status code, so it isn't in **Status codes**.

## Fetch the numbers from the API

`GET /analytics/dashboard` returns everything the page shows in one call. An API token reports on its own environment, so `environment_id` is optional with one. Integrated-account and tenant tokens can't read analytics.

| Parameter | Value |
|---|---|
| `environment_id` | The environment. Required when you're signed in with a session. |
| `range` | `mtd`, `last_month`, `7d`, `30d` or `90d`. Defaults to `mtd`. |
| `from`, `to` | A custom range as `YYYY-MM-DD` (UTC, inclusive). Send these or `range`, not both. |
| `filter[category]` | A category ID, such as `unified_api`, `proxy_api`, `mcp`, `admin_api`, `inbound_webhook`, `webhook_delivery`, `sync_job` or `workflow`. |
| `filter[integration]` | An integration name, such as `hubspot`. |
| `accounts_search` | Accounts whose ID starts with this, 1 to 64 characters. |
| `accounts_cursor` | The next page of accounts, from the previous response. |

Any other parameter returns `400`. The response holds `kpis` (each with `value` and `previous`), `integrations`, `status_codes`, `errors_by_integration`, `accounts` (with `rows` and `next_cursor`) and more. A part that can't load right now comes back `null` and is named in `unavailable`, so one slow chart doesn't fail the call. Uncached reads are rate limited per person and environment: past the limit the API returns `429` with `Retry-After: 60`.

:::code-tabs

```bash label="cURL"
curl -g "https://api.truto.one/analytics/dashboard?range=7d&filter[integration]=hubspot" \
  -H "Authorization: Bearer <API token>"
```

```bash label="CLI"
truto analytics dashboard --range 7d --integration hubspot
truto analytics dashboard --from 2026-09-01 --to 2026-09-30 -o json
```

:::

For one metric over time or broken down by a dimension, use `GET /analytics/timeseries` and `GET /analytics/breakdown`. `GET /analytics/metrics` lists the metrics and dimensions they accept, and `GET /analytics/status` returns the days Truto can show and how long responses are cached. See the [Analytics API reference](/docs/api-reference/admin/analytics).

## Next

To find the requests behind a spike in errors, open [Logs](/docs/guides/logs/viewing-logs). To be told about failures as they happen, set up [notifications](/docs/guides/observability/notifications).
