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

# Profile statistics

> Aggregate statistics derived from the event history.

Aggregates derived from the matched event history. One read backs the whole profile screen.

### Request

```http theme={null}
GET /v1/users/{user_id}/stats
X-PARTNER-API-KEY: <your partner key>
```

### Response

```json theme={null}
{
  "total_events": 47,
  "total_venues": 23,
  "sports_count": 12,
  "concerts_count": 35,
  "first_attended": "2014-08-02",
  "most_recently_attended": "2026-06-13",
  "busiest_year": "2024",
  "top_season": "Summer",
  "top_artist": "Zach Bryan",
  "top_genre": "Country",
  "top_team": null,
  "top_league": null,
  "unique_venues": [
    { "venue": { "id": 4412, "name": "Madison Square Garden" }, "visit_count": 6 }
  ],
  "has_synced": true,
  "last_sync_at": "2026-08-25T18:44:12Z"
}
```

### Reading it

Recomputed as media is ingested. Superlative fields are `null` when there is too little history
to compute them. A brand-new user has `total_events: 0` and nulls throughout, so design the
empty state deliberately.

`first_attended` and `most_recently_attended` are calendar dates **at the venue**, taken from
the event's local start time on the same basis as `starts_at_local`. Do not convert them.

`has_synced` and `last_sync_at` are the two fields your sync logic reads at launch; see
[Incremental syncs](/guides/ingest-media#incremental-syncs). They are meaningful even for a
user with no matched events at all. Before FanFeed has received anything for a user,
`has_synced` is `false` and `last_sync_at` is `null`; that pair is the signal to run a full
scan.
