---
title: "Get Feedback Detail"
method: GET
path: "/admin/feedbacks/{feedback_id}"
tags: ["Feedback"]
---

# Get Feedback Detail

`GET /admin/feedbacks/{feedback_id}`

Get detailed feedback information

## Path parameters

- `feedback_id` string, required

## Response `200`

Successful Response

- FeedbackDetailResponse
  - `id` string, required
  - `user_id` string, required
  - `user_exists` boolean, required
  - `user_email` string, required
  - `user_name` string, required
  - `user_role` string, required
  - `user_country` string, nullable, required
  - `user_grade` string, nullable, required
  - `classes` object[], required
  - `school_name` string, nullable, required
  - `source` 'user' | 'attio' | 'store' | 'admin' — Where the feedback came in through.
  - `origin` 'widget' | 'chat_answer_report' — Which door of the app a `user` feedback came through. Both are written by the person they belong to, so they share the `user` source and the inbox; what differs is what the team has to read. A widget message is the user's own words. A chat answer report is one click under a chat answer (EXC-796): the text is ours, the question and the answer are what to look at.
  - `nature` 'misunderstanding' | 'bug' | 'suggestion' — What kind of feedback it is, which is also how it gets triaged. A dysfunction of what exists is a bug and goes down the fast lane; everything that changes or adds behaviour waits for the weekly review.
  - `themes` FeedbackTheme[]
  - `feedback` string, required
  - `image_urls` string[], required
  - `status` 'new' | 'in-progress' | 'done', required
  - `timestamp` string, date-time, required
  - `last_status_changed_by` string, nullable, required
  - `last_status_changed_by_name` string, nullable, required
  - `status_changed_at` string, date-time, nullable, required
  - `replies` object[], required
  - `user_feedback_history` object[], required
  - `context` EnvironmentContext — Where the report was written, on what, and from which build. Every field is optional. This is diagnostic garnish attached to something a user wrote, and a client that sends one field in a shape the server does not expect must not cost that user their message; the read side already has to render a report that carries no context at all, since every feedback written before this existed has none.
    - `url` string, nullable
    - `route` string, nullable
    - `captured_at` string, date-time, nullable
    - `timezone` string, nullable
    - `locale` string, nullable
    - `platform` 'web_desktop' | 'web_mobile' | 'pwa_standalone' | 'ios_native' | 'android_native', nullable
    - `user_agent` string, nullable
    - `app_version` string, nullable
    - `native_build_version` string, nullable
    - `ota_bundle_version` string, nullable
    - `ota_active` boolean, nullable
    - `viewport_width` integer, nullable
    - `viewport_height` integer, nullable
    - `document_width` integer, nullable
    - `document_height` integer, nullable
    - `scroll_x` integer, nullable
    - `scroll_y` integer, nullable
    - `device_pixel_ratio` number, nullable
    - `is_mobile` boolean, nullable
    - `prefers_dark` boolean, nullable
    - `online` boolean, nullable
    - `connection_type` string, nullable
    - `page_load_ms` integer, nullable
    - `time_on_route_ms` integer, nullable
  - `diagnostics` SessionDiagnostics — What happened in the session, and what the investigator can replay. This is the half that carries student data, and the half that expires.
    - `console` ConsoleEntry[]
      - `level` 'log' | 'info' | 'warn' | 'error' | 'debug', required
      - `message` string, required
      - `at` string, date-time, required
    - `network` NetworkEntry[]
      - `method` string, required
      - `url` string, required
      - `status` integer, nullable
      - `duration_ms` integer, nullable
      - `at` string, date-time, required
      - `response_body` string, nullable
    - `route_history` RouteVisit[]
      - `route` string, required
      - `at` string, date-time, required
    - `click_trail` ClickEntry[]
      - `test_id` string, nullable
      - `tag` string, required
      - `label` string, nullable
      - `at` string, date-time, required
    - `posthog_replay_url` string, nullable
    - `posthog_distinct_id` string, nullable
    - `posthog_session_id` string, nullable
    - `sentry_replay_id` string, nullable
    - `sentry_last_event_id` string, nullable
  - `screenshot_url` string, nullable
  - `diagnostics_captured_at` string, date-time, nullable
  - `route_targets` RouteTarget[]
    - `kind` string, required
    - `id` string, required
    - `label` string, required
  - `owner` string, nullable
  - `owner_name` string, nullable
  - `owner_assigned_by_name` string, nullable
  - `owner_assigned_at` string, date-time, nullable
  - `reply_draft` ReplyDraftOut — A reply written outside the page (the assistant, through the admin MCP connector) and waiting in the composer. One per feedback, replaced whole, gone once a reply is sent.
    - `message` string, required
    - `author_id` string, required
    - `author_name` string, required
    - `updated_at` string, date-time, required

## Other responses

- `422` — Validation Error

## Changes

> 23 revisions in range; 1 not diffed.

- **2026-09-24** `957b18a69df8` — 1 info
  - added the optional property `origin` to the response with the `200` status
- **2026-09-23** `b73d9bd491c3` — 1 info
  - added the optional property `reply_draft` to the response with the `200` status
- **2026-09-16** `9f813eb42d6f` — 3 info
  - added the optional property `nature` to the response with the `200` status
  - added the optional property `source` to the response with the `200` status
  - added the optional property `themes` to the response with the `200` status
- **2026-09-05** `437cd8414e9e` — 10 info
  - added the optional property `context` to the response with the `200` status
  - added the optional property `diagnostics` to the response with the `200` status
  - added the optional property `diagnostics_captured_at` to the response with the `200` status
  - added the optional property `owner` to the response with the `200` status
  - …6 more

[Change history](https://skmtc.dev/excellence-ai/apis/excellence-learning/changes/admin/feedbacks/:feedback_id/get.md)

---

[API](https://skmtc.dev/excellence-ai/apis/excellence-learning.md) · [All operations](https://skmtc.dev/excellence-ai/apis/excellence-learning/llms.txt) · [OpenAPI document](https://skmtc.dev/excellence-ai/apis/excellence-learning/revisions/a8ae0e0c0570?raw)
