Для AI-агентов: markdown этой страницы — /docs-content/feedback.md индекс документации — /llms.txt
Обратная связь
Программный канал обратной связи Вайбкод. AI-модели, интеграции и внешние инструменты отправляют сообщения об ошибках, предложения и вопросы прямо из кода — с контекстом ошибки, окружением и шагами воспроизведения. Обращения, отправленные через API, попадают в тот же трекер, что и обращения с формы в кабинете.
Базовый URL: https://vibecode.bitrix24.tech/v1 | Авторизация: X-Api-Key
Уровни доступа | Быстрый старт | Полный пример | Справочник эндпоинтов | Коды ошибок
Уровни доступа
Права зависят от того, есть ли у ключа скоуп vibe:feedback.
| Ключ | Создание | Чтение | Обновление и комментарии |
|---|---|---|---|
КлючОбычный ключ (vibe_api_ / vibe_app_) |
Созданиеда | Чтениесвои обращения | Обновление и комментариитолько отзыв своего обращения |
КлючКлюч со скоупом vibe:feedback |
Созданиеда | Чтениевсе обращения своего портала | Обновление и комментариида, в рамках своего портала |
| КлючКлюч управления | Созданиенет | Чтениеобращения всех порталов | Обновление и комментариида |
Скоуп vibe:feedback не выдаётся ключу автоматически — его включают явно при создании или обновлении ключа. Скоуп даёт расширенный доступ на чтение и обновление всех обращений портала, а не только своих. Выдаётся адресно — например, ключу, который разбирает очередь обращений в службе поддержки.
Быстрый старт
Отправка обращения об ошибке с контекстом запроса:
curl -X POST https://vibecode.bitrix24.tech/v1/feedback \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"category": "BUG",
"title": "POST /v1/deals/search возвращает 500 при пустом filter",
"body": "При вызове POST /v1/deals/search с телом {\"filter\":{}} приходит 500. Ожидал пустой массив или 400.",
"context": {
"endpoint": "/v1/deals/search",
"request": {"filter": {}},
"httpStatus": 500,
"requestId": "req_abc123"
}
}'
Ответ:
{
"success": true,
"data": {
"id": "a1b2c3d4-1111-2222-3333-444455556666",
"category": "BUG",
"title": "POST /v1/deals/search возвращает 500 при пустом filter",
"status": "NEW",
"createdAt": "2026-04-19T10:30:00.000Z"
}
}
Номер обращения, который видит пользователь и поддержка — это VB- плюс первые 8 символов id. Для примера выше это VB-a1b2c3d4. Сохраните его, чтобы сослаться на обращение в переписке.
Полный пример
Отправка обращения, проверка его в списке и отзыв, если оно создано по ошибке.
const BASE = 'https://vibecode.bitrix24.tech/v1'
const headers = { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' }
// 1. Отправить обращение
const created = await fetch(`${BASE}/feedback`, {
method: 'POST',
headers,
body: JSON.stringify({
category: 'DOCS',
title: 'Опечатка в разделе про фильтрацию',
body: 'На странице /docs/filtering в примере пропущена закрывающая скобка.',
}),
}).then(r => r.json())
const ticketId = created.data.id
console.log('Обращение создано:', 'VB-' + ticketId.slice(0, 8))
// 2. Найти его в своём списке
const list = await fetch(`${BASE}/feedback?category=DOCS&limit=5`, { headers })
.then(r => r.json())
console.log('Всего обращений категории DOCS:', list.total)
// 3. Отозвать, если создано по ошибке
await fetch(`${BASE}/feedback/${ticketId}`, {
method: 'PATCH',
headers,
body: JSON.stringify({ status: 'WITHDRAWN' }),
})
Справочник эндпоинтов
| Метод | Путь | Описание |
|---|---|---|
| МетодPOST | Путь/v1/feedback |
ОписаниеОтправить обращение |
| МетодGET | Путь/v1/feedback |
ОписаниеСписок обращений с фильтрами и пагинацией |
| МетодGET | Путь/v1/feedback/:id |
ОписаниеОдно обращение по ID |
| МетодPATCH | Путь/v1/feedback/:id |
ОписаниеОбновить статус и резолюцию, отозвать обращение |
| МетодPOST | Путь/v1/feedback/:id/comments |
ОписаниеДобавить комментарий к обращению |
| МетодPOST | Путь/v1/feedback/attachments |
ОписаниеЗагрузить вложение к обращению или комментарию |
| МетодGET | Путь/v1/feedback/:id/attachments/:attId/file |
ОписаниеСкачать привязанное вложение |
| МетодGET | Путь/v1/feedback/:id/attachments/:attId/thumb |
ОписаниеПревью привязанного изображения |
| МетодDELETE | Путь/v1/feedback/:id/attachments/:attId |
ОписаниеУдалить привязанное вложение |
Windows / PowerShell и UTF-8
Кириллица в title, body или resolution может превратиться в знаки вопроса (?), если запрос отправляется из Windows PowerShell без явной сериализации в UTF-8. Это не проблема отображения на стороне сервера — кириллические байты теряются ещё до отправки HTTP-запроса, на стороне клиента.
Причина. По умолчанию PowerShell перекодирует строку из параметра -Body (Invoke-WebRequest / Invoke-RestMethod) в системную кодировку windows-1251, и кириллица теряется ещё до сборки запроса. Заголовок Content-Type: charset=utf-8 здесь не помогает — к моменту его применения исходные байты уже потеряны.
Решение. Передавайте тело запроса массивом байтов UTF-8.
# 1. Кодировка вывода консоли — на кодирование тела запроса не влияет
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
# 2. Собрать JSON и преобразовать его в массив UTF-8 байтов
$body = @{
category = 'DOCS'
title = 'Опечатка в документации'
body = 'В разделе про фильтрацию в примере пропущена закрывающая скобка.'
} | ConvertTo-Json -Compress
$bytes = [System.Text.Encoding]::UTF8.GetBytes($body)
# 3. Передать в -Body массив байтов (не строку) и указать кодировку в Content-Type
Invoke-WebRequest `
-Uri 'https://vibecode.bitrix24.tech/v1/feedback' `
-Method POST `
-Headers @{
'X-Api-Key' = 'YOUR_API_KEY'
'Content-Type' = 'application/json; charset=utf-8'
} `
-Body $bytes
Распространённые ошибки:
- Сохранять
.ps1с UTF-8 BOM — старые версии PowerShell могут не разобрать сам скрипт. - Передавать в
-Bodyстроку (-Body $body) вместо массива байтов (-Body $bytes) — строка повторно перекодируется через системную кодировку. - Полагаться только на
Content-Type: application/json; charset=utf-8безUTF8.GetBytes— этот заголовок не восстанавливает потерянные байты, а лишь объявляет серверу заявленную кодировку тела.
Node.js (fetch) и Python (requests) кодируют тело в UTF-8 сами, дополнительных шагов не требуется. Проблема специфична для PowerShell.
Коды ошибок
| HTTP | Код | Описание |
|---|---|---|
| HTTP400 | КодVALIDATION_ERROR |
Описаниеcategory, title, body или context не прошли валидацию |
| HTTP400 | КодINVALID_FILTER_VALUE |
ОписаниеВ списке передано неизвестное значение status или category |
| HTTP400 | КодINVALID_INPUT |
ОписаниеВ списке exported не равен true или false |
| HTTP400 | КодNO_FILE |
ОписаниеВ запрос на загрузку вложения не передан файл |
| HTTP400 | КодINVALID_MIME |
ОписаниеРасширение файла вложения не входит в список допустимых |
| HTTP400 | КодMIME_MISMATCH |
ОписаниеСодержимое файла вложения не соответствует его типу |
| HTTP400 | КодINVALID_FILE_EMPTY |
ОписаниеФайл вложения пустой |
| HTTP400 | КодIMAGE_DECODE_FAILED |
ОписаниеИзображение не удалось разобрать |
| HTTP400 | КодIMAGE_TOO_MANY_PIXELS |
ОписаниеВ изображении больше 24 миллионов пикселей |
| HTTP400 | КодTOO_MANY_FRAMES |
ОписаниеВ анимации больше 30 кадров |
| HTTP400 | КодREASON_INVALID |
ОписаниеПричина удаления вложения короче 3 или длиннее 500 символов |
| HTTP402 | КодACCOUNT_FROZEN |
ОписаниеБаланс заморожен. Приходит на загрузку, скачивание и удаление вложения и на обновление обращения — создание, список, чтение и комментарий работают и под заморозкой |
| HTTP403 | КодFEEDBACK_SCOPE_REQUIRED |
ОписаниеОбновление или комментарий к чужому обращению без скоупа vibe:feedback |
| HTTP403 | КодMANAGEMENT_KEY_READ_ONLY |
ОписаниеКлюч управления создаёт обращение или загружает вложение |
| HTTP403 | КодDELETE_NOT_ALLOWED |
ОписаниеВложение удаляют после того, как другая сторона уже ответила |
| HTTP403 | КодWRITE_BLOCKED_READONLY_KEY |
ОписаниеКлюч только для чтения, а запрос что-то записывает — см. права доступа |
| HTTP404 | КодNOT_FOUND |
ОписаниеОбращение не существует или недоступно ключу |
| HTTP409 | КодFEEDBACK_CLOSED |
ОписаниеДействие автора над закрытым обращением. Комментарий — на ARCHIVED и WITHDRAWN, а на RESOLVED комментарий автора обращение переоткрывает. Отзыв — на RESOLVED, ARCHIVED и WITHDRAWN |
| HTTP409 | КодDUPLICATE_FEEDBACK |
ОписаниеПохожее обращение уже отправлено недавно |
| HTTP409 | КодOPEN_TICKET_EXISTS |
ОписаниеПо теме уже есть открытое обращение |
| HTTP413 | КодIMAGE_TOO_LARGE |
ОписаниеФайл вложения превышает 10 МБ |
| HTTP429 | КодFEEDBACK_QUOTA_EXCEEDED |
ОписаниеПревышена суточная квота на создание обращений (портал или ключ), с заголовком Retry-After |
| HTTP429 | КодRATE_LIMITED |
ОписаниеСоздание обращения: больше 5 запросов в минуту с одного ключа. Это суммарный лимит платформы; действующее значение приходит в заголовке X-RateLimit-Limit |
| HTTP429 | КодRATE_LIMITED |
ОписаниеЗагрузка вложения: больше 5 загрузок в минуту с одного ключа. Счётчик у загрузок свой. Это суммарный лимит платформы; действующее значение приходит в заголовке X-RateLimit-Limit |
Переписка работает и при замороженном балансе. Заморозка платёжного аккаунта отвечает 402 ACCOUNT_FROZEN, но четыре операции обращений из-под неё выведены: создать обращение, получить список, открыть обращение и ответить команде. Сообщить о проблеме можно ровно тогда, когда это нужнее всего, и продолжить разговор, если поддержка попросит уточнений.
Под заморозкой остаются загрузка, скачивание и удаление вложения, а также обновление обращения — там приходит 402 ACCOUNT_FROZEN. Суточные квоты на создание обращений заморозка не отменяет.
Полный список общих ошибок API — Ошибки.