---
title: "Rate the support received on your request"
method: POST
path: "/hd/desks/{desk_id}/tickets/{number}/feedback"
tags: ["hd"]
---

# Rate the support received on your request

`POST /hd/desks/{desk_id}/tickets/{number}/feedback`

## Request

- Base URL: `https://api.sparkvault.com/v1`
- URL: `https://api.sparkvault.com/v1/hd/desks/{desk_id}/tickets/{number}/feedback`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/sparkvault/apis/sparkvault-api/docs/hd/desks/:desk_id/tickets/:number/feedback/post.ts> (a function with typed inputs; its response is checked against the schema)

Authenticated customers explicitly submit Good or Bad feedback for their own request. The first vote is credited to a stored public operator reply, never a client-provided operator. One current vote is kept: retries do not add ratings and edits replace the original reporting sample. Merged-away or spam requests and internal/unpublished replies are ineligible. No GET or email link records a vote.

## Path parameters

- `desk_id` string, required
- `number` string, required

## Headers

- `X-SV-Client` 'help-desk-portal', required

## Request body

- object
  - `rating` 'positive' | 'negative', required
  - `reply_event_id` string: Optional public operator reply ID. Existing feedback cannot be moved to a different reply.

## Response `200`

The saved feedback and its optional follow-up link.

- object
  - `data` object, required
    - `feedback` HelpDeskCustomerFeedback, required: One current rating per request. The first vote freezes its public reply, author and reporting day; later changes replace that sample.
      - `eligible` boolean, required: Whether this request has an eligible published operator reply and accepts feedback.
      - `lookup_complete` boolean, required: False when the bounded legacy reply lookup could not finish. The ticket remains readable, but feedback is temporarily unavailable rather than reported as unrated.
      - `rating` 'positive' | 'negative' | 'null', nullable, required
      - `submitted_at` integer, nullable, required: First submission time; subsequent vote changes keep the original reporting day.
      - `updated_at` integer, nullable, required
      - `version` integer, required: Zero when unrated; increments only when the saved rating changes, including within the same second.
      - `reply_event_id` string, nullable, required: The public operator reply being rated. Existing feedback keeps its original reply.
      - `destination_url` string, uri, nullable, required: The configured HTTPS follow-up link for the saved rating, or null. Never supplied by the customer or populated before a vote is saved.
    - `destination_url` string, uri, nullable, required
  - `meta` ResponseMeta: Envelope metadata present on every successful response.
    - `api_version` string
    - `request_id` string
    - `response_ms` integer
    - `timestamp` integer: Unix seconds.
    - `pools` object: Storage and bandwidth capacity snapshot for the account.
    - `billing` object
      - `past_due` boolean
    - `quota` object: This minute of the account request budget. Present on authenticated success responses that passed the throttle; absent otherwise.
      - `limit` integer
      - `used` integer
      - `remaining` integer
      - `resets_at` integer: Unix seconds.

## Other responses

- `400`: VALIDATION_ERROR: choose a supported rating and reply ID. CLIENT_HEADER_REQUIRED — see above.
- `401`: CUSTOMER_AUTH_REQUIRED — no bearer token, or one that is not a customer's of this desk now: unknown, expired, revoked, another desk's, or of the sign-in mode the desk no longer uses.
- `404`: NOT_FOUND — no such request, draft or file is the customer's: one that does not exist and one of another customer read the same, byte for byte.
- `409`: CONFLICT: the request is not eligible for feedback or the target differs from its saved rating.
- `429`: RATE_LIMIT_EXCEEDED — this client address, or this customer, has spent its reads at the desk for the minute, or the request would make a Secure Identity customer's record past the new customers the desk takes in an hour. `Retry-After` carries the seconds until the budget reopens, and `details` carries `limit` and `resets_at`.
- `503`: HELP_DESK_UNAVAILABLE: the desk is unavailable. FEEDBACK_LOOKUP_INCOMPLETE: a bounded reply lookup could not finish; no vote was recorded.

## Changes

- **2026-10-28** `a9a10e328ba5`: 24 info
  - the response property `error/details` became required for the status `400`
  - the response property `error/details` became required for the status `401`
  - the response property `error/details` became required for the status `404`
  - the response property `error/details` became required for the status `409`
  - …20 more
- **2026-10-28** `56d7c265a77a`: 6 breaking
  - the response property `error/details` became nullable for the status `400`
  - the response property `error/details` became nullable for the status `401`
  - the response property `error/details` became nullable for the status `404`
  - the response property `error/details` became nullable for the status `409`
  - …2 more
- **2026-10-27** `ac44ec1f8cfa`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/sparkvault/apis/sparkvault-api/changes/hd/desks/:desk_id/tickets/:number/feedback/post.md)

---

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