---
title: "Rate an AI job's response"
method: POST
path: "/api/v1/ai/jobs/{jobId}/feedback"
tags: ["AI"]
---

# Rate an AI job's response

`POST /api/v1/ai/jobs/{jobId}/feedback`

Rate an AI job's response — the same thumbs up / thumbs down (plus optional comment) a user can give under a response in the Omni chat UI or in Slack. The job must have finished (COMPLETE or FAILED); any other state returns 409. The completion webhook fires just before the stored state reaches COMPLETE, so poll GET /api/v1/ai/jobs/{jobId} and rate once it reports COMPLETE rather than rating from inside a webhook handler. Feedback is append-only: each call records a separate event, so submit once per job. Feedback is not returned by any read endpoint. User-scoped keys can only rate their own jobs; organization keys can rate any job in the organization and may pass `userId` to attribute the feedback to a specific user — use the same `userId` the job was submitted with.

## Path parameters

- `jobId` string, uuid, required — The unique identifier of the AI job

## Query parameters

- `userId` string, uuid — Target user membership ID (for org-scoped API keys)

## Request body

- AiJobFeedbackBody
  - `comment` string, nullable — Free-text feedback about the response — what was wrong, or what an automated evaluation found. Whitespace is trimmed; null is treated as no comment.
  - `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.

## Response `200`

Feedback recorded.

- AiJobFeedbackResponse
  - `comment` string, nullable, required — The comment as recorded, or null when none was sent.
  - `conversationId` string, uuid, required — The conversation the rated job belongs to. Analytics keys feedback by job id and conversation id.
  - `jobId` string, uuid, required — The job 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.
  - `submittedAt` string, date-time, required — When the feedback was recorded.

## Other responses

- `400` — Invalid job ID (must be a UUID) or request body — unknown rating, unrecognized field, or a comment that is empty or over 5000 characters.
- `401` — Missing or invalid API key.
- `403` — Permission denied. AI query generation is disabled for the organization, the caller lacks AI access on the job's model, or a user-scoped key passed a different user's `userId`.
- `404` — Job not found. The job may not exist, may belong to a different organization, or — for user-scoped keys — may belong to a different user. `userId` not found in the organization also returns 404.
- `409` — The job is not COMPLETE or FAILED. For a QUEUED, EXECUTING, or DELIVERING job, poll GET /api/v1/ai/jobs/{jobId} and retry once it finishes; a CANCELLED job can never be rated.

## Changes

- **2026-09-02** `230e92b4fdd5` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/omniapp/apis/omni-api/changes/api/v1/ai/jobs/:jobId/feedback/post.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/1919a7b91619?raw)
