## Get a ticket

`GET /v1/feedback/:id`

Returns a single ticket by ID with all the list fields plus `context`, attachments, and comments.

## Parameters

| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `id` (path) | string | yes | Ticket UUID. Get it from the [ticket list](./list.md) or the [create](./submit.md) response |

## Examples

### curl — personal key

```bash
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://vibecode.bitrix24.com/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666"
```

### curl — OAuth application

```bash
curl -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  "https://vibecode.bitrix24.com/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666"
```

### JavaScript — personal key

```javascript
const res = await fetch(
  'https://vibecode.bitrix24.com/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666',
  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } },
)
const { data } = await res.json()
```

### JavaScript — OAuth application

```javascript
const res = await fetch(
  'https://vibecode.bitrix24.com/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666',
  { headers: { 'X-Api-Key': 'YOUR_APP_KEY', 'Authorization': 'Bearer USER_SESSION_TOKEN' } },
)
const { data } = await res.json()
```

## Response fields

| Field | Type | Description |
|-------|------|-------------|
| `success` | boolean | Always `true` on success |
| `data.id` | string | Ticket UUID |
| `data.category` | string | Category |
| `data.title` | string | Title |
| `data.body` | string | Description |
| `data.status` | string | Current status |
| `data.source` | string | `api` or `ui` |
| `data.resolution` | string · null | The verdict recorded at the last closure. Empty on a ticket that was never closed. Reopening the ticket keeps the verdict, so the field can be non-empty on an active ticket — for the team's latest answer, read the comment thread |
| `data.context` | object · null | The original JSON passed at creation |
| `data.attachments` | array | Ticket attachments |
| `data.attachments[].id` | string | Attachment UUID |
| `data.attachments[].kind` | string | Attachment class: `IMAGE` or `DOCUMENT` |
| `data.attachments[].mime` | string | File type. For an image — `image/webp` or `image/gif`. For a document — the type by extension, for example `text/plain` or `application/zip` |
| `data.attachments[].sizeBytes` | number | Size in bytes |
| `data.attachments[].width` | number | Width in pixels. `0` for a document |
| `data.attachments[].height` | number | Height in pixels. `0` for a document |
| `data.attachments[].originalName` | string · null | Original file name. `null` if the image was uploaded without a file name. A document without a name gets `attachment.<extension>` |
| `data.attachments[].createdAt` | string | Date the file was uploaded (ISO 8601). Attaching the file to a ticket or a comment does not change this date, so it can be earlier than the ticket's or the comment's creation date |
| `data.comments` | array | Ticket comments |
| `data.comments[].id` | string | Comment UUID |
| `data.comments[].authorType` | string | `USER` or `PLATFORM` |
| `data.comments[].authorName` | string · null | Name of the comment author. Filled in for a key with the `vibe:feedback` scope and for a management key; others receive `null` |
| `data.comments[].body` | string | Comment text |
| `data.comments[].createdAt` | string | Creation date (ISO 8601) |
| `data.comments[].attachments` | array | Comment attachments, same structure as `data.attachments[]` |
| `data.createdAt` | string | Creation date (ISO 8601) |
| `data.resolvedAt` | string · null | Closing date, if any |
| `data.portalId` | string | UUID of the Bitrix24 account the ticket was sent from |
| `data.portalDomain` | string | Domain of that Bitrix24 account |
| `data.userId` | string | UUID of the user who sent the ticket. Absent for a ticket without an author, for example when the author was deleted |
| `data.userName` | string | Name of that user. Comes together with `userId` |
| `data.securityFlags` | object · null | Internal moderation marks. `null` when there are none |
| `data.gitlabIssueIid` | number · null | Issue number in the team's tracker if the ticket was handed over to developers. Otherwise `null` |
| `data.exportedAt` | string · null | When the ticket was handed over to developers (ISO 8601). Otherwise `null` |

The fields from `portalId` to `exportedAt` are returned only to a key with the `vibe:feedback` scope and to a management key.

## Response example

```json
{
  "success": true,
  "data": {
    "id": "a1b2c3d4-1111-2222-3333-444455556666",
    "category": "BUG",
    "title": "POST /v1/deals/search returns 500 on empty filter",
    "body": "Calling POST /v1/deals/search with body {\"filter\":{}} gives a 500.",
    "status": "NEW",
    "source": "api",
    "resolution": null,
    "context": { "endpoint": "/v1/deals/search", "httpStatus": 500 },
    "attachments": [],
    "comments": [],
    "createdAt": "2026-04-19T10:30:00.000Z",
    "resolvedAt": null
  }
}
```

## Error response example

404 — ticket not found or not accessible to the key:

```json
{
  "success": false,
  "error": {
    "code": "NOT_FOUND",
    "message": "Feedback not found"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|------|-------------|
| 404 | `NOT_FOUND` | The ticket does not exist or is not accessible to the key |
| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not passed |

For the full list of common API errors, see [Errors](/docs/errors).

## Known specifics

**Which tickets a key sees.** A key without the `vibe:feedback` scope receives only the tickets it sent itself. A key with the scope sees every ticket of its Bitrix24 account, and a management key sees all tickets.

**A single response for "missing" and "someone else's".** A non-existent ticket and a ticket not accessible to the key return the same `404 NOT_FOUND`. The response code does not distinguish "does not exist" from "exists but belongs to someone else" — this protects against probing other people's tickets.

**Attachments and comments come as arrays.** Unlike the list, `get` returns `attachments` and `comments` inside the ticket object. For a new ticket both arrays are empty.

## See also

- [List tickets](/docs/feedback/list)
- [Add a comment](/docs/feedback/comments)
- [Update a ticket](/docs/feedback/update)
- [Feedback](/docs/feedback)
