---
title: "Read a ticket"
method: GET
path: "/products/help-desk/tickets/{ticket_id}"
tags: ["help-desk"]
---

# Read a ticket

`GET /products/help-desk/tickets/{ticket_id}`

## Request

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

A ticket with its requester. A hold whose time has passed wakes on this read. Any member, from their own session.

## Path parameters

- `ticket_id` string, required

## Response `200`

The ticket.

- object
  - `data` HelpDeskTicket, required: A ticket as the queue lists it.
    - `ticket_id` string, required
    - `number` integer, required: The ticket's number at the desk (#1042).
    - `status` 'open' | 'waiting_on_customer' | 'on_hold' | 'closed', required
    - `close_reason` 'resolved' | 'duplicate' | 'spam' | 'null', nullable, required
    - `hold_until` integer, nullable, required: When a hold ends (epoch seconds).
    - `priority` 'urgent' | 'high' | 'normal' | 'low', required
    - `team_id` string, nullable, required
    - `assignee_id` string, nullable, required
    - `requester_id` string, required
    - `subject` string, required
    - `preview` string, required: The start of the ticket's first message, as plain text.
    - `tags` string[], required
    - `created_at` integer, required
    - `last_activity_at` integer, nullable, required
    - `last_customer_message_at` integer, nullable, required
    - `first_operator_reply_at` integer, nullable, required
    - `last_operator_reply_at` integer, nullable, required
    - `merged_into` string, nullable, required
    - `merged_into_number` integer, nullable, required
    - `muted` boolean, required: Whether its requester turned its update emails off.
    - `awaiting_first_response` boolean, required
    - `version` integer, required: The version a change is made against.
    - `requester` HelpDeskRequester, nullable, required: The ticket's requester, their address and name opened for the desk; null once the desk holds no row for them.
      - `requester_id` string, required
      - `display_name` string, nullable, required
      - `email` string, required
      - `assurance` 'identity' | 'email_pin', required: How they last proved their address.
    - `presence` HelpDeskPresenceEntry[]: Who is on the ticket now (the queue only).
      - `user_id` string, required
      - `state` 'viewing' | 'replying', required
    - `source` 'portal', required: Where the ticket was opened: its customer's portal.
    - `routing_rule_id` string, nullable, required
    - `last_public_activity_at` integer, nullable, required
    - `first_closed_at` integer, nullable, required
    - `closed_at` integer, nullable, required
    - `reopen_count` integer, required
    - `merged_at` integer, nullable, required: When it was merged: the merge can be undone for 86400 seconds after.
    - `legal_hold` object, nullable, required: The legal hold on it, while held.
    - `email_undeliverable` object, nullable, required: The bounce that marked its requester's address undeliverable.
    - `held_count` integer, required: Emails held for an operator on it.
    - `feedback` HelpDeskOperatorFeedback, 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.
      - `operator_id` string, nullable, required: The original public reply author credited at first submission; null when unrated.
  - `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

- `401`: AUTHENTICATION_ERROR — missing or invalid credentials.
- `403`: FORBIDDEN — the credential is an API key or an impersonated session: the help desk is worked from a member's own session. HELP_DESK_SUBSCRIPTION_REQUIRED — a change that needs the help desk, on an organization that does not hold it.
- `404`: NOT_FOUND — the desk holds no such ticket.
- `409`: HELP_DESK_NOT_ACTIVE — the desk is not active.

## Changes

- **2026-10-28** `a9a10e328ba5`: 16 info
  - the response property `error/details` became required for the status `401`
  - the response property `error/details` became required for the status `403`
  - the response property `error/details` became required for the status `404`
  - the response property `error/details` became required for the status `409`
  - …12 more
- **2026-10-28** `56d7c265a77a`: 4 breaking
  - the response property `error/details` became nullable for the status `401`
  - the response property `error/details` became nullable for the status `403`
  - the response property `error/details` became nullable for the status `404`
  - the response property `error/details` became nullable for the status `409`
- **2026-10-27** `ac44ec1f8cfa`: 1 info
  - added the required property `data/allOf[subschema #2]/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/products/help-desk/tickets/:ticket_id/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)
