## 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 | Resolution text, if the ticket is closed |
| `data.context` | object · null | The original JSON passed at creation |
| `data.attachments` | array | Ticket attachments |
| `data.attachments[].id` | string | Attachment UUID |
| `data.attachments[].mime` | string | File type: `image/webp` or `image/gif` |
| `data.attachments[].sizeBytes` | number | Size in bytes |
| `data.attachments[].width` | number | Width in pixels |
| `data.attachments[].height` | number | Height in pixels |
| `data.attachments[].originalName` | string | Original file name |
| `data.attachments[].createdAt` | string | Link date (ISO 8601) |
| `data.comments` | array | Ticket comments |
| `data.comments[].id` | string | Comment UUID |
| `data.comments[].authorType` | string | `USER` or `PLATFORM` |
| `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 |

A key with the `vibe:feedback` scope additionally receives `portalDomain`, `userName`, `userId`.

## 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

**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 cannot tell "does not exist" from "exists but belongs to another" — this protects against probing other people's tickets.

**Attachments and comments come as arrays.** Unlike the list, `get` returns `attachments` and `comments` in the ticket body. 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)
