For AI agents: markdown of this page — /docs-content-en/feedback/update.md documentation index — /llms.txt
Update a ticket
PATCH /v1/feedback/:id
Changes a ticket's status and resolution. A full update is available to a key with the vibe:feedback scope. An author with a regular key can only withdraw their own ticket — with the body { "status": "WITHDRAWN" }.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id (path) |
string | yes | Ticket UUID |
Request fields (body)
| Field | Type | Required | Description |
|---|---|---|---|
status |
string | no | New status: NEW, REVIEWING, AWAITING_USER, NEEDS_REVIEW, RESOLVED, ARCHIVED, WITHDRAWN |
resolution |
string · null | no | Resolution text. Recommended when moving to RESOLVED. An explicit null clears the field |
Statuses
| Status | Meaning |
|---|---|
NEW |
The ticket was just created |
REVIEWING |
The ticket is being triaged |
AWAITING_USER |
A reply or clarification from the author is needed |
NEEDS_REVIEW |
Requires another round of triage |
RESOLVED |
The ticket is closed with a resolution. An email is sent to the author |
ARCHIVED |
The ticket is closed without a resolution — a duplicate or out of scope |
WITHDRAWN |
The ticket was withdrawn by the author |
Examples
curl — personal key
curl -X PATCH https://vibecode.bitrix24.com/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666 \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "RESOLVED",
"resolution": "Fixed in release 2026-04-19. Empty filter now returns 200 with an empty array."
}'
curl — OAuth application
curl -X PATCH https://vibecode.bitrix24.com/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": "Fixed in release 2026-04-19. Empty filter now returns 200 with an empty array."
}'
JavaScript — personal key
const res = await fetch(
'https://vibecode.bitrix24.com/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: 'Fixed in release 2026-04-19. Empty filter now returns 200 with an empty array.',
}),
},
)
const { data } = await res.json()
JavaScript — OAuth application
const res = await fetch(
'https://vibecode.bitrix24.com/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: 'Fixed in release 2026-04-19. Empty filter now returns 200 with an empty array.',
}),
},
)
const { data } = await res.json()
Withdrawing a ticket
The ticket author can withdraw it using the same regular key it was created with — the body must be exactly { "status": "WITHDRAWN" }. Withdrawal is available as long as the ticket is not closed.
curl -X PATCH https://vibecode.bitrix24.com/v1/feedback/a1b2c3d4-1111-2222-3333-444455556666 \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "status": "WITHDRAWN" }'
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.status |
string | Updated status |
data.resolution |
string · null | Current resolution |
data.resolvedAt |
string · null | Closing date. Set on transition to RESOLVED or WITHDRAWN, and cleared when the ticket returns to an active status from any closed one — RESOLVED, WITHDRAWN, or ARCHIVED |
Response example
{
"success": true,
"data": {
"id": "a1b2c3d4-1111-2222-3333-444455556666",
"category": "BUG",
"title": "POST /v1/deals/search returns 500 on empty filter",
"status": "RESOLVED",
"resolution": "Fixed in release 2026-04-19. Empty filter now returns 200 with an empty array.",
"resolvedAt": "2026-04-19T12:00:00.000Z"
}
}
Error response example
403 — update without the vibe:feedback scope:
{
"success": false,
"error": {
"code": "FEEDBACK_SCOPE_REQUIRED",
"message": "Requires management key or vibe:feedback scope to update feedback"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 403 | FEEDBACK_SCOPE_REQUIRED |
Updating status or resolution without the vibe:feedback scope |
| 404 | NOT_FOUND |
The ticket does not exist or is not accessible to the key |
| 409 | FEEDBACK_CLOSED |
The author tries to withdraw an already closed ticket (RESOLVED, ARCHIVED, or WITHDRAWN) |
| 401 | MISSING_API_KEY |
The X-Api-Key header was not passed |
For the full list of common API errors, see Errors.
Known specifics
Moving to RESOLVED notifies the author. On closing, resolvedAt and resolvedBy are set, and the author receives an email with the resolution text if their profile has an email address. Move to RESOLVED only after the fix is available — otherwise the author gets a "fixed" email before the fix itself.
Returning to an active status clears the closing mark, but not the resolution text. A transition from any closed status — RESOLVED, WITHDRAWN, or ARCHIVED — to one of the active ones (NEW, REVIEWING, AWAITING_USER, NEEDS_REVIEW) clears resolvedAt and resolvedBy. The resolution field does not change: if you did not pass it, the previous text stays — a ticket returning from ARCHIVED keeps its archive reason as well. To replace the text, pass resolution in the same request; to clear the field, pass "resolution": null.
The rule does not apply in the opposite direction: a transition to ARCHIVED keeps the closing mark — archiving preserves the resolution history. A transition between active statuses does not touch it either.
A comment that reopens a ticket behaves the same way. Adding a comment with an active status clears resolvedAt and resolvedBy and leaves resolution alone — exactly like an update. The difference lies elsewhere: a comment also lands in the ticket thread, and it overwrites resolution only when the comment itself closes the ticket.
Terminal states depend on the action. For an author with a regular key, WITHDRAWN and ARCHIVED are terminal states: such a ticket can be neither withdrawn nor commented on. RESOLVED is terminal for withdrawal only — an author comment brings a resolved ticket back into the queue. A key with the vibe:feedback scope can change the status of any closed ticket.