# Get a ticket

> Returns one ticket by its UUID, with its thread.

Source: https://www.hey.support/docs/api/tickets/get-ticket

---

<ApiEndpoint method="GET" path="/tickets/{id}" />

Internal notes are never included — they are the team talking to itself. Responds 404 rather than 403 for a ticket in another workspace, so ids cannot be enumerated.

## Path parameters

<TypeTable
  type={{
  "id": { type: "string (uuid)", description: "", required: true }
}}
/>

## Response `200`

<TypeTable
  type={{
  "id": { type: "string (uuid)", description: "Ticket UUID (not sqid-encoded)", required: true },
  "chatbot_id": { type: "string", description: "", required: true },
  "conversation_id": { type: "string", description: "The chat it came out of, when it came out of one.", required: false },
  "customer_id": { type: "integer", description: "The workspace-level customer record — the same person across every agent in the workspace.", required: false },
  "number": { type: "integer", description: "What the customer quotes. Unique per workspace, not per agent.", required: true },
  "status": { type: "\"new\" | \"open\" | \"waiting\" | \"solved\" | \"closed\"", description: "", required: true },
  "priority": { type: "\"low\" | \"normal\" | \"high\" | \"urgent\"", description: "", required: true },
  "sentiment": { type: "\"angry\" | \"frustrated\" | \"neutral\" | \"happy\"", description: "How the customer sounds, from the triage pass. Null until it has run.", required: false },
  "category_id": { type: "integer", description: "", required: false },
  "category_name": { type: "string", description: "Snapshotted, so a deleted category leaves the ticket readable.", required: false },
  "subject": { type: "string", description: "", required: false },
  "summary": { type: "string", description: "One line from the triage pass — not the customer’s own words.", required: false },
  "name": { type: "string", description: "", required: false },
  "email": { type: "string", description: "", required: false },
  "phone": { type: "string", description: "", required: false },
  "answers": { type: "object", description: "The category’s own fields, keyed by field id.", required: false },
  "source": { type: "\"agent\" | \"card\" | \"manual\" | \"handoff\" | \"api\" | \"channel\"", description: "", required: true },
  "channel": { type: "string", description: "", required: false },
  "language": { type: "string", description: "", required: false },
  "assignee_user_id": { type: "integer", description: "", required: false },
  "rating": { type: "integer", description: "", required: false },
  "first_reply_at": { type: "string (date-time)", description: "", required: false },
  "last_customer_message_at": { type: "string (date-time)", description: "", required: false },
  "last_agent_message_at": { type: "string (date-time)", description: "", required: false },
  "promised_at": { type: "string (date-time)", description: "When the team promised to reply (the receipt's \"Expect a reply Monday morning\"). Null when no time was promised.", required: false },
  "solved_at": { type: "string (date-time)", description: "", required: false },
  "closed_at": { type: "string (date-time)", description: "", required: false },
  "reopened_count": { type: "integer", description: "How many times a customer reply brought it back.", required: false },
  "created_at": { type: "string (date-time)", description: "", required: true },
  "updated_at": { type: "string (date-time)", description: "", required: true },
  "messages": { type: "object[]", description: "", required: false }
}}
/>

### Errors

* `401` — Missing or invalid API key
* `404` — Not found
* `429` — Rate limit exceeded

Every error shares [one envelope](/docs/api/errors).

## Example

```bash
curl https://www.hey.support/api/v1/tickets/<id> \
  -H 'Authorization: Bearer hs_live_…'
```
