---
title: "List AI feedback"
method: GET
path: "/api/v1/ai/feedback"
tags: ["AI"]
---

# List AI feedback

`GET /api/v1/ai/feedback`

## Request

- Base URL: `https://omniapp.co` (the document declares no server; this is the origin it was published from)
- URL: `https://omniapp.co/api/v1/ai/feedback`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/omniapp/apis/omni-api/docs/api/v1/ai/feedback/get.ts> (a function with typed inputs; its response is checked against the schema)

List the thumbs up and thumbs down users gave AI responses in this organization, with any comment and reason, from the Omni app, Slack, and POST /api/v1/ai/jobs/{jobId}/feedback. Each rating or comment is its own event, newest first. A user can rate the same job more than once, so their latest event for a job is their current verdict. Filters by when the feedback was given (the last 30 days by default, at most 90 days per request), by rating, and by shared model. Paginated via opaque `pageInfo.nextCursor`: pass it back as `cursor`, with pageSize only, to fetch the next page. A page can hold fewer records than pageSize while hasNextPage is true, so keep paging until nextCursor is null. A record can repeat across pages when new feedback loads during a walk, so deduplicate by id. Feedback is read from Omni's analytics warehouse, so new feedback appears after a delay. Organization admins only.

## Query parameters

- `cursor` string: Cursor for pagination (from previous response nextCursor)
- `pageSize` integer: Number of results per page (1-100, integer)
- `endDate` string, date-time: Exclusive upper bound on when the feedback was given, as an ISO 8601 date-time. Defaults to now.
- `modelId` string, uuid: Only feedback on responses from this shared model. Feedback given through Slack or the API does not record a model, so this filter leaves it out.
- `rating` 'good' | 'bad': Only feedback with this rating.
- `startDate` string, date-time: Inclusive lower bound on when the feedback was given, as an ISO 8601 date-time. Defaults to 30 days before endDate. The window may span at most 90 days.

## Response `200`

A page of feedback events.

- AiFeedbackListResponse
  - `pageInfo` AiFeedbackPageInfo, required
    - `hasNextPage` boolean, required: Whether more results are available
    - `nextCursor` string, nullable, required: Cursor for fetching the next page
    - `pageSize` number, required: Number of results per page
  - `records` AiFeedback[], required: Feedback events, newest first. Each rating or comment is its own event, so one user can appear several times for the same job. Their latest event is their current verdict.
    - `category` string, nullable, required: The reason picked from the list under a thumbs down in the Omni chat UI, or null when none was picked.
    - `comment` string, nullable, required: The free-text comment, or null when none was given.
    - `conversationId` string, nullable, required: The conversation the rated response belongs to, or null when it was not recorded.
    - `createdAt` string, date-time, required: When the feedback was given, in UTC.
    - `id` string, required: Identifies this feedback event.
    - `jobId` string, required: The AI job (one prompt and its response) that was rated. For jobs submitted through the API, the same id POST /api/v1/ai/jobs returned.
    - `modelId` string, nullable, required: The shared model the rated response came from, or null when it was not recorded.
    - `prompt` string, nullable, required: The prompt whose response was rated.
    - `rating` 'good' | 'bad', required: The verdict on the response. `good` is a thumbs up, `bad` a thumbs down — the same signal as the buttons under a response in the Omni chat UI.
    - `source` 'web' | 'slack' | 'api' | 'other', required: Where the feedback was given: `web` for the Omni app, `slack` for the Slack app, `api` for POST /api/v1/ai/jobs/{jobId}/feedback, `other` for any surface added later.
    - `userId` string, nullable, required: The user who gave the feedback, or null when the event names no user of this organization.

## Other responses

- `400`: Invalid query parameters: an unknown parameter, a malformed date or cursor, a startDate not before endDate, a window longer than 90 days, or filters sent alongside a cursor.
- `401`: Missing or invalid API key.
- `403`: The caller is not an organization admin, or this endpoint is not enabled for the organization.
- `503`: Feedback could not be loaded. Retry the request.

## Changes

- **2026-11-05** `7706245c240f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/omniapp/apis/omni-api/changes/api/v1/ai/feedback/get.md)

---

[API](https://skmtc.dev/omniapp/apis/omni-api.md) - [All operations](https://skmtc.dev/omniapp/apis/omni-api/llms.txt) - [OpenAPI document](https://skmtc.dev/omniapp/apis/omni-api/revisions/a5c0fcf14508?raw)
