---
title: "Get the internal history of a ticket"
url: https://docs.gleap.ai/en/reference/rest-api/get-ticket-history-for-ticket
method: GET
path: "/tickets/{ticketId}/history"
api: "API Reference"
tag: "Ticket"
operationId: "GetTicketHistoryForTicket"
updatedAt: "2026-11-01T18:40:15.677Z"
language: en
---

# Get the internal history of a ticket

`GET https://api.gleap.io/v3/tickets/{ticketId}/history`

Every internal history entry for a ticket — status, assignee, team, priority, type, tag, contact, due-date and title changes, plus workflow starts, agent handoffs and mirrored integration status updates. Returned oldest first in a comment-compatible shape so the conversation feed can splice them inline. Not paginated: `truncated` is true when the ticket has more entries than `limit` (default 1000, max 5000); the oldest entries are the ones left out.

Prior to August 2026 these entries were returned by `GET /messages` as `FEEDBACK_UPDATED` and system messages; this endpoint is now their only source. The shape is unchanged — a status change, for example, is `{ type: 'FEEDBACK_UPDATED', data: { type: 'STATUS', value: <status> } }` with the acting user on `user`.

**Entry types:**

-   `FEEDBACK_UPDATED` with `data.type`: `STATUS`, `PROCESSING_USER`, `PROCESSING_TEAM`, `PRIORITY`, `TYPE`, `SESSION`, `SESSIONS_ADDED`, `SESSIONS_REMOVED`, `ARCHIVED`, `RESTORED`, `TAGS_ADDED`, `TAGS_REMOVED`, `DUE_DATE`, `TITLE`, `TICKET_LINKED`, `TICKET_UNLINKED`, `DUPLICATE`, `QUEUED`, `MARKED_AS_SPAM`, `EMAIL_RELAYED`.
-   `SYSTEM_MESSAGE` with `data.type` `WORKFLOW_MESSAGE` or `AGENT_HANDOFF_TO_HUMAN`.
-   `INTEGRATION_STATUS_UPDATED` (no `data.type`).

Entries carry the new value only; the previous value is the one in the entry before. `PROCESSING_TEAM` has `value: { _id, name }` (read `_id`; some entries also carry `id`), or `value: null` when the team was removed. An entry's `id` is stored with it and never changes, so it can be used as a deduplication key.

Entries are retained for at least 180 days from the event and can remain available somewhat longer.

## Authorization

- `Authorization` (header, required): `Bearer <token>`

## Path parameters

- `ticketId` (string, required)

## Query parameters

- `limit` (number<double>)

## Headers

- `project` (string, required)

## Example request

```bash
curl --request GET \
  --url 'https://api.gleap.io/v3/tickets/{ticketId}/history' \
  --header 'Authorization: Bearer <token>' \
  --header 'project: <project>'
```

## Responses

### 200 (`application/json`)

Ok

```json
{
  "items": [
    {
      "id": "689b1f77bcf86cd799439031",
      "ticket": "507f1f77bcf86cd799439011",
      "type": "FEEDBACK_UPDATED",
      "data": {
        "type": "STATUS",
        "value": "INPROGRESS"
      },
      "user": {
        "id": "507f1f77bcf86cd799439012",
        "email": "support@example.com",
        "firstName": "John",
        "lastName": "Doe"
      },
      "bot": false,
      "createdAt": "2026-08-07T10:30:00.000Z",
      "ticketHistoryRow": true
    },
    {
      "id": "689b1f77bcf86cd799439032",
      "ticket": "507f1f77bcf86cd799439011",
      "type": "FEEDBACK_UPDATED",
      "data": {
        "type": "PROCESSING_USER",
        "value": {
          "id": "507f1f77bcf86cd799439012",
          "firstName": "John",
          "lastName": "Doe"
        }
      },
      "fallbackUser": {
        "username": "System"
      },
      "bot": false,
      "createdAt": "2026-08-07T10:31:00.000Z",
      "ticketHistoryRow": true
    }
  ],
  "truncated": false
}
```
