---
title: "GET /api/v1/x/users/{id}/insights"
method: GET
path: "/api/v1/x/users/{id}/insights"
tags: ["Users"]
---

# GET /api/v1/x/users/{id}/insights

`GET /api/v1/x/users/{id}/insights`

## Request

- Base URL: `https://xquik.com`
- URL: `https://xquik.com/api/v1/x/users/{id}/insights`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer
  - none

Returns engagement insights for 1 profile. They are engagement rate, averages per post and posting rate, from its counts and its last 20 posts. Reposts and the pinned post stay out of the averages. Each report costs 1 credit, whatever it reads.

## Path parameters

- `id` string, required

## Query parameters

- `fields` string
- `omit` string

## Response `200`

Profile insights

- object
  - `insights` UserInsights, required: Engagement insights of 1 profile. Engagements are likes, replies, reposts and quotes. A rate is null when nothing divides it, such as a profile without posts of its own.
    - `userId` string, required: ID of the profile the insights describe.
    - `userName` string, required: Username of that profile.
    - `followers` number, required: Followers.
    - `following` number, required: Accounts the user follows.
    - `posts` number, required: Posts the user has made.
    - `accountAgeDays` number, nullable, required: Whole days since the account joined X.
    - `postsPrivate` boolean, required: True when only the account's followers see its posts. The report then has its counts only.
    - `sample` object, required: The recent posts the averages read.
      - `posts` number, required: Posts read.
      - `oldestAt` string, date-time, nullable, required: When the oldest of them went up.
      - `newestAt` string, date-time, nullable, required: When the newest of them went up.
    - `averages` object, nullable, required: The public counts of 1 tweet.
      - `likes` number, required: Likes.
      - `replies` number, required: Replies.
      - `reposts` number, required: Reposts.
      - `quotes` number, required: Quotes.
      - `bookmarks` number, required: Bookmarks.
      - `views` number, required: Views.
      - `engagements` number, required: Likes, replies, reposts and quotes per post.
    - `engagementRate` number, nullable, required: Average engagements per post, as a percent of followers.
    - `engagementPerView` number, nullable, required: Engagements as a percent of views across the sample.
    - `postsPerDay` number, nullable, required: Sampled posts per day, from the oldest one until now.
    - `topPostId` string, nullable, required: The sampled post with the most engagements.
  - `message` string: Says why the report has counts only. Sent only when postsPrivate is true.

## Other responses

- `400`: Invalid input. A value past its maxLength gets this answer, & the message names the field & its limit.
- `401`: Non-MPP paid reads require Bearer authentication. Without credentials, the answer offers a guest checkout but does not create it. Invalid credentials return a plain error. Confirm before using any offered action.
- `402`: Payment required. MPP reads include `WWW-Authenticate`. Authenticated reads include balances, plus checkout when the key can open it. A key that reads only gets the account page instead. A failed request never creates checkout. A caller on a plan gets top-up only, plus `credits_renew_at` when the plan renews. Guest keys offer top-up.
- `404`: X shows no profile for the account. `reason` says why. It is `not_found` for a handle or ID no account holds, which X answers for a deactivated account too, or `suspended` with the message "X suspended this account. Choose another account." when X suspended it.
- `424`: Dependency unavailable, unauthorized, or limited. Default v1 uses 502. Best-practice responses use 424 for transparent dependency failures. Search answers 424 `search_unavailable` when X fails the query itself, or when its filters matched none of the last 3,000 posts read. The message says how far back the search read.
- `429`: Too many requests right now. Each user gets 500 reads a second. Each minute allows 120 writes & 60 deletes. `x_api_rate_limited` means X limits this read for now. Neither answer costs anything. Wait for the seconds in `Retry-After`, then retry.
- `500`: Unexpected error.
- `502`: Dependency unavailable, unauthorized, or limited. Default v1 uses 502. Best-practice responses use 424 for transparent dependency failures. Search answers 424 `search_unavailable` when X fails the query itself, or when its filters matched none of the last 3,000 posts read. The message says how far back the search read.
- `503`: Retry x_api_unavailable after Retry-After. With X-Xquik-Busy, retry until your deadline.
- `default`: Unexpected error.

## Changes

- **2026-10-20** `45942c75fdc2`: 20 warning
  - added the new `topup_in_progress` enum value to the `allOf[#/components/schemas/Error]/error/oneOf[subschema #1: LegacyErrorCode]/` response property for the response status `429`
  - added the new `topup_in_progress` enum value to the `allOf[#/components/schemas/Error]/error/oneOf[subschema #2: StructuredError]/code` response property for the response status `429`
  - added the new `topup_in_progress` enum value to the `error/oneOf[subschema #1: LegacyErrorCode]/` response property for the response status `400`
  - added the new `topup_in_progress` enum value to the `error/oneOf[subschema #1: LegacyErrorCode]/` response property for the response status `404`
  - …16 more

[Operation history](https://skmtc.dev/xquik-dev/apis/xquik-api/changes/api/v1/x/users/:id/insights/get.md)

---

[API](https://skmtc.dev/xquik-dev/apis/xquik-api.md) · [All operations](https://skmtc.dev/xquik-dev/apis/xquik-api/llms.txt) · [OpenAPI document](https://skmtc.dev/xquik-dev/apis/xquik-api/revisions/45942c75fdc2?raw)
