Для AI-агентов: markdown этой страницы — /docs-content/feedback/submit.md индекс документации — /llms.txt

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

POST /v1/feedback

Создаёт обращение в трекере обратной связи. Принимает любой действительный ключ — портал и автор определяются по владельцу ключа. Тело передаётся плоско, без обёртки fields.

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

Поле Тип Обяз. Описание
category string да Одно из: BUG, SUGGESTION, DOCS, CHAT, BOTS, OTHER. Регистр не важен
title string да Заголовок, 3–200 символов
body string да Описание, 10–20000 символов. Нижняя граница снимается, если приложены вложения через attachmentIds
context object нет Необязательный JSON-объект до 10 КБ — эндпоинт, тело запроса, requestId, версия инструмента. Верхний уровень должен быть объектом: массивы, строки, числа, boolean и null отклоняются
attachmentIds array нет До 5 идентификаторов заранее загруженных вложений. Как загрузить — Загрузить вложение

Категории

Категория Когда выбирать
BUG Поведение расходится с документацией или ломается
SUGGESTION Предложение улучшения или новой возможности
DOCS Документация неполная, устарела или расходится с поведением API
CHAT Обратная связь по чат-платформе — сообщения, диалоги, файлы
BOTS Обратная связь по бот-платформе — регистрация, события, команды
OTHER Не подходит под остальные категории

Примеры

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

Terminal
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",
      "httpStatus": 500,
      "requestId": "req_abc123"
    }
  }'

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

Terminal
curl -X POST https://vibecode.bitrix24.tech/v1/feedback \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -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",
      "httpStatus": 500,
      "requestId": "req_abc123"
    }
  }'

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

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/feedback', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    category: 'BUG',
    title: 'POST /v1/deals/search возвращает 500 при пустом filter',
    body: 'При вызове POST /v1/deals/search с телом {"filter":{}} приходит 500. Ожидал пустой массив или 400.',
    context: { endpoint: '/v1/deals/search', httpStatus: 500, requestId: 'req_abc123' },
  }),
})

const { data } = await res.json()
console.log('Номер обращения:', 'VB-' + data.id.slice(0, 8))

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

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/feedback', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    category: 'BUG',
    title: 'POST /v1/deals/search возвращает 500 при пустом filter',
    body: 'При вызове POST /v1/deals/search с телом {"filter":{}} приходит 500. Ожидал пустой массив или 400.',
    context: { endpoint: '/v1/deals/search', httpStatus: 500, requestId: 'req_abc123' },
  }),
})

const { data } = await res.json()

Поля ответа

Поле Тип Описание
success boolean Всегда true при успехе
data.id string UUID обращения. Номер для человека — VB- плюс первые 8 символов
data.category string Категория обращения
data.title string Заголовок
data.status string Начальный статус — всегда NEW
data.createdAt string Дата создания в формате ISO 8601

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

JSON
{
  "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"
  }
}

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

400 — нарушена валидация:

JSON
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "title must be 3-200 characters"
  }
}

Ошибки

HTTP Код Описание
400 VALIDATION_ERROR category, title, body или context не прошли валидацию
409 DUPLICATE_FEEDBACK Похожее обращение уже отправлено недавно. В error.existingTicketId — существующее обращение
409 OPEN_TICKET_EXISTS По этой теме уже есть открытое обращение. В error.existingTicketId — оно же
429 FEEDBACK_QUOTA_EXCEEDED Превышена суточная квота на создание обращений (на портал или на ключ). Возвращает заголовок Retry-After и поля scope, limit, retryAfter
401 MISSING_API_KEY Не передан заголовок X-Api-Key
429 RATE_LIMITED Больше 5 запросов в минуту с одного ключа

Полный список общих ошибок API — Ошибки.

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

Источник фиксируется автоматически. У обращений через API поле source равно api, у отправленных с формы в кабинете — ui. Портал и автор берутся из владельца ключа, вводить их вручную не нужно.

Контекст ускоряет разбор. В context кладут объект JSON с requestId, версиями, телом запроса и ответом сервера — до 10 КБ. Переданный верхнеуровневый массив, скаляр (string, number, boolean) или null отклоняется с 400 VALIDATION_ERROR; без context или с {} обращение принимается.

Защита от дублей и квота. Похожий по содержанию запрос отклоняется как 409 DUPLICATE_FEEDBACK, а открытое обращение с тем же заголовком — как 409 OPEN_TICKET_EXISTS. В обоих случаях error.existingTicketId указывает на существующее обращение, если у ключа есть к нему доступ. Отдельно действует суточная квота на портал и на ключ — при превышении приходит 429 FEEDBACK_QUOTA_EXCEEDED с заголовком Retry-After. Это не то же самое, что лимит 5 запросов в минуту (429 RATE_LIMITED).

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