لوكلاء AI: ملف markdown لهذه الصفحة — /docs-content-en/feedback.md فهرس التوثيق — /llms.txt

مقالات التوثيق متاحة حاليًا باللغة الإنجليزية فقط.

Feedback

A programmatic feedback channel for Vibecode. AI models, integrations, and external tools submit bug reports, suggestions, and questions straight from code — with error context, environment, and reproduction steps. Tickets submitted through the API land in the same tracker as those from the form in your Vibecode account.

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

Access levels | Quick start | Full example | Endpoint reference | Error codes

Access levels

Permissions depend on whether the key has the vibe:feedback scope.

Key Create Read Update and comments
KeyRegular key (vibe_api_ / vibe_app_) Createyes Readown tickets Update and commentswithdraw own ticket only
KeyKey with the vibe:feedback scope Createyes Readall tickets in its Bitrix24 account Update and commentsyes, within its Bitrix24 account
KeyManagement key Createno Readtickets of all Bitrix24 accounts Update and commentsyes

The vibe:feedback scope is not granted to a key automatically — enable it explicitly when creating or updating a key. The scope grants extended read and update access to every ticket in the account, not just the ones the key created. Grant it selectively — for example, to a key that processes the support ticket queue.

Quick start

Submitting a bug ticket with request context:

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

Response:

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

The ticket number the user and support see is VB- plus the first 8 characters of the id. In the example above that is VB-a1b2c3d4. Save it so you can reference the ticket in correspondence.

Full example

Submit a ticket, verify it in the list, and withdraw it if it was created by mistake.

javascript
const BASE = 'https://vibecode.bitrix24.com/v1'
const headers = { 'X-Api-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json' }

// 1. Submit a ticket
const created = await fetch(`${BASE}/feedback`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    category: 'DOCS',
    title: 'Typo in the filtering section',
    body: 'The example on /docs/filtering is missing a closing bracket.',
  }),
}).then(r => r.json())

const ticketId = created.data.id
console.log('Ticket created:', 'VB-' + ticketId.slice(0, 8))

// 2. Find it in your list
const list = await fetch(`${BASE}/feedback?category=DOCS&limit=5`, { headers })
  .then(r => r.json())
console.log('Total DOCS tickets:', list.total)

// 3. Withdraw it if created by mistake
await fetch(`${BASE}/feedback/${ticketId}`, {
  method: 'PATCH',
  headers,
  body: JSON.stringify({ status: 'WITHDRAWN' }),
})

Endpoint reference

Method Path Description
MethodPOST Path/v1/feedback DescriptionSubmit a ticket
MethodGET Path/v1/feedback DescriptionList tickets with filters and pagination
MethodGET Path/v1/feedback/:id DescriptionA single ticket by ID
MethodPATCH Path/v1/feedback/:id DescriptionUpdate status and resolution, withdraw a ticket
MethodPOST Path/v1/feedback/:id/comments DescriptionAdd a comment to a ticket
MethodPOST Path/v1/feedback/attachments DescriptionUpload an attachment to a ticket or comment
MethodGET Path/v1/feedback/:id/attachments/:attId/file DescriptionDownload a linked attachment
MethodGET Path/v1/feedback/:id/attachments/:attId/thumb DescriptionThumbnail of a linked image
MethodDELETE Path/v1/feedback/:id/attachments/:attId DescriptionDelete a linked attachment

Windows / PowerShell and UTF-8

Non-ASCII characters (accented letters such as ö, ü, é, or any non-Latin script) in title, body, or resolution may turn into question marks (?) if the request is sent from Windows PowerShell without explicit UTF-8 serialization. This is not a server-side display problem — the non-ASCII bytes are lost before the HTTP request is sent, on the client side.

Cause. By default, PowerShell re-encodes the string from the -Body parameter (Invoke-WebRequest / Invoke-RestMethod) into the system's legacy (non-UTF-8) code page — for example windows-1252 on Western installs — and any character outside that page is lost before the request is assembled. The Content-Type: charset=utf-8 header does not help here — by the time it applies, the original bytes are already lost.

Solution. Pass the request body as a UTF-8 byte array.

powershell
# 1. Console output encoding — does not affect how the body is encoded
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# 2. Build the JSON and convert it to a UTF-8 byte array
$body = @{
  category = 'DOCS'
  title    = 'Typo in the documentation'
  body     = 'The filtering section example is missing a closing bracket.'
} | ConvertTo-Json -Compress

$bytes = [System.Text.Encoding]::UTF8.GetBytes($body)

# 3. Pass a byte array to -Body (not a string) and set the encoding in Content-Type
Invoke-WebRequest `
  -Uri 'https://vibecode.bitrix24.com/v1/feedback' `
  -Method POST `
  -Headers @{
    'X-Api-Key'    = 'YOUR_API_KEY'
    'Content-Type' = 'application/json; charset=utf-8'
  } `
  -Body $bytes

Common mistakes:

  • Saving the .ps1 with a UTF-8 BOM — older PowerShell versions may fail to parse the script itself.
  • Passing a string to -Body (-Body $body) instead of a byte array (-Body $bytes) — the string is re-encoded through the system code page.
  • Relying only on Content-Type: application/json; charset=utf-8 without UTF8.GetBytes — this header does not restore the lost bytes; it only declares the body encoding to the server.

Node.js (fetch) and Python (requests) encode the body in UTF-8 themselves, so no extra steps are required. The problem is specific to PowerShell.

Error codes

HTTP Code Description
HTTP400 CodeVALIDATION_ERROR Descriptioncategory, title, body, or context failed validation
HTTP400 CodeINVALID_FILTER_VALUE DescriptionAn unknown status or category value was passed to the list endpoint
HTTP400 CodeINVALID_INPUT DescriptionOn the list endpoint, exported is neither true nor false
HTTP400 CodeNO_FILE DescriptionNo file was passed to the attachment upload request
HTTP400 CodeINVALID_MIME DescriptionThe attachment file extension is not on the allowed list
HTTP400 CodeMIME_MISMATCH DescriptionThe attachment file contents do not match its type
HTTP400 CodeINVALID_FILE_EMPTY DescriptionThe attachment file is empty
HTTP400 CodeIMAGE_DECODE_FAILED DescriptionThe image could not be parsed
HTTP400 CodeIMAGE_TOO_MANY_PIXELS DescriptionThe image has more than 24 million pixels
HTTP400 CodeTOO_MANY_FRAMES DescriptionThe animation has more than 30 frames
HTTP400 CodeREASON_INVALID DescriptionThe attachment deletion reason is shorter than 3 or longer than 500 characters
HTTP402 CodeACCOUNT_FROZEN DescriptionThe balance is frozen. Returned for attachment uploads, downloads, and deletions, and for ticket updates — create, list, read, and comment keep working under a freeze
HTTP403 CodeFEEDBACK_SCOPE_REQUIRED DescriptionUpdate or comment on someone else's ticket without the vibe:feedback scope
HTTP403 CodeMANAGEMENT_KEY_READ_ONLY DescriptionA management key creates a ticket or uploads an attachment
HTTP403 CodeDELETE_NOT_ALLOWED DescriptionDeleting an attachment after the other side has already replied
HTTP403 CodeWRITE_BLOCKED_READONLY_KEY DescriptionThe key is read-only and the request writes something — see access rights
HTTP404 CodeNOT_FOUND DescriptionThe ticket does not exist or is not accessible to the key
HTTP409 CodeFEEDBACK_CLOSED DescriptionAn author action on a closed ticket. Commenting: on ARCHIVED and WITHDRAWN, while on RESOLVED an author comment reopens the ticket. Withdrawing: on RESOLVED, ARCHIVED, and WITHDRAWN
HTTP409 CodeDUPLICATE_FEEDBACK DescriptionA similar ticket was submitted recently
HTTP409 CodeOPEN_TICKET_EXISTS DescriptionAn open ticket on this topic already exists
HTTP413 CodeIMAGE_TOO_LARGE DescriptionThe attachment file exceeds 10 MB
HTTP429 CodeFEEDBACK_QUOTA_EXCEEDED DescriptionThe daily quota for creating tickets is exceeded (per portal or key), with a Retry-After header
HTTP429 CodeRATE_LIMITED DescriptionCreating a ticket: 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
HTTP429 CodeRATE_LIMITED DescriptionUploading an attachment: more than 5 uploads per minute from one key. Uploads carry their own counter. 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

Feedback conversations keep working even when the balance is frozen. A frozen billing account returns 402 ACCOUNT_FROZEN, but four feedback operations are exempt: create a ticket, list tickets, open a ticket, and reply to the team. You can report a problem exactly when it matters most, and continue the conversation if support asks for details.

Attachment uploads, downloads, and deletions, along with ticket updates, remain blocked under a freeze — they still return 402 ACCOUNT_FROZEN. The freeze does not lift the daily ticket-creation quotas.

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

See also