## Обновить обращение

`PATCH /v1/feedback/:id`

Меняет статус и резолюцию обращения. Полное обновление доступно ключу со скоупом `vibe:feedback`. Автор обычным ключом может только отозвать своё обращение — телом `{ "status": "WITHDRAWN" }`.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|----------|
| `id` (path) | string | да | UUID обращения |

## Поля запроса (body)

| Поле | Тип | Обяз. | Описание |
|------|-----|:-----:|----------|
| `status` | string | нет | Новый статус: `NEW`, `REVIEWING`, `AWAITING_USER`, `NEEDS_REVIEW`, `RESOLVED`, `ARCHIVED`, `WITHDRAWN` |
| `resolution` | string · null | нет | Текст резолюции. Желателен при переводе в `RESOLVED`. Явный `null` очищает поле |

## Статусы

| Статус | Значение |
|--------|----------|
| `NEW` | Обращение только создано |
| `REVIEWING` | Обращение взято в разбор |
| `AWAITING_USER` | Нужен ответ или уточнение от автора |
| `NEEDS_REVIEW` | Требует повторного разбора |
| `RESOLVED` | Обращение закрыто с резолюцией. Автору уходит письмо |
| `ARCHIVED` | Обращение закрыто без резолюции — дубликат или вне области |
| `WITHDRAWN` | Обращение отозвано автором |

## Примеры

### curl — личный ключ

```bash
curl -X PATCH https://vibecode.bitrix24.tech/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666 \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "RESOLVED",
    "resolution": "Исправлено в релизе 2026-04-19. Пустой filter теперь возвращает 200 с пустым массивом."
  }'
```

### curl — OAuth-приложение

```bash
curl -X PATCH https://vibecode.bitrix24.tech/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666 \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "RESOLVED",
    "resolution": "Исправлено в релизе 2026-04-19. Пустой filter теперь возвращает 200 с пустым массивом."
  }'
```

### JavaScript — личный ключ

```javascript
const res = await fetch(
  'https://vibecode.bitrix24.tech/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666',
  {
    method: 'PATCH',
    headers: { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' },
    body: JSON.stringify({
      status: 'RESOLVED',
      resolution: 'Исправлено в релизе 2026-04-19. Пустой filter теперь возвращает 200 с пустым массивом.',
    }),
  },
)
const { data } = await res.json()
```

### JavaScript — OAuth-приложение

```javascript
const res = await fetch(
  'https://vibecode.bitrix24.tech/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666',
  {
    method: 'PATCH',
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      status: 'RESOLVED',
      resolution: 'Исправлено в релизе 2026-04-19. Пустой filter теперь возвращает 200 с пустым массивом.',
    }),
  },
)
const { data } = await res.json()
```

## Отзыв обращения

Автор обращения может отозвать его обычным ключом, которым создал — телом строго `{ "status": "WITHDRAWN" }`. Отзыв доступен, пока обращение не закрыто.

```bash
curl -X PATCH https://vibecode.bitrix24.tech/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666 \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "status": "WITHDRAWN" }'
```

## Поля ответа

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе |
| `data.id` | string | UUID обращения |
| `data.category` | string | Категория |
| `data.title` | string | Заголовок |
| `data.status` | string | Обновлённый статус |
| `data.resolution` | string · null | Текущая резолюция |
| `data.resolvedAt` | string · null | Дата закрытия. Проставляется при переходе в `RESOLVED` или `WITHDRAWN` и обнуляется при возврате в активный статус из любого закрытого — `RESOLVED`, `WITHDRAWN` или `ARCHIVED` |

## Пример ответа

```json
{
  "success": true,
  "data": {
    "id": "a1b2c3d4-1111-2222-3333-444455556666",
    "category": "BUG",
    "title": "POST /v1/deals/search возвращает 500 при пустом filter",
    "status": "RESOLVED",
    "resolution": "Исправлено в релизе 2026-04-19. Пустой filter теперь возвращает 200 с пустым массивом.",
    "resolvedAt": "2026-04-19T12:00:00.000Z"
  }
}
```

## Пример ответа при ошибке

403 — обновление без скоупа `vibe:feedback`:

```json
{
  "success": false,
  "error": {
    "code": "FEEDBACK_SCOPE_REQUIRED",
    "message": "Requires management key or vibe:feedback scope to update feedback"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 403 | `FEEDBACK_SCOPE_REQUIRED` | Обновление статуса или резолюции без скоупа `vibe:feedback` |
| 404 | `NOT_FOUND` | Обращение не существует или недоступно ключу |
| 409 | `FEEDBACK_CLOSED` | Автор пытается отозвать уже закрытое обращение (`RESOLVED`, `ARCHIVED` или `WITHDRAWN`) |
| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |

Полный список общих ошибок API — [Ошибки](/docs/errors).

## Известные особенности

**Перевод в `RESOLVED` уведомляет автора.** При закрытии проставляются `resolvedAt` и `resolvedBy`, а автору уходит письмо с текстом резолюции, если в профиле указана почта. Переводите в `RESOLVED` только после того, как исправление доступно — иначе автор получит письмо «исправлено» раньше самого исправления.

**Возврат в активный статус обнуляет отметку о закрытии, но не текст резолюции.** Переход из любого закрытого статуса — `RESOLVED`, `WITHDRAWN` или `ARCHIVED` — в один из активных (`NEW`, `REVIEWING`, `AWAITING_USER`, `NEEDS_REVIEW`) обнуляет `resolvedAt` и `resolvedBy`. Поле `resolution` не меняется: если вы его не передали, прежний текст остаётся — у обращения, возвращённого из `ARCHIVED`, сохраняется и причина архивации. Чтобы заменить текст, передайте `resolution` в том же запросе; чтобы очистить поле — передайте `"resolution": null`.

Обратное направление правило не затрагивает: переход **в** `ARCHIVED` отметку о закрытии сохраняет — архивация хранит историю решения. Переход между активными статусами её тоже не трогает.

**Комментарий, переоткрывающий обращение, ведёт себя так же.** [Добавление комментария](./comments.md) с активным статусом обнуляет `resolvedAt` и `resolvedBy` и не трогает `resolution` — ровно как обновление. Разница в другом: комментарий ещё и попадает в ленту обращения, а `resolution` перезаписывает только тогда, когда сам закрывает обращение.

**Терминальность зависит от действия.** Для автора обычным ключом `WITHDRAWN` и `ARCHIVED` — терминальные состояния: отозвать или прокомментировать такое обращение нельзя. `RESOLVED` терминален только для отзыва — [комментарий автора](./comments.md) возвращает решённое обращение в работу. Ключ со скоупом `vibe:feedback` может сменить статус любого закрытого обращения.

## Смотрите также

- [Получить обращение](/docs/feedback/get)
- [Добавить комментарий](/docs/feedback/comments)
- [Обратная связь](/docs/feedback)
- [Ошибки](/docs/errors)
