# Statistics

```
GET /v1/publisher/calendars/{calendar_id}/stats
```

Requires the `publisher:stats` scope.

```bash
curl https://api.kalender-sync.de/v1/publisher/calendars/$KS_CAL/stats -H "Authorization: Bearer $KS_KEY"
```

```json
{
  "as_of": "2026-11-20T08:00:00.000Z",
  "subscribers": {
    "total": 97,
    "feed": { "total": 97, "by_app": { "google": 51, "apple": 30, "outlook": 12, "other": 4 } },
    "live": { "total": 0, "by_provider": { "google": 0, "microsoft": 0, "icloud": 0 } }
  },
  "direct_feed_clients_7d": null,
  "subscribe_clicks_30d": { "total": 160, "by_app": { "google": 70, "apple": 55, "outlook": 25, "other": 10 } },
  "plan": {
    "plan": "basic",
    "live_calendars": { "used": 1, "limit": 1 },
    "active_subscribers": { "used": 97, "limit": 500 },
    "over_calendar_limit": false,
    "over_subscriber_limit": false
  }
}
```

| Field | Meaning |
|---|---|
| `subscribers.feed.total` | Active subscribers of this calendar: calendar apps that fetched the feed in the last **14 days**. |
| `subscribers.feed.by_app` | Split by `google`, `apple`, `outlook` (Outlook.com, Microsoft 365 and Outlook desktop combined) and `other`. |
| `subscribers.live` | Reserved for a later feature, currently always `0`. |
| `subscribers.total` | Sum; currently equal to `feed.total`. |
| `direct_feed_clients_7d` | Reserved for a later estimate, currently always `null`. |
| `subscribe_clicks_30d` | Every app pick on the subscribe page and in the button in the last 30 days, whether or not a subscription followed. |
| `plan` | Your **account** against its plan (across all live calendars). `plan.plan` is `free`, `basic` or `business` (Professional on the website). |

## What is counted and what isn't

- Subscriptions through the **subscribe page** and the **button** are counted. Each gets its own feed link, and we count its fetches.
- Subscriptions through the general `feed_url` or the `subscribe_links`, if you embed them yourself, are not counted. They work the same way but cannot be counted one by one.
- We store no IP addresses, no user agents and nothing about the people behind a subscription.
- Sandbox calendars have their own statistics but don't count toward `plan.active_subscribers`.

## Limit reached

`over_subscriber_limit: true` means: your account has more active subscribers than your plan covers. **Everything keeps running anyway.** You also get an email (at most every 30 days). → [Plans and limits](https://docs.kalender-sync.de/en/abo-kalender/tarife/)

`over_calendar_limit: true` means: your account has more live calendars than the plan covers, for example after a downgrade. Feeds keep running; writes answer [`plan_required`](https://docs.kalender-sync.de/en/api/errors/plan_required/).