> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fuseai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Analytics

> Read the same roll-ups the Fuse dashboards show — campaigns, dialer, enrichment, website intent and agents

Five endpoints return the numbers behind the Fuse insights tabs. They are read-only, cost no credits, and each covers one area.

They need a key with the `analytics` [scope](/concepts/scopes).

| Endpoint                                 | Covers                                            |
| ---------------------------------------- | ------------------------------------------------- |
| `GET /business/analytics/campaigns`      | Email and LinkedIn volume, replies and engagement |
| `GET /business/analytics/dialer`         | Call volume, connects and outcomes                |
| `GET /business/analytics/enrichment`     | Emails and phones enriched over time              |
| `GET /business/analytics/website-intent` | Visits, companies and people seen on your site    |
| `GET /business/analytics/agents`         | What your agents have delivered                   |

## Pick a window

Every endpoint takes one optional `range`:

| `range` | Window                 |
| ------- | ---------------------- |
| `7d`    | Last 7 days            |
| `30d`   | Last 30 days (default) |
| `90d`   | Last 90 days           |

```bash theme={null}
curl -G https://api.tryfuse.ai/api/v1/business/analytics/website-intent \
  --data-urlencode "range=7d" \
  -u "$FUSE_API_KEY:"
```

```json theme={null}
{
  "range": "7d",
  "metrics": {
    "totalVisits": 1518,
    "uniqueCompanies": 182,
    "uniquePeople": 47,
    "highConfidenceVisits": 206
  },
  "timeSeries": [{ "date": "08/18", "companies": 76, "people": 13 }]
}
```

The `range` you asked for is echoed back, so a stored response is self-describing.

## The shape of a response

Each endpoint returns one or more **panels**. A panel is either a set of summary cards or a time series, and the response always names the range it covers.

```json theme={null}
{
  "range": "30d",
  "agents": {
    "totals": {
      "totalAgents": 6,
      "activeAgents": 4,
      "totalProspects": 480,
      "peopleProspects": 310,
      "companyProspects": 170
    },
    "byType": [{ "monitorType": "job_postings", "prospects": 210 }]
  }
}
```

<Note>
  A panel can come back `null`. Each one is computed independently, so a slow or unavailable source degrades that panel rather than failing the whole call. Treat `null` as "not available for this window", not as zero — and read a missing panel differently from an empty one.
</Note>

## Buckets in a time series

Series are bucketed by the window, and the bucket is named in the payload rather than implied:

```json theme={null}
{
  "emailsEnriched": {
    "totalSince": 644,
    "mode": "week",
    "series": [{ "date": "W30", "total": 5 }, { "date": "W31", "total": 141 }]
  }
}
```

`mode` tells you how to read `date` — `W31` is an ISO week, a `08/18` is a day. Read `mode` rather than pattern-matching the label, since the same endpoint switches bucket as the range widens.

## Deltas

Card values often carry a comparison against the previous window of the same length:

```json theme={null}
{ "totalCalls": { "value": 412, "deltaPercentage": null } }
```

`deltaPercentage` is `null` when there is no comparable previous window — a new workspace, or a range that reaches past the available history. Render that as "no comparison" rather than 0%.

## Putting it in a dashboard

<Steps>
  <Step title="Fetch the areas you show, in parallel">
    The five endpoints are independent; nothing needs to be called in order.
  </Step>

  <Step title="Handle null panels per panel">
    One unavailable source should blank one card, not the page.
  </Step>

  <Step title="Read `mode` before formatting dates">
    It changes with the range.
  </Step>

  <Step title="Cache for the window you display">
    These are roll-ups over days; polling them frequently spends [rate limit](/concepts/rate-limits) for numbers that barely move.
  </Step>
</Steps>
