---
title: "Submit job feedback"
method: POST
path: "/v1/jobs/{jobUuid}/feedback"
tags: ["Job Feedback"]
---

# Submit job feedback

`POST /v1/jobs/{jobUuid}/feedback`

## Request

- Base URL: `https://gateway.app.clavata.ai:8443`
- URL: `https://gateway.app.clavata.ai:8443/v1/jobs/{jobUuid}/feedback`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/clavata/apis/clavata-public-api-v1/docs/v1/jobs/:jobUuid/feedback/post.ts> (a function with typed inputs; its response is checked against the schema)

Records feedback about the outcome a label produced for a piece of content, or a specific video frame or transcript chunk, in a completed job. Copy GetJobLabels LabelHit fields into the item's target.occurrence to address a video occurrence, or omit occurrence to address the whole result. Feedback is stored one entry per (content or video occurrence, label) pair; submitting feedback for a pair that already has feedback replaces it. actual_outcome is the thresholded section or label result, not a per-frame occurrence score. Available to policy-first and label-first accounts; works on any job in the account, including jobs from `POST /v1/labels/evaluate`.

## Path parameters

- `jobUuid` string, required

## Request body

- GatewayServiceSubmitJobFeedbackBody
  - `items` V1JobFeedbackItem[], required: The feedback to record. At least one and at most 100 entries. Two entries resolving to the same content or video occurrence and label are rejected.
    - `target` V1JobFeedbackTarget: JobFeedbackTarget names the content item — and optionally the video frame or transcript chunk within it — that a feedback item is about.
      - `contentHash` string: job_results.content_hash. Required when the job evaluated more than one content item. Omit for the single-result case (typical video job).
      - `occurrence` JobFeedbackTargetOccurrence: Occurrence is a video frame or transcript chunk, identified the way GetJobLabels reports it.
        - `modality` 'MODALITY_UNSPECIFIED' | 'MODALITY_VIDEO' | 'MODALITY_AUDIO' | 'MODALITY_IMAGE' | 'MODALITY_TEXT', required
        - `startMs` string, int64, required: Milliseconds from the start of the media. Frames are point-in-time; chunks use the chunk's start bound. 0 is a valid start.
        - `endMs` string, int64: Set for ranged hits (audio chunks); unset for point-in-time frames.
    - `label` string: The label this feedback is about. For policy jobs this is the name of the policy section, and is required. For label jobs, which evaluate a single label, it may be omitted or set to the job's label ID.
    - `expectedOutcome` 'EVALUATION_RESULT_UNSPECIFIED' | 'EVALUATION_RESULT_FLAGGED' | 'EVALUATION_RESULT_NOT_FLAGGED', required
    - `comment` string: Why the outcome was wrong. Limited to 10,000 characters.

## Response `200`

A successful response.

- V1SubmitJobFeedbackResponse
  - `annotations` V1JobAnnotation[]
    - `id` string
    - `jobUuid` string
    - `jobResultId` string
    - `target` V1JobFeedbackTarget: JobFeedbackTarget names the content item — and optionally the video frame or transcript chunk within it — that a feedback item is about.
      - `contentHash` string: job_results.content_hash. Required when the job evaluated more than one content item. Omit for the single-result case (typical video job).
      - `occurrence` JobFeedbackTargetOccurrence: Occurrence is a video frame or transcript chunk, identified the way GetJobLabels reports it.
        - `modality` 'MODALITY_UNSPECIFIED' | 'MODALITY_VIDEO' | 'MODALITY_AUDIO' | 'MODALITY_IMAGE' | 'MODALITY_TEXT', required
        - `startMs` string, int64, required: Milliseconds from the start of the media. Frames are point-in-time; chunks use the chunk's start bound. 0 is a valid start.
        - `endMs` string, int64: Set for ranged hits (audio chunks); unset for point-in-time frames.
    - `label` string: The resolved label identity: the policy section name for policy jobs, or the label ID for label jobs.
    - `labelId` string: The label ID. Only set for label jobs.
    - `labelVersionId` string: The version of the label that was evaluated. Only set for label jobs.
    - `expectedOutcome` 'EVALUATION_RESULT_UNSPECIFIED' | 'EVALUATION_RESULT_FLAGGED' | 'EVALUATION_RESULT_NOT_FLAGGED'
    - `actualOutcome` 'EVALUATION_RESULT_UNSPECIFIED' | 'EVALUATION_RESULT_FLAGGED' | 'EVALUATION_RESULT_NOT_FLAGGED'
    - `comment` string
    - `createdAt` string, date-time
    - `updatedAt` string, date-time

## Other responses

- `400`: Bad Request
- `429`: Too Many Requests
- `499`: Precheck Failures (Canceled)
- `default`: An unexpected error response.

## Changes

- **2026-10-16** `d7a854b0070f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/clavata/apis/clavata-public-api-v1/changes/v1/jobs/:jobUuid/feedback/post.md)

---

[API](https://skmtc.dev/clavata/apis/clavata-public-api-v1.md) - [All operations](https://skmtc.dev/clavata/apis/clavata-public-api-v1/llms.txt) - [OpenAPI document](https://skmtc.dev/clavata/apis/clavata-public-api-v1/revisions/d7a854b0070f?raw)
