---
title: "Get User Analytics"
method: GET
path: "/users/{userId}/analytics"
tags: ["Analytics", "Users"]
---

# Get User Analytics

`GET /users/{userId}/analytics`

Understand how a specific user engages with your AI across all their conversations. Track their satisfaction, identify pain points, and spot opportunities to improve their experience.

**⚠️ Requires Growth+ plan or higher**

**Two modes available:**

- **simple mode**: Get aggregate metrics like average sentiment, frustration levels, and conversation quality. Perfect for user dashboards. No rate limiting.
- **insights mode** (default): Access detailed patterns, recurring topics, and AI-generated recommendations specific to this user. Rate limited based on your plan's `maxAnalysesPerHour`.

Returns 404 if the user doesn't exist or has no conversations yet.

## Path parameters

- `userId` string, uuid, required — The user ID to get analytics for

## Query parameters

- `mode` 'simple' | 'insights' — Analysis mode: "simple" returns only numeric aggregates (no rate limiting), "insights" includes topics, keywords, and recommendations (rate limited per tenant plan).
- `productId` string, uuid — Filter analytics by product ID.
- `versionId` string, uuid — Filter analytics by version ID.

## Response `200`

User analytics retrieved

- GetUserAnalysisResponse
  - `averageUserSentiment` object, required — Average sentiment across all conversations.
    - `label` string, required
    - `score` number, required
  - `averageChangeInUserSentiment` object, required — Distribution of sentiment changes.
    - `label` string, required
    - `score` number, required
  - `averageFrustration` object, required — Average frustration level.
    - `score` number, required
    - `label` string, required
  - `averageStruggle` object, required — Average struggle level.
    - `score` number, required
    - `label` string, required
  - `averageCommercialIntent` object, required — Average commercial intent.
    - `score` number, required
    - `label` string, required
  - `averageConversationRating` number, nullable, required — Average conversation rating.
  - `averageConversationQualityIndex` number, nullable, required — Average conversation quality index.
  - `topics` object[] — Topics discussed (insights mode only).
    - `name` string, required
    - `count` number, required
  - `keywords` object[] — Keywords extracted (insights mode only).
    - `name` string, required
    - `count` number, required
  - `summary` object, nullable, required — Structured participant profile summary.
    - `profileSummary` string, required — Executive summary of the participant.
    - `behavioralPatterns` object[], required — Behavioral patterns observed across conversations.
      - `pattern` string, required — What the participant consistently does.
      - `evidence` string, required — Specific examples from conversations.
      - `frequency` 'recurring' | 'occasional' | 'rare', required — How often this pattern appears.
    - `engagement` object, required — Engagement profile.
      - `level` 'power_user' | 'regular' | 'casual' | 'at_risk' | 'churning', required — Engagement level classification.
      - `trajectory` 'growing' | 'stable' | 'declining', required — Engagement trend direction.
      - `description` string, required — Explanation of the engagement assessment.
    - `signals` object[], required — Key signals the product owner should know about.
      - `type` 'opportunity' | 'risk' | 'insight', required — Signal category.
      - `title` string, required — Short headline.
      - `description` string, required — Evidence-based description.
      - `priority` 'high' | 'medium' | 'low', required — Signal priority.
    - `productAlignment` object, nullable, required — Product-specific observations (when business context is available).
      - `summary` string, required — How the participant relates to product goals.
      - `strengths` string[], required — What's working well for this participant.
      - `gaps` string[], required — Where the product isn't serving them.
    - `methodology` string, required — Transparency about what data drove the analysis.
  - `totalConversations` number, required — Total number of conversations analyzed.

## Other responses

- `404` — User not found or no conversations
- `429` — Rate limit exceeded (insights mode)

## Changes

- **2026-03-12** `51d576458472` — 2 breaking, 6 info
  - removed the required property `allOf[subschema #2]/summary/analysis` from the response with the `200` status
  - removed the required property `allOf[subschema #2]/summary/reason` from the response with the `200` status
  - added the required property `allOf[subschema #2]/summary/behavioralPatterns` to the response with the `200` status
  - added the required property `allOf[subschema #2]/summary/engagement` to the response with the `200` status
  - …4 more
- **2025-11-24** `c1998d918478` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/greenflash-ai/apis/greenflash-api-reference/changes/users/:userId/analytics/get.md)

---

[API](https://skmtc.dev/greenflash-ai/apis/greenflash-api-reference.md) · [All operations](https://skmtc.dev/greenflash-ai/apis/greenflash-api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/greenflash-ai/greenflash-api-reference/revisions/c566e560677d/schema)
