For AI agents: markdown of this page — /docs-content-en/feedback/endpoints.md documentation index — /llms.txt

Endpoints of the "Feedback" section

Submitting tickets to the feedback tracker, reading and filtering, updating status and resolution, comments, and attachments. Switch methods with the tabs — each has its own parameters, response fields, and error codes.

Base URL: https://vibecode.bitrix24.com/v1 | Authorization: X-Api-Key

Submit a ticket

POST /v1/feedback

Creates a ticket in the feedback tracker. Accepts any valid key — the Bitrix24 account and author are determined from the key owner. The body is passed flat, without a fields wrapper.

Request fields (body)

Field Type Required Description
category string yes One of: BUG, SUGGESTION, DOCS, CHAT, BOTS, OTHER. Case-insensitive
title string yes Title, 3–200 characters
body string yes Description, 10–20000 characters. The lower bound is lifted when attachments are provided via attachmentIds
context object no Optional JSON object up to 10 KB — endpoint, request body, requestId, tool version. The top level must be an object: arrays, strings, numbers, booleans, and null are rejected
attachmentIds array no Up to 5 IDs of pre-uploaded attachments. How to upload — Upload an attachment

Categories

Category When to choose
BUG Behavior diverges from the documentation or is broken
SUGGESTION A proposal for an improvement or a new capability
DOCS Documentation is incomplete, outdated, or diverges from API behavior
CHAT Feedback about the chat platform — messages, dialogs, files
BOTS Feedback about the bot platform — registration, events, commands
OTHER Does not fit the other categories

Examples

curl — personal key

Terminal
curl -X POST https://vibecode.bitrix24.com/v1/feedback \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "category": "BUG",
    "title": "POST /v1/deals/search returns 500 on empty filter",
    "body": "Calling POST /v1/deals/search with body {\"filter\":{}} gives a 500. Expected an empty array or 400.",
    "context": {
      "endpoint": "/v1/deals/search",
      "httpStatus": 500,
      "requestId": "req_abc123"
    }
  }'

curl — OAuth application

Terminal
curl -X POST https://vibecode.bitrix24.com/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 returns 500 on empty filter",
    "body": "Calling POST /v1/deals/search with body {\"filter\":{}} gives a 500. Expected an empty array or 400.",
    "context": {
      "endpoint": "/v1/deals/search",
      "httpStatus": 500,
      "requestId": "req_abc123"
    }
  }'

JavaScript — personal key

javascript
const res = await fetch('https://vibecode.bitrix24.com/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 returns 500 on empty filter',
    body: 'Calling POST /v1/deals/search with body {"filter":{}} gives a 500. Expected an empty array or 400.',
    context: { endpoint: '/v1/deals/search', httpStatus: 500, requestId: 'req_abc123' },
  }),
})

const { data } = await res.json()
console.log('Ticket number:', 'VB-' + data.id.slice(0, 8))

JavaScript — OAuth application

javascript
const res = await fetch('https://vibecode.bitrix24.com/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 returns 500 on empty filter',
    body: 'Calling POST /v1/deals/search with body {"filter":{}} gives a 500. Expected an empty array or 400.',
    context: { endpoint: '/v1/deals/search', httpStatus: 500, requestId: 'req_abc123' },
  }),
})

const { data } = await res.json()

Response fields

Field Type Description
success boolean Always true on success
data.id string Ticket UUID. The human-readable number is VB- plus the first 8 characters
data.category string Ticket category
data.title string Title
data.status string Initial status — always NEW
data.createdAt string Creation date in ISO 8601 format

Response example

JSON
{
  "success": true,
  "data": {
    "id": "a1b2c3d4-1111-2222-3333-444455556666",
    "category": "BUG",
    "title": "POST /v1/deals/search returns 500 on empty filter",
    "status": "NEW",
    "createdAt": "2026-04-19T10:30:00.000Z"
  }
}

Error response example

400 — validation failed:

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

Errors

HTTP Code Description
400 VALIDATION_ERROR category, title, body, or context failed validation
409 DUPLICATE_FEEDBACK A similar ticket was submitted recently. error.existingTicketId points to the existing ticket
409 OPEN_TICKET_EXISTS An open ticket on this topic already exists. error.existingTicketId points to it
429 FEEDBACK_QUOTA_EXCEEDED The daily quota for creating tickets is exceeded (per Bitrix24 account or per key). Returns a Retry-After header and the scope, limit, retryAfter fields
401 MISSING_API_KEY The X-Api-Key header was not passed
429 RATE_LIMITED More than 5 requests per minute from one key. This is the platform-wide cap and it is divided across the backend replicas, so the effective value arrives in the X-RateLimit-Limit header

For the full list of common API errors, see Errors.

Known specifics

The source is recorded automatically. Tickets created via the API have source set to api; those submitted from the form in your Vibecode account have ui. The Bitrix24 account and author are taken from the key owner; you do not need to enter them manually.

Context speeds up triage. Put a JSON object into context with requestId, versions, the request body, and the server response — up to 10 KB. A top-level array, scalar (string, number, boolean), or null is rejected with 400 VALIDATION_ERROR; a ticket with no context, or with {}, is accepted.

Duplicate protection and quota. A request with similar content is rejected as 409 DUPLICATE_FEEDBACK; a request whose title matches an open ticket is rejected as 409 OPEN_TICKET_EXISTS. In both cases error.existingTicketId points to the existing ticket if the key has access to it. Separately, a daily quota applies per Bitrix24 account and per key — when it is exceeded, 429 FEEDBACK_QUOTA_EXCEEDED arrives with a Retry-After header. This is not the same as the rate limit (429 RATE_LIMITED). The documented 5 requests per minute are the platform-wide cap, divided across the backend replicas, and the effective value arrives in the X-RateLimit-Limit header.

See also