---
title: "Read one of the customer's requests"
method: GET
path: "/hd/desks/{desk_id}/tickets/{number}"
tags: ["hd"]
---

# Read one of the customer's requests

`GET /hd/desks/{desk_id}/tickets/{number}`

## Request

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

The request, as its customer reads it, with the first page of its timeline: public events only, each through the customer field allowlist.

## Path parameters

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

## Query parameters

- `response` string

## Headers

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

## Response `200`

The request and its timeline's first page.

- object
  - `data` object, required
    - `ticket` object, required: One of the customer's requests, as its customer reads it: the status in their words is read from `status`, `close_reason` and `awaiting_first_response`. Nothing the desk keeps for itself (who works the request, its team, tags, priority, preview or ids) is in it.
      - `number` integer, required: The request's number at the desk: every route names the request by it.
      - `subject` string, required
      - `status` 'open' | 'waiting_on_customer' | 'on_hold' | 'closed', required
      - `close_reason` 'resolved' | 'duplicate' | 'null', nullable, required: Why a closed request closed: resolved, or merged into another request (duplicate); null for one that is not closed, and for one closed for a reason its customer is not shown.
      - `awaiting_first_response` boolean, required: True until the desk first answers the request.
      - `created_at` integer, required: Epoch seconds the request was opened.
      - `last_public_activity_at` integer, nullable, required: Epoch seconds the request last changed in a way its customer sees; null when the answer does not say.
      - `muted` boolean, required: True while the request's update emails are turned off.
      - `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.
      - `can_resolve` boolean, required: On the request's own page (GET /hd/desks/{desk_id}/tickets/{number}) alone: whether the customer may mark the request resolved now. A list of requests does not carry it.
    - `events` HelpDeskCustomerEvent[], required
      - `event_id` string, required
      - `seq` integer, required: Orders the request's events: one that came later carries a larger `seq`.
      - `type` 'ticket_created' | 'customer_message' | 'operator_reply' | 'status_changed' | 'reopened' | 'resolved_by_customer' | 'merged_into' | 'merged_from', required
      - `created_at` integer, required: Epoch seconds.
      - `actor` object, required
        - `kind` 'customer' | 'operator' | 'system' | 'rule', required
        - `label` string, nullable, required: The name the desk shows the actor by.
        - `avatar_handle` string, nullable, required: An operator's avatar address on the desk (GET /hd/desks/{desk_id}/avatars/{avatar_handle}); null for none.
      - `body` object, nullable, required: A message's text, as its safe-markup document (`@sparkvault/app-sdk/safe-markup`); null for an event that carries no message, and for a message that cannot be read right now.
      - `attachments` object[], required
        - `attachment_id` string, required
        - `name` string, required
        - `size` integer, required: Bytes.
        - `disposition` 'inline' | 'attachment', required: How a browser is handed the file: inline only for a type Chrome and Firefox both show as a page from a single-use link (a JPEG, PNG, GIF, WebP, AVIF or BMP image, or a PDF); anything else downloads, every recording included.
        - `scan` 'pass' | 'not_scanned', required: `pass` when the mail scan passed the email that brought the file; `not_scanned` for an upload, and for an email part the scan could not judge.
      - `status` object: On a status change: the status the request moved from and to.
        - `from` string, nullable
        - `to` string, nullable
      - `merged` object: On a merge: the number of the other request.
        - `number` integer, nullable
    - `next_cursor` string, nullable, required: Opaque continuation token. Null when the listing is exhausted.
  - `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`: 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.
- `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: an explicit response lookup could not finish; ordinary reads instead mark feedback lookup_complete false.

## Changes

- **2026-10-28** `a9a10e328ba5`: 20 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 `429`
  - …16 more
- **2026-10-28** `56d7c265a77a`: 5 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 `429`
  - …1 more
- **2026-10-28** `fecd5111028e`: 2 warning
  - added the new `not_scanned` enum value to the `data/events/items/attachments/items/scan` response property for the response status `200`
  - added the new `pass` enum value to the `data/events/items/attachments/items/scan` response property for the response status `200`
- **2026-10-27** `ac44ec1f8cfa`: 2 info
  - added the new optional `query` request parameter `response`
  - added the optional property `data/ticket/allOf[#/components/schemas/HelpDeskCustomerTicket]/feedback` to the response with the `200` status
- **2026-10-23** `ad4c62db5e08`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/sparkvault/apis/sparkvault-api/changes/hd/desks/:desk_id/tickets/:number/get.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)
