# Page-view analytics

> Retrieve page views and unique visitors for CreatorsJet resources owned by the API subject.
>
> Canonical URL: https://docs.creatorsjet.com/api/analytics

`GET /analytics/views` returns page views, unique visitors, and a time series for one owned CreatorsJet resource or an aggregate of owned resources. It requires `analytics:read`.

> **Info — Page views are not social-platform views:**
>
> This endpoint measures visits to CreatorsJet pages. It does not return views, reach, impressions, or engagement for Instagram, TikTok, YouTube, or other social content.

## Available resources

| `resource_type` | Creator key | Agency key | Measured page                   |
| --------------- | ----------: | ---------: | ------------------------------- |
| `media_kit`     |         Yes |        Yes | Owned media-kit pages           |
| `link_in_bio`   |         Yes |         No | The creator's link-in-bio page  |
| `roster`        |          No |        Yes | The agency's public roster page |
| `deck`          |          No |        Yes | Agency-owned pitch-deck pages   |
| `campaign`      |         Yes |        Yes | Owned public campaign reports   |

## Query one resource

Supply the resource's opaque ID through `resource_id`:

```bash
curl "https://api.creatorsjet.com/public/v1/analytics/views?resource_type=campaign&resource_id=$CAMPAIGN_ID&timeframe=last7d&timezone=Europe/Paris" \
  --header "Authorization: Bearer $CREATORSJET_API_KEY"
```

The timezone must be an IANA timezone. It controls calendar boundaries and time-series buckets.

## Query an aggregate

Omit `resource_id` to aggregate every owned resource of that type:

```bash
curl "https://api.creatorsjet.com/public/v1/analytics/views?resource_type=media_kit&timeframe=mtd&timezone=UTC" \
  --header "Authorization: Bearer $CREATORSJET_API_KEY"
```

The response reports whether the request covered one resource or an aggregate:

```json
{
  "data": {
    "resource_type": "campaign",
    "resource_scope": "resource",
    "resource_count": 1,
    "resource_ids": ["66b0f51d46071dc43b2db103"],
    "metric": "page_views",
    "totals": {
      "page_views": 482,
      "unique_visitors": 361
    },
    "timeframe": "last7d",
    "timezone": "Europe/Paris",
    "period": {
      "start": "2026-08-07T00:00:00.000Z",
      "end": "2026-08-14T10:00:00.000Z"
    },
    "granularity": "day",
    "series": []
  },
  "request_id": "50c20a47-bf9a-4dfa-98ae-54fd89a172e1"
}
```

Supported `timeframe` values are `last24h`, `today`, `yesterday`, `last7d`, `wtd`, `mtd`, `ytd`, and `all`.

## Empty and inaccessible resources

An aggregate with no owned resources returns zero totals. A specific resource that is absent or belongs to another subject returns `404 NOT_FOUND`.

Do not sum overlapping aggregate and resource responses. Use one aggregation strategy in your application and retain the response timezone with any stored series.

See the [analytics endpoint reference](/api/reference/analytics/getViewAnalytics) for the complete schema.
