لوكلاء AI: ملف markdown لهذه الصفحة — /docs-content-en/errors.md فهرس التوثيق — /llms.txt
مقالات التوثيق متاحة حاليًا باللغة الإنجليزية فقط.
Error codes
Vibecode API error code reference: the unified response format, the code list, common causes, and how to fix them. Applies to all /v1/... endpoints.
Documentation sections
- Authorization, keys and permissions —
MISSING_API_KEY,INVALID_API_KEY,TOKEN_MISSING,SCOPE_DENIED,BITRIX_ACCESS_DENIED,WRITE_BLOCKED_READONLY_KEY - Request and data —
VALIDATION_ERROR,INVALID_PARAMS,MISSING_REQUIRED_FILTER,BATCH_LIMIT_EXCEEDED,ENTITY_NOT_FOUND - Billing and plans —
BILLING_EXHAUSTED,COMMERCIAL_PLAN_REQUIRED,INT_TARIFF_REQUIRED - Limits, queues, and pauses —
RATE_LIMITED,CALLER_RATE_LIMITED,ERROR_LOOP_DETECTED,QUEUE_OVERFLOW,QUEUE_TIMEOUT,TIMEOUT_QUARANTINE,OPERATION_TIME_LIMIT - Bitrix24 and the platform —
BITRIX_ERROR,METHOD_NOT_YET_AVAILABLE,BITRIX_UNAVAILABLE,BITRIX_TIMEOUT,INTERNAL_ERROR - What is safe to retry — whether the target call reached Bitrix24 and what to do with a read or write for each temporary code
- Retries and error handling in code — when to retry a request, and when to re-read the entity first
Error response format
Every error response is returned in a unified shape. error is an object.
{
"success": false,
"error": {
"code": "ENTITY_NOT_FOUND",
"message": "Item not found"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
Fieldsuccess |
Typeboolean | Requiredyes | DescriptionAlways false on error |
Fielderror.code |
Typestring | Requiredyes | DescriptionMachine-readable error code. Use it to distinguish error types in client code |
Fielderror.message |
Typestring | Requiredyes | DescriptionError description for the developer. The language is not known in advance and depends on the source: the platform's technical messages arrive in English, messages from Bitrix24 arrive in the Bitrix24 account's language, and cloud-provider failure messages are localized to the user's language. Do not parse the text or rely on its language — branch on error.code |
Fielderror.hint |
Typestring | object | Requiredno | DescriptionDeveloper hint: what to try next, which limits to watch. It is either a text string or an object, and the object form arrives wherever the refusal has a ready recipe. On infrastructure creation POST /v1/infra/servers it carries reason, recovery and example, where example is a ready-to-send request body that fixes the call. On 413 INLINE_SOURCE_TOO_LARGE — across three routes at once: code deploy, file upload and server creation — the object carries four strings: reason (why the body was refused and what the cap is), recovery (which path to send the same archive through), recoveryAction (the same action in one line) and note (what helps regardless of the path chosen) |
Fielderror.userMessage |
Typestring | Requiredno | DescriptionMessage for the end user, in their interface language. Appears in billing, infrastructure, and plan errors, when the account queue is overloaded, in refusals from the Bitrix24 account's operating-time limiter, and in refusals for a scope missing on the key (error.cause = key_scope_missing): there it names the missing permission and where it is added, and is shown to the person as is |
Fielderror.alternatives |
Typearray | Requiredno | DescriptionWays to resolve the refusal: upgrade the plan, top up the balance, call your own AI model with your own key. Every item carries type, and with it either a url or a description. It arrives in plan and balance refusals |
Fielderror.details |
Typeobject | Requiredno | DescriptionMachine-readable context for specific codes. Examples: reason in INVALID_STATE and in ROUTE_NOT_FOUND, deployableKeys in INFRA_FORBIDDEN_FOR_COWORK_KEY, upgradeUrl in plan and trial refusals, method and switchUrl in WRITE_BLOCKED_READONLY_KEY. The field set depends on the code — read its description |
Fielderror.warning |
Typestring | Requiredno | DescriptionAppears when the same error repeats on one key — a likely sign of a bug in the client code. The counter is heuristic, so the warning does not guarantee a bug |
Fielderror.retryAfter |
Typenumber | Requiredno | DescriptionSeconds until the next attempt. Appears in the 429s of the account queue (QUEUE_OVERFLOW, QUEUE_TIMEOUT), in the OPERATION_TIME_LIMIT and TIMEOUT_QUARANTINE pauses, and in transient 503s (BITRIX_TIMEOUT, POOL_EXHAUSTED, DB_TRANSIENT, SERVICE_UNAVAILABLE). ERROR_LOOP_DETECTED carries the remaining recovery-probe pause in this field and in Retry-After, or 60 seconds before another check if time has elapsed but the call is still blocked. A standalone RATE_LIMITED has no such body field — the delay arrives in the Retry-After header. A platform-built batch suberror with this code carries the delay in retryAfter under data.errors.<id> or data[i].error: there is no separate header for a subcall. In LARGE_BODY_BACKEND_BUSY the field is not always present — take the delay from the header there too |
Fielderror.b24Code |
Typestring | Requiredno | DescriptionThe machine-readable reason code from Bitrix24 in 422 BITRIX_ERROR responses; for the chat routes on the v2 messenger — load a chat, counters, messages around a message, the format=v2 mode, links and guests, stickers, the task form for a chat and for a message, the flow form and Zoom — also in 404 ENTITY_NOT_FOUND. It does not always arrive — only when Bitrix24 sent a separate code |
Fielderror.release |
Typestring | Requiredno | DescriptionThe identifier of the Bitrix24 update the account is waiting for: the module name and the version number in one string, for example imopenlines 26.700.0. Appears only in METHOD_NOT_YET_AVAILABLE |
Fielderror.scope |
Typestring | Requiredno | DescriptionRefusal scope: "apiKey" identifies the calling key, "portal" identifies the Bitrix24 account. The specific restrictions and retry rules depend on error.code. "apiKey" appears in ERROR_LOOP_DETECTED, OPERATION_TIME_LIMIT, TOKEN_REFRESH_FAILED, PORTAL_CREDENTIALS_REJECTED and PORTAL_ADDRESS_CHANGED. "portal" appears in QUEUE_OVERFLOW, QUEUE_TIMEOUT, RATE_LIMITED when Bitrix24 refuses the call, BITRIX_TIMEOUT and TIMEOUT_QUARANTINE. FEEDBACK_QUOTA_EXCEEDED uses both values |
Fielderror.cause |
Typestring | Requiredno | DescriptionWhy access was refused: b24_permission — the Bitrix24 user the call runs as lacks rights; b24_scope — the key's credential lacks a Bitrix24 scope; key_scope_missing — the API key itself lacks the scope the route needs; bot_other_key — the bot is bound to another API key; unknown — the cause cannot be determined. The set is open: read an unknown value as unknown. Arrives in 403 BITRIX_ACCESS_DENIED, in 403 BOT_ACCESS_DENIED and in 422 BITRIX_ERROR whose b24Code is ACCESS_DENIED_EXTEND or NO_AUTH_FOUND. key_scope_missing arrives in 403 INSUFFICIENT_SCOPE, 403 INFRA_SCOPE_REQUIRED, 403 SCOPE_NOT_ALLOWED of a batch request and in 403 SCOPE_DENIED of entity routes (including their batch and aggregate calls and include), timeline items and Open Channels. Details — Authorization, keys and permissions |
Fielderror.method |
Typestring | Requiredno | DescriptionThe Bitrix24 method that was refused, at most 100 characters. Arrives with error.cause when the method is known |
Fielderror.requiredScope |
Typestring | Requiredno | DescriptionThe scope that was missing. With error.cause = b24_scope — a Bitrix24 scope, and only when the scope of the method is known. With error.cause = key_scope_missing — the scope the route or the batch call needs; absent from a batch response whose calls need different scopes |
Fielderror.keyScopes |
Typearray | Requiredno | DescriptionThe key's scopes in effect for this request — including the automatically granted vibe:ai and vibe:search, so the list can be wider than data.scopes of GET /v1/me. Arrives only with error.cause = key_scope_missing. Not repeated in the entries of a batch data.errors |
Fielderror.fix |
Typeobject | Requiredno | DescriptionWhat resolves the refusal: action — the action, via — where it is performed. With via: "same_key" it also carries path — a ready route with no placeholders — and body — a ready request body for it. Arrives with error.cause. action: "none" means there is no machine action — read error.hint. The action and via sets are open: read an unknown action as none and an unknown via as a step for a person. Values — Authorization, keys and permissions |
Example response with an extra hint field (429 RATE_LIMITED) — here the retry delay arrives in the Retry-After: 2 header only:
{
"success": false,
"error": {
"code": "RATE_LIMITED",
"message": "QUERY_LIMIT_EXCEEDED",
"hint": "Wait 1-2 seconds and retry. Use POST /v1/batch to combine up to 50 calls in 1 request."
}
}
In a standalone HTTP response, the Retry-After header mirrors error.retryAfter when that field is present, for compatibility with the HTTP standard. Some refusals carry the delay only in the header, so use the header for a standalone response. A suberror inside a successful batch response has no separate header: if a delay is supplied, take it from that suberror's retryAfter field.
Code summary table
The table covers the core codes that appear on any Vibecode API endpoint. Domain codes (BOT_NOT_FOUND, SERVER_NOT_RUNNING, AGENT_LIMIT_REACHED, and similar) are documented on the pages of their respective sections.
Authorization and keys
| Code | HTTP | When it occurs |
|---|---|---|
CodeMISSING_API_KEY |
HTTP401 | When it occursRequest without the X-Api-Key header |
CodeINVALID_API_KEY |
HTTP401 | When it occursThe platform does not recognize the key string: a typo, a value truncated while copying, a key from another environment, or a deleted key. An existing key that has stopped working gets different codes — KEY_INACTIVE, KEY_EXPIRED, PORTAL_CREDENTIALS_REJECTED |
CodeKEY_INACTIVE |
HTTP401 | When it occursThe key was found but is revoked or blocked by the platform. The key string stays the same, and a new key is issued separately — a revoked one cannot be restored |
CodeKEY_EXPIRED |
HTTP401 | When it occursThe key was found, and the expiry time in expiresAt has passed. The status field stays ACTIVE |
CodeINVALID_APP_KEY |
HTTP401 | When it occursAn OAuth endpoint received an app_key that was not found or does not belong to an OAuth application |
CodeWRONG_AUTH_SCHEME |
HTTP401 | When it occursAn API key was passed in the Authorization: Bearer header. An OAuth application key (vibe_app_*) goes in X-Api-Key, and Authorization: Bearer carries the session token (vibe_session_*). For a client that can only send Bearer, use a personal key (vibe_api_*) — it is accepted in Authorization: Bearer |
CodeTOKEN_EXPIRED |
HTTP401 | When it occursThe OAuth token has expired |
CodeTOKEN_REFRESH_FAILED |
HTTP401 | When it occursFailed to refresh the OAuth token on the Bitrix24 side |
CodePORTAL_CREDENTIALS_REJECTED |
HTTP401 | When it occursBitrix24 rejected the credentials the key uses to call the portal: the key's webhook was revoked or no longer works. Retrying does not help — the key has to be reconnected |
CodePORTAL_ADDRESS_CHANGED |
HTTP409 | When it occursThe self-hosted portal moved to a new address, while the key's webhook is still issued for the previous one. The platform does not send the secret where the portal no longer is, so the call is refused before reaching the portal. Retrying does not help — reconnect the key: the platform re-issues the webhook, and the key string and its rights stay the same |
CodeWRONG_KEY_TYPE |
HTTP401 | When it occursThe key type does not match the endpoint: e.g. a management key on an entity route |
CodeWRONG_KEY |
HTTP403 | When it occursThe server exists but is not yours. Operations on the application's content — deploy, exec, upload and log reads — are open on any one of three grounds: the server's managing key, a key whose application is bound to that server, or membership in that server's development team. Access tokens and the icon upload require the managing key. Machine management is also open to the Administrator role on the development team. The response carries a hint with a two-step recovery: rebind the server in the Vibecode dashboard and switch the key the client sends. Details — access recovery |
CodeTOKEN_MISSING |
HTTP401 | When it occursThe key has no Bitrix24 credentials. For a personal key (vibe_api_*) — no portal webhook: on the entity routes and in POST /v1/batch the reason arrives in error.details, on the other routes the same code arrives without details. For an app key (vibe_app_*) — no Authorization: Bearer session token was sent |
CodeSESSION_REQUIRED |
HTTP401 | When it occursA placement operation was called without the Authorization: Bearer header carrying a session token, on an account that requires it |
CodeSESSION_APP_MISMATCH |
HTTP403 | When it occursThe session in Authorization: Bearer was issued to a different app or a different Bitrix24 account than the key in X-Api-Key. Send the authorization key of the app that issued the session via POST /v1/oauth/token |
CodePERSONAL_KEY_WEBHOOK_SCOPES_INVALID |
HTTP400 | When it occursIssuing, updating or rotating a personal key where the only requested scopes are placement and entity. Such a key sits on a Bitrix24 incoming webhook, and a webhook cannot carry such scopes — add a data scope or register an OAuth application. See management keys |
CodeACCOUNT_PENDING_ERASURE |
HTTP503 | When it occursThe key owner's account is awaiting data erasure — the key is frozen for that period. The response carries a Retry-After: 3600 header. It applies to every key of that owner, including a management key. Cancelling the erasure request restores the key — no reissue is needed |
Causes and step-by-step fixes for MISSING_API_KEY, INVALID_API_KEY and TOKEN_MISSING — Authorization, keys and permissions.
Bitrix24 account state
The state of the account a key is bound to is checked on every call. These refusals are not tied to an endpoint: while the account stays in one of the states below, the key receives them on every /v1/... route that has no refusal of its own for that state, and retrying changes nothing.
| Code | HTTP | When it occurs |
|---|---|---|
CodePORTAL_SUSPENDED |
HTTP403 | When it occursThe account is suspended |
CodePORTAL_DELETED |
HTTP403 | When it occursThe account has been deleted |
CodePORTAL_BLOCKED |
HTTP403 | When it occursThe account is blocked. The response carries blockedAt alongside the code — the moment of blocking in ISO 8601 format. The reason for the block is not disclosed |
CodeNO_PORTAL |
HTTP401 | When it occursThe key is not bound to any account. The storage routes are the exception: an unbound key gets 403 STORAGE_REQUIRES_PORTAL_BINDING there. The same code with HTTP 500 arrives on the application user authorization routes and means something else there — the app is not linked to an account |
Application user authorization (OAuth)
| Code | HTTP | When it occurs |
|---|---|---|
CodeINVALID_REDIRECT_URI |
HTTP400 | When it occursredirect_uri is not registered for the application at the GET /v1/oauth/authorize entry point |
CodeINVALID_STATE |
HTTP400 | When it occursstate was not found or had expired (20-minute lifetime) when the Bitrix24 response arrived. error.details.reason carries NOT_FOUND or EXPIRED |
CodeINVALID_CODE |
HTTP400 | When it occursThe authorization code was not found or belongs to another application |
CodeCODE_EXPIRED |
HTTP400 | When it occursThe authorization code has expired — a code is valid for 5 minutes |
CodeCODE_ALREADY_USED |
HTTP400 | When it occursThe authorization code has already been exchanged for a session token |
CodeREDIRECT_URI_MISMATCH |
HTTP400 | When it occursThe redirect_uri at code exchange does not match the one passed on entry |
CodeDOMAIN_MISMATCH |
HTTP400 | When it occursdomain in POST /v1/oauth/placement-session does not match the application's portal |
CodeUSER_AUTH_REQUIRED |
HTTP401 | When it occursThe Bitrix24 user token did not confirm authorization on the portal |
CodeMISSING_TOKEN |
HTTP400 | When it occursPOST /v1/oauth/revoke without an Authorization: Bearer header carrying a session token |
A rejection at the callback step may arrive not as a code but as an ?error= parameter appended to the redirect_uri — token_exchange_failed, invalid_domain or profile_fetch_failed.
Full description of the flow — Application user authorization.
Permissions and scopes
| Code | HTTP | When it occurs |
|---|---|---|
CodeSCOPE_DENIED |
HTTP403 | When it occursThe key lacks the required scope (e.g. crm for deals, imbot for bots). When the response carries error.cause = key_scope_missing, the action is in error.fix and the text for a person in error.userMessage |
CodeWRITE_BLOCKED_READONLY_KEY |
HTTP403 | When it occursThe key is in read-only mode, but the call performs a write |
CodeCONNECT_AI_NOT_PERMITTED |
HTTP403 | When it occursThe key was issued to an application through Partner Connect, and the Bitrix24 account administrator has not allowed AI for that application or has revoked the permission. Returned on the AI model routes when the platform has enabled AI approval by account administrators. The key's other permissions keep working and the key does not need to be reissued: once AI is allowed, the same key can access the models again. Procedure — Managing apps in a Bitrix24 account |
CodeINFRA_FORBIDDEN_FOR_COWORK_KEY |
HTTP403 | When it occursA Cowork/Code key with the vibe:cowork scope works with data only and cannot perform write operations — every /v1/infra/* method except GET requests, every write operation on an application (creating, updating, deleting, relinking, publishing and unpublishing) and writing to source storage. On POST /v1/portals/:id/activate-market-trial the same code goes to an agent seat key, while a desktop key is refused earlier and with a different code — PURPOSE_KEY_FORBIDDEN, see Activate the Marketplace trial. The Cowork/Code endpoint POST /v1/cowork/activate-market-trial never returns this code at all. What to do next — Project key for deploy. A subscription key issued for a third-party agent never gets a project key (403 COWORK_HARNESS_KEY_FORBIDDEN), so for such a key error.details.requiredAction names the Cowork/Code desktop app and an ordinary key with the vibe:infra scope instead, see Your own agent on the subscription. In error.details.deployableKeys the response lists your other active keys that can deploy — name, prefix, suffix, up to five |
CodeINFRA_SCOPE_REQUIRED |
HTTP403 | When it occursThe key lacks the vibe:infra scope — infrastructure management is unavailable. Add the scope or use a key with infrastructure permissions. The action is in error.fix: while servers are turned off for the Bitrix24 account the scope cannot be added, and fix.action is none. fix.via = platform means the platform turned them off. A missing via with action = none only means there is no machine action to take, and names NO cause: other refusals for this scope answer the same way — the account admin turned servers off, the platform could not determine whether servers are on, the key's origin is not established, or the key was issued through Partner Connect. The cause is told apart by the text of error.userMessage and error.hint, not by via |
CodeINFRA_DISABLED_FOR_PORTAL |
HTTP403 | When it occursThe vibe:infra scope is explicitly requested when creating a key or an application, or added by editing their scopes, and the portal administrator has turned server management off. The gate counts the ADDITION of the scope, not its presence in the body: editing a key or an application that already carries it goes through even on a portal where server management is off, and removing the scope is always allowed. Not to be confused with INFRA_SCOPE_REQUIRED — that one is about calling infrastructure with a key that lacks the scope, this one about granting the scope in the first place |
CodeSERVER_ROLE_FORBIDDEN |
HTTP403 | When it occursYou are on the server's development team, but the operation goes beyond your role: the Developer role covers work with the code, the Administrator role covers machine management on top of that. error.hint carries yourRole, requiredRole, the denied action deniedAction and the list of calls open to you in allowedHere. Your access is not broken and needs neither a fresh grant nor an API-key rebind — either continue through the calls in allowedHere, or ask the owner to run this operation. Role breakdown — List servers |
CodeKEY_POLICY_READONLY_REQUIRED |
HTTP403 | When it occursThe portal policy allows regular users to create only read-only keys — issuing a write-enabled key is rejected |
CodeRATE_LIMIT_ADMIN_ONLY |
HTTP403 | When it occursThe request changes the key's own per-minute limit on AI calls — the rateLimit field on create or edit — and the caller is not a portal administrator. Through POST /v1/keys and PATCH /v1/keys/:id a change to this field is refused for administrators too: the value is set in the Vibecode dashboard. Passing the current value unchanged goes through, so a client that sends the whole key object just to rename it never sees this refusal. Leave the field empty and the general platform limit applies — Request limits |
CodeMANAGEMENT_KEY_READ_ONLY |
HTTP403 | When it occursA management key tries to create a feedback ticket — POST /v1/feedback or an attachment upload for it. Reading and updating tickets with such a key are allowed — creating them is not. A write blocked by the key's access mode arrives under a different code — WRITE_BLOCKED_READONLY_KEY |
CodeMANAGEMENT_KEY_NO_ENTITY_ACCESS |
HTTP403 | When it occursA management key accesses an entity endpoint — an application key with the required scope is needed |
CodeBITRIX_ACCESS_DENIED |
HTTP403 | When it occursBitrix24 refused access. A Bitrix24 user without rights is only one of the causes: a scope missing on the key gives the same refusal. The kind of refusal arrives in error.cause, the action in error.fix |
CodeBOT_ACCESS_DENIED |
HTTP403 | When it occursThe bot is bound to another API key. error.cause is bot_other_key. When the calling key can transfer the bot to itself, error.fix is transfer_bot with a ready path and body. Details — Authorization, keys and permissions |
CodeOAUTH_REQUIRED |
HTTP403 | When it occursThe endpoint requires a user context — a vibe_app_* key + Bearer token is needed |
CodeWAITLIST_PENDING |
HTTP403 | When it occursThe account is awaiting waitlist activation |
CodeOAUTH_SCOPE_CHANGE_REQUIRES_REISSUE |
HTTP403 | When it occursAn attempt to add a Bitrix24 scope to an OAuth application key (vibe_app_*) via PATCH /v1/keys/:id, or to an app via PATCH /v1/apps/:id. An OAuth application's scopes are fixed at issue time — removals work, additions do not. A new scope comes from re-issuing the authorization key in the Vibecode dashboard: it issues a key with the widened scope set, after which the account completes authorization again. The other path is to create the application with the scopes you need up front |
CodeOAUTH_APP_REQUIRED |
HTTP400 | When it occursA placement operation was called with a personal vibe_api_* key. Binding, unbinding, and listing bound placements are available only to the application authorization key vibe_app_* |
CodePLACEMENT_SCOPE_MISSING |
HTTP403 | When it occursThe key lacks the placement scope — binding and unbinding placements are unavailable |
CodeSESSION_REQUIRES_ADMIN |
HTTP403 | When it occursBinding a placement on a self-hosted account was performed by a user without account-administrator rights |
CodeB24_EMBEDDING_APP_NOT_FOUND |
HTTP404 | When it occursBitrix24 does not know the application ID: the local application was deleted or reinstalled on the account. Create the local application again and call POST /v1/apps/:id/relink-oauth with the new bitrixClientId and bitrixClientSecret. Not to be confused with APP_NOT_FOUND, which is about the key-to-application link on the Vibecode side |
CodeAPP_NOT_REGISTERED |
HTTP400 | When it occursThe application has no Bitrix24 application identifier — a placement cannot be bound or unbound |
CodeBOX_NO_DEVELOPER_KEY |
HTTP400 | When it occursThe application author has no developer key configured — placement operations on a self-hosted account are unavailable |
CodeOAUTH_APP_KEY_CANNOT_RELINK |
HTTP403 | When it occursPOST /v1/apps/:id/relink-oauth was called with the OAuth application's own key (vibe_app_*). Such a key cannot relink the app's credentials — use a personal key (vibe_api_*) or the Vibecode dashboard |
Causes and step-by-step fixes for SCOPE_DENIED, BITRIX_ACCESS_DENIED and WRITE_BLOCKED_READONLY_KEY — Authorization, keys and permissions.
Request validation
| Code | HTTP | When it occurs |
|---|---|---|
CodeVALIDATION_ERROR |
HTTP400 | When it occursThe body or query parameters failed schema validation. message contains per-field details |
CodeINVALID_JSON_BODY |
HTTP400 | When it occursThe request body cannot be parsed as JSON. It is returned before schema validation, so message carries no field details. This code comes from the entity routes /v1/<entity>, as well as /v1/apps, /v1/bots, /v1/keys, /v1/note, every /v1/infra/servers/:id server operation, /v1/infra/runtimes, the custom-field routes, the chat routes /v1/chats/* and most Open Channels routes /v1/openlines/*. Operator actions and opening or starting an Open Channels session respond with FST_ERR_CTP_INVALID_JSON_BODY |
CodeFST_ERR_CTP_INVALID_JSON_BODY |
HTTP400 | When it occursThe same case — the body cannot be parsed as JSON — on the other routes: POST /v1/search, POST /v1/research, POST /v1/batch and the rest |
CodeCATALOG_NOT_ELIGIBLE |
HTTP400 | When it occursA card in the Bitrix24 app catalog cannot be created for this server: it has no subdomain, has no app deployed yet, is an agent runtime or a galaxy host, or has no managing key or portal. See Publish to the catalog |
CodeCATALOG_ORPHANED |
HTTP400 | When it occursThe catalog card was removed on the Bitrix24 side. It can be restored in the Vibecode dashboard, but not through the public API |
Codefst_err_ctp_invalid_json_body |
HTTP400 | When it occursThe same case on the OpenAI-compatible AI Router routes — /v1/ai/, /v1/chat/, /v1/models, /v1/audio/. There the codes are lowercased and the response uses the OpenAI envelope: error.type, error.code, with no success field |
CodeINVALID_PARAMS |
HTTP400 | When it occursBitrix24 returned INVALID_PARAMS or refused the call before the method ran because a required parameter had no value (Could not find value for parameter) — the parameter is then named in error.hint; the route handler found an invalid parameter value; a write put an object or an array into a field declared scalar. See Request and data |
CodeINVALID_REQUEST |
HTTP400 | When it occursThe request structure does not match what the endpoint requires — for example, calls in /v1/batch is an empty array or contains more than 50 elements, creating a server without its required fields, a non-object sent as the body on the custom-field routes, or a non-object (null, an array, a string, a number, a boolean) sent as the body on POST /{entity}/search |
CodeMISSING_PARAMS |
HTTP400 | When it occursA required parameter explicitly listed in the endpoint schema was not passed |
CodeMISSING_REQUIRED_FILTER |
HTTP400 | When it occursA required filter was not passed on a list endpoint that needs context: timelines (entityType + entityId), catalog-products and catalog-sections (iblockId), catalog-product-property-enums (propertyId). The same code answers an activities aggregation with no narrowing filter — there any one of several narrowing filters is enough, and message lists them |
CodeMISSING_REQUIRED_PARAMS |
HTTP400 | When it occursRequired context parameters for searching or listing nested data were not passed: files requires folderId, folders requires parentId, calendar-events requires type and ownerId. message lists the missing fields |
CodeMISSING_REQUIRED_FIELDS |
HTTP400 | When it occursA body field declared required for creating the entity was not passed. message names the missing field |
CodeMISSING_FIELD |
HTTP400 | When it occursCreating a custom field without userTypeId. message gives examples of the allowed types |
CodeEMPTY_CREATE_BODY |
HTTP400 | When it occursThe create request body is empty — no field was passed. The same code covers a body that is not a JSON object at all (null, an array, a string, a number, a boolean) — no recognizable field can be found in such a body |
CodeEMPTY_UPDATE_BODY |
HTTP400 | When it occursThe update request body is empty — no field was passed. The same code covers a body that is not a JSON object at all (null, an array, a string, a number, a boolean) |
CodeNESTED_FIELDS_ENVELOPE |
HTTP400 | When it occursAn entity write route that wraps fields itself receives an object under fields, although the schema does not declare that field. That call is not written; pass the fields flat at the JSON root. In a mixed global batch, other valid calls may run. Global batch uses this code in the call error; import and per-entity batch keep their IMPORT_ITEM_VALIDATION / BATCH_ITEM_VALIDATION codes and include NESTED_FIELDS_ENVELOPE in the message. See Request and data |
CodeINVALID_FILTER_FIELD |
HTTP400 | When it occursThe filter field name starts with the Bitrix24-native prefix @ (IN) or !@ (NOT IN) — use the $in / $nin operators instead |
CodeINVALID_DUPLICATE_FILTER_FIELD |
HTTP400 | When it occursTwo conditions in one filter resolve to the same Bitrix24 filter name, so the second would silently replace the first: the schema name and the Bitrix24-native name, the same name in different letter case, two spellings of one operator, paired date field names (updatedAt/updatedTime, createdAt/createdTime). Two further pairs depend on the entity: the UF_ form together with the camelCase spelling collapses into one name only on entities with the older naming style and only for the spelling the platform converts: the letters-only one (ufCrmProjectCode) everywhere on such entities, and the digit-suffixed one (ufCrm_1698325419) on requisites only; on the other entities a digit-suffixed pair is not refused, while $ne together with $nin produces one ! prefix on EVERY entity except CRM items (the two boundaries differ). message names both conditions and the shared name. Send one of the two. Operators that produce different names remain allowed — see One field — one spelling |
CodeUNKNOWN_FILTER_FIELD |
HTTP400 | When it occursFiltering on a field that is not in the entity schema (for entities with a full field schema). When the Vibecode validator rejects the field, message lists the allowed names after the word Available. When Bitrix24 rejects it, the field list arrives in error.hint |
CodeUNKNOWN_SELECT_FIELD |
HTTP400 | When it occursA select field name the entity does not have. Rejected on the entities whose field set has been verified against Bitrix24 — the list is in the select parameter description in the API overview. message lists the allowed names after the word Available. On every other entity the request runs and the name is reported as a warning in meta.warnings. A third outcome covers listing and searching requisites and bank details: those routes pass the name on to Bitrix24, so the account decides — an account that has no such field rejects the whole call with 422 BITRIX_ERROR, an account that accepts the name answers with a warning. Reading a single record on those same entities picks the fields on the Vibecode side and always answers with a warning. When * is present in select, an unknown name is never rejected — a warning arrives instead. The static schema does not check custom fields (UF_*, ufCrm*), the exact extra fields of a particular method, product properties on their own entity (PROPERTY_295 on products, property295 on catalog products, catalog SKUs, catalog offers and catalog services), or SPA relations such as parentIdN; they are passed to the method without UNKNOWN_SELECT_FIELD. For these names, the absence of a warning does not prove that the field exists or that the method understands its spelling |
CodeSELECT_FIELD_NOT_RETURNED |
HTTP400 | When it occursA select field name the entity DOES have but never returns: GET /v1/{entity}/fields shows it with notReturned: true. It gets its own code because UNKNOWN_SELECT_FIELD claims the name does not exist, while the entity's own field catalog publishes it. Drop it from select — the remaining fields come back in the response |
CodeUNKNOWN_SORT_FIELD |
HTTP400 | When it occursSorting by a field that does not exist (for entities whose sort validator is active) |
CodeUNKNOWN_STAGE |
HTTP400 | When it occursCreating a deal or a lead with a stage the account's dictionary does not hold: POST /v1/deals checks stageId against the stages of the pipeline named by categoryId (without it — the main one, DEAL_STAGE), POST /v1/leads checks stageId / statusId against the lead statuses (STATUS). The comparison is literal, as in Bitrix24: letter case, spaces and the pipeline prefix C{categoryId}: must match the dictionary, and another pipeline's stage without its categoryId does not match either. The record is NOT created. message names the key, the dictionary and the closest exact spelling or the categoryId to pass, details.knownStages lists the dictionary's stages (up to 50), details.entityId says which dictionary to read: GET /v1/statuses?filter[entityId]=…. Any spelling of the key Bitrix24 reads as STAGE_ID (STAGE_ID, stage_id, StageId) is checked the same way; when several spellings are sent, the last one in the body counts and the error names it in details.field. A list or an object in place of a stage name under a raw spelling of the key (STAGE_ID, stage_id…) is refused too (Bitrix24 puts such a record on the default stage; under stageId / statusId the shape check refuses it earlier — 400 INVALID_PARAMS): that refusal needs no dictionary, so details.knownStages is empty there and details.stageId names the shape of the value ("an array", "an object"). An empty stage ("", null) is not checked — the record lands on the default stage. Previously such a call answered 201 while Bitrix24 silently created the record on the default stage. If the dictionary could not be read or came back incomplete, the write proceeds as before |
CodeBATCH_LIMIT_EXCEEDED |
HTTP400 | When it occursThe request contains more than 50 elements in a bulk operation (chats, task-comments, and similar) |
CodeMESSAGE_REQUIRED |
HTTP400 | When it occursPOST /v1/chats/{dialogId}/messages with no text: the message field is empty and there is no attach block. PATCH /v1/chats/{dialogId}/messages/{messageId} with no text — by the Bitrix24 rule (whitespace only, [BR]/[br] tags or NUL count as empty, and an empty text would delete the message). Often the text was passed under an unknown field name, for example text. The response lists the unrecognized fields |
CodeINVALID_EVENT |
HTTP400 | When it occursThe event code in a Bitrix24 event subscription does not match the ^[A-Z][A-Z0-9_]+(?:\.[A-Z][A-Z0-9_]+)*$ format. See Bitrix24 event subscriptions |
CodeINVALID_APP_PATH |
HTTP400 | When it occursThe appPath delivery path does not start with / or contains control characters. See Bitrix24 event subscriptions |
CodePLATFORM_HANDLER_UNRESOLVABLE |
HTTP400 | When it occursThe handler address points to the technical address of the app server, and the platform handler could not be resolved. The placement was not registered. See Bind a placement |
An empty body sent with the Content-Type: application/json header is accepted as {} on the /v1/infra/* routes, and also on every custom-field route: /v1/userfields/:entity, /v1/userfields/:entity/types and /v1/userfields/:entity/:id, the same three paths under /v1/items/:entityTypeId/userfields, plus the short invoice paths /v1/userfields/invoices, /v1/userfields/invoices/types and /v1/userfields/invoices/:id. Operations that need no body — POST /v1/infra/servers/:id/wake, DELETE /v1/infra/servers/:id/access-tokens/:tokenId and the like — process the request normally instead of rejecting it while parsing the body. This accommodates clients that attach this header to every request (axios and PowerShell Invoke-RestMethod, for example).
The operation itself validates the request next, and the refusal code depends on the route — take it from the table above or from the page of the operation you call. A body that does not parse as JSON is rejected on these routes with INVALID_JSON_BODY, so an empty body and a malformed one are distinct cases.
Causes and step-by-step fixes for VALIDATION_ERROR, INVALID_PARAMS, MISSING_REQUIRED_FILTER and BATCH_LIMIT_EXCEEDED — Request and data.
Request body size
| Code | HTTP | When it occurs |
|---|---|---|
CodePAYLOAD_TOO_LARGE |
HTTP413 | When it occursThe request body exceeds this route's size limit |
CodeINLINE_SOURCE_TOO_LARGE |
HTTP413 | When it occursThe body carrying an inline archive or file is over 96 MB on three infrastructure routes — code deploy, file upload and server creation with the source field |
CodeLARGE_BODY_BACKEND_BUSY |
HTTP429 | When it occursThe platform is already handling the maximum volume of large bodies. The request was not executed — retry it after Retry-After seconds |
The limit depends on the route: 1 MB by default; record and list element creation and updates, bot and chat files, note.file.add — 40 MiB; upload to Drive — 70 MB. A file inside the body travels as base64 and grows by about a third, so with a 40 MiB limit the original file is just under 30 MiB. The same code arrives from the edge layer at its own threshold. A body sent under an undeclared content type — text/plain, for example — is refused with 415 FST_ERR_CTP_INVALID_MEDIA_TYPE on the entity, custom-field, chat, note, key and Cowork/Code routes, while an empty body under that same type is accepted there as {}. On /v1/infra/* and /v1/apps, including source publishing and placements, the body limit for an unrecognized type is one byte, so the same request answers 413.
A body above 1 MiB counts as large — the same threshold as the default limit — and the total volume of large bodies handled at a time is capped. The refusal occurs where the body limit is raised: entity records, list element writes, bot files and chat files, uploads to Drive (POST /v1/files/upload), note files (POST /v1/note/documents/{documentId}/files), and also POST /v1/chat/completions and POST /v1/audio/transcriptions together with their aliases under /v1/ai/. When that capacity is exhausted, 429 LARGE_BODY_BACKEND_BUSY arrives with a Retry-After: 5 header. A request without a Content-Length header gets the same answer once its volume crosses that threshold mid-transfer. Transcriptions are the exception: only a declared Content-Length counts there, and an upload without one is bounded by the single 25 MB per-file ceiling. On AI routes this refusal uses the OpenAI-compatible envelope: no success field, and the large_body_backend_busy code in lowercase. Take the retry delay from the header: the error.retryAfter field is not always present in the body.
AI routes are the exception (/v1/ai/*, /v1/chat/*, /v1/audio/*, /v1/models): they use an OpenAI-compatible error envelope, and on an oversize body error.code carries the framework's internal code in lowercase rather than PAYLOAD_TOO_LARGE.
A body that carries an archive or a file inside JSON has its own code and its own ceiling: code deploy with source.content, file upload with content and server creation with the source field accept up to 96 MB of body and answer 413 INLINE_SOURCE_TOO_LARGE above that. What is counted is the body itself: the content travels as base64 and runs roughly a third larger than the raw bytes, so the cap corresponds to about 72 MB of the archive. The decision is based on the Content-Length header before the body is read, and error.hint names a way to send the same archive through another path. A link (source.url, url) and a saved version (source.versionId) do not fall under this cap — they have their own 500 MB cap.
File uploads
| Code | HTTP | When it occurs |
|---|---|---|
CodeSTORAGE_FORBIDDEN_CONTENT_TYPE |
HTTP415 | When it occursFor PUBLIC objects the types text/html, application/javascript, application/x-javascript, image/svg+xml are forbidden — they carry a cross-site scripting risk. Upload such a file as PRIVATE |
Bitrix24 event subscription preconditions
| Code | HTTP | When it occurs |
|---|---|---|
CodeNOT_OAUTH_APP |
HTTP400 | When it occursThe server is not bound to an OAuth application with an application_token — an event subscription cannot be registered |
CodeNO_USER_TOKEN |
HTTP400 | When it occursThe app has no OAuth token — authorize the app on the portal first |
Full description of the operations — Bitrix24 event subscriptions.
Application install through the connector module
| Code | HTTP | When it occurs |
|---|---|---|
CodeCONNECTOR_APP_INSTALL_FORBIDDEN |
HTTP403 | When it occursA Bitrix24 account administrator has barred this employee from installing applications. The right is granted by an account administrator, and retrying does not change the state. Details — Creation rights |
CodeCONNECTOR_MODULE_NOT_INSTALLED |
HTTP409 | When it occursThe connector module is not installed on the account. The state is permanent — retrying is pointless until the module is installed |
CodeCONNECTOR_APP_INSTALL_FAILED |
HTTP502 | When it occursAnother install failure on the connector module side. The request can be retried |
CodeCONNECTOR_REST_UNAVAILABLE |
HTTP502 | When it occursThe account's plan or trial period is active, but Bitrix24 refused to issue the paired key. The original reason is in error.details.reason, and error.details.retryable: true says the state is transient |
CodeCONNECTOR_PLAN_REQUIRED |
HTTP502 | When it occursThe Bitrix24 account plan does not include Vibecode, and there is nothing to offer — a self-hosted portal or an unrecognized region. The human-readable cause arrives in error.userMessage. The state is permanent: retrying will not help until the plan changes. Where access is sold, the same refusal arrives as 402 with a plan paywall code |
The codes arrive on application creation where the application is installed by the connector module: on a self-hosted account, and on a cloud account once that issuance path is enabled for it. On any of these refusals neither the application nor the paired key is created.
Bitrix24 module unavailable on the account
| Code | HTTP | When it occurs |
|---|---|---|
CodeBIZPROC_MODULE_NOT_ENABLED |
HTTP409 | When it occursBusiness Processes are not available on the Bitrix24 account: the module is not included in the plan, or it is switched off in account settings. Returned by the business process templates, activities and automation rules endpoints, and by running workflows. In a batch call the response stays 200, and the code arrives in the result of the failed call |
CodeLANDING_MODULE_NOT_ENABLED |
HTTP409 | When it occursThe Sites module is not available on the Bitrix24 account. Returned when reading sites: list, get, search and aggregate |
CodeLISTS_MODULE_NOT_ENABLED |
HTTP409 | When it occursThe Universal Lists module is not available on the Bitrix24 account |
CodeMAIL_MODULE_NOT_ENABLED |
HTTP409 | When it occursThe Mail module or the mailbox methods are not available on the Bitrix24 account |
CodeTIMEMAN_MODULE_NOT_ENABLED |
HTTP409 | When it occursThe Bitrix24 account has no time tracking: the module is not included in the plan, or it is switched off in account settings |
This is a state of the Bitrix24 account, not a request error: while the module is unavailable on the account, a retry returns the same refusal. A Bitrix24 account administrator can enable a switched-off module.
Resource not found
| Code | HTTP | When it occurs |
|---|---|---|
CodeROUTE_NOT_FOUND |
HTTP404 | When it occursThe route or HTTP verb does not exist: a typo in the path, a nonexistent entity, an unsupported method, and also an operation the entity does not have. Check the path against the list in GET /v1/guide. When the path was built from a Bitrix24 method name, the response additionally names the replacement — see "A Bitrix24 method name instead of a V1 path" below |
CodeENTITY_NOT_FOUND |
HTTP404 | When it occursA CRM entity record with the given id does not exist. The canonical code for /v1/deals/:id, /v1/contacts/:id, and similar |
CodeNOT_FOUND |
HTTP404 | When it occursGET /:id only: Bitrix24 returned success, but result is empty (applies to several smart methods) |
CodeOPERATION_NOT_FOUND |
HTTP404 | When it occursNo deploy operation with this ID is available: the ID does not exist, the operation belongs to another key, or the record has already been removed. All three cases answer identically on purpose — see Deploy outcome |
Domain *_NOT_FOUND codes (BOT_NOT_FOUND, SERVER_NOT_FOUND, AGENT_NOT_FOUND, APP_NOT_FOUND, PORTAL_NOT_FOUND, USER_NOT_FOUND, FILE_NOT_FOUND, SUBSCRIPTION_NOT_FOUND) are documented on the pages of their respective sections.
B24_EMBEDDING_APP_NOT_FOUND (404) is a separate case: the application exists in Vibecode, but Bitrix24 does not know its identifier. The condition and the recovery steps are in the "Permissions and scopes" group above.
Two kinds of 404. The same HTTP status 404 covers two different states — tell them apart by error.code. ROUTE_NOT_FOUND — the route or verb does not exist, retrying is pointless: check the path against GET /v1/guide. ENTITY_NOT_FOUND and the domain *_NOT_FOUND codes — the route exists and the requested object is not found. Both states use the unified V1 envelope.
The route does not exist:
{
"success": false,
"error": {
"code": "ROUTE_NOT_FOUND",
"message": "Route GET:/v1/dealz not found. Check GET /v1/guide for available endpoints and verbs."
}
}
The route exists, the object does not:
{
"success": false,
"error": {
"code": "ENTITY_NOT_FOUND",
"message": "Item not found"
}
}
A Bitrix24 method name instead of a V1 path. Vibecode API paths do not mirror Bitrix24 method names, so a request such as GET /v1/crm.deal.list answers 404 ROUTE_NOT_FOUND and does not call the Bitrix24 method. For the cases that have been mapped, the response additionally names the right route in error.details.
error.details field |
Type | Description |
|---|---|---|
error.details fieldreason |
Typestring | DescriptionBITRIX_METHOD_AS_PATH — the path was built from a Bitrix24 method name |
error.details fieldbitrixMethod |
Typestring | DescriptionThe method name recognized in the path |
error.details fieldsuggestedEndpoint |
Typeobject | DescriptionThe V1 route that solves the same task: method and path |
error.details fieldguide |
Typeobject | DescriptionA pointer to the route reference: method and path (GET /v1/guide) |
A replacement is named for four methods: catalog.product.list → GET /v1/catalog-products, crm.deal.list → GET /v1/deals, crm.user.list → GET /v1/users, crm.deal.search → POST /v1/deals/search. On any other path ROUTE_NOT_FOUND arrives without details, and the route has to be found through GET /v1/guide.
{
"success": false,
"error": {
"code": "ROUTE_NOT_FOUND",
"message": "Route GET:/v1/crm.deal.list not found. Bitrix24 method names are not V1 API paths; use GET /v1/deals instead. Check GET /v1/guide for required parameters and other endpoints.",
"details": {
"reason": "BITRIX_METHOD_AS_PATH",
"bitrixMethod": "crm.deal.list",
"suggestedEndpoint": { "method": "GET", "path": "/v1/deals" },
"guide": { "method": "GET", "path": "/v1/guide" }
}
}
}
Repeat the request against suggestedEndpoint and take the parameter set from guide: a V1 route has its own filters and fields rather than the ones inherited from the Bitrix24 method.
Causes and step-by-step fixes for ENTITY_NOT_FOUND — Request and data.
State conflicts
| Code | HTTP | When it occurs |
|---|---|---|
CodeCONFLICT |
HTTP409 | When it occursThe current resource state is incompatible with the request |
CodeALREADY_EXISTS |
HTTP409 | When it occursA record with these key fields already exists |
CodeCURRENCY_MISMATCH |
HTTP409 | When it occursThe payment currency does not match the currency of its order. Checked on create; an update is not checked, as the request body carries no order ID. Bitrix24 stores a payment in the order currency and never applies the one sent; omit the field to inherit it. See Create payment |
CodeB24_USER_DELETED |
HTTP409 | When it occursThe Bitrix24 employee who owns the key is no longer active on the account — no key can be issued for them. It arrives wherever a key gets an owner: application creation, project deploy key issuance, and key issuance or reissue with a management key (management keys). The state is permanent — only restoring the employee on the account helps |
CodeKEY_ROTATION_RECOVERY_REQUIRED |
HTTP409 | When it occursThe key's replacement is unfinished: its rotation ended with a 500 response or has not finished yet. It arrives on rotating or deleting such a key and on issuing an access token with it. The steps are in Management keys |
CodeAPPLICATION_KEY_RECOVERY_REQUIRED |
HTTP409 | When it occursA key with an unfinished replacement cannot be attached to a server or an application. It arrives, among other places, on server creation when the replacement of the key that made the request is unfinished, and on replacing a Cowork application key when a key attached to that application is involved in an unfinished replacement. A new Idempotency-Key value does not lift the refusal |
CodeAGENT_WRITE_ALREADY_EXECUTED |
HTTP409 | When it occursAn AI agent sent DELETE to the same address again within 30 seconds of the first call. The repeat is not executed. error.firstStatus holds the success status code of the first delete, or null if it is still running. error.firstExecutedAt holds the time of the first call. If the first delete failed, the repeat goes through as usual. Creates and updates are not checked this way, and requests made with other keys are not affected |
CodeEVENT_BOUND_ELSEWHERE |
HTTP409 | When it occursA Bitrix24 event is already bound to another server of the same OAuth application. See Bitrix24 event subscriptions |
CodeCATALOG_ALREADY_PUBLISHED |
HTTP409 | When it occursThe server already has a card in the Bitrix24 app catalog. See Publish to the catalog |
CodeCATALOG_DELETE_PENDING |
HTTP409 | When it occursThe catalog card is already queued for deletion — publishing is unavailable in this state |
CodeOAUTH_CLIENT_ID_IN_USE |
HTTP409 | When it occursPOST /v1/apps/:id/relink-oauth: the given bitrixClientId is already linked to another application. One client_id — one application |
CodeOPERATION_OUTCOME_EXPIRED |
HTTP410 | When it occursThe deploy operation is yours and definitely ran, but its outcome is no longer stored (kept for 7 days). See Deploy outcome |
Billing and plans
These errors occur on endpoints that create and wake infrastructure (servers, agents, managed bots). The response includes a localized userMessage for display in the client interface.
| Code | HTTP | When it occurs |
|---|---|---|
CodeBILLING_EXHAUSTED |
HTTP402 | When it occursThe balance dropped into the red zone and the account is frozen. A top-up is required |
CodeACCOUNT_FROZEN |
HTTP402 | When it occursThe billing account is frozen over a negative balance. The refusal arrives on calls paid for from the Vibe credits balance. The full list is in the "What the account freeze closes" block below |
CodeCOMMERCIAL_PLAN_REQUIRED |
HTTP402 | When it occursThe platform could not find the record of the Bitrix24 account the key is bound to, so it cannot check access. Returned when creating a server |
CodeOPEN_MODE_REQUIRES_COMMERCIAL |
HTTP402 | When it occursSwitching a server to OPEN or enabling allowOpenMode requires current full access: a paid commercial Bitrix24 plan (a Vibe+ plan when Vibe+ is required). Past payments and trial access do not clear the refusal; read userMessage and details.upgradeUrl |
CodeINT_TARIFF_REQUIRED |
HTTP402 | When it occursThe portal is on a free Bitrix24 plan — creating servers, deploying, and issuing keys require a commercial plan (a demo Bitrix24 plan grants a limited trial). Blocking key issuance also blocks creating an application — the paired key is issued there. On wake, only a Galaxy app gets this code. The same code answers app install and placement binding with 403 — see the 403 row below |
CodeINT_VIBE_PLUS_REQUIRED |
HTTP402 | When it occursThe Bitrix24 account is not on a Vibe+ plan. Upgrade the account to a Vibe+ plan and retry |
CodeSELFHOSTED_NOT_AVAILABLE |
HTTP402 | When it occursSelf-hosted Bitrix24 is not available on this installation yet — access is being opened gradually. The account's servers and data are kept as they are; nothing is deleted. No plan purchase clears this refusal: the contact address is support (details.upgradeUrl carries a mailto:) |
CodeTRIAL_PORTAL_LIMIT |
HTTP402 | When it occursThe overall per-portal server limit was exceeded during the trial period |
CodeAPPLICATION_REUSE_CONFLICT |
HTTP409 | When it occursWhile the platform was picking an existing server to reuse, a parallel request changed the server's binding to the application. retryable: true; retry the create request |
CodePLAN_NOT_ALLOWED_ON_TRIAL |
HTTP402 | When it occursThe requested server/agent plan is unavailable during the trial period |
CodeGALAXY_NOT_ON_TRIAL |
HTTP402 | When it occursA Galaxy host cannot be created on trial access. Obtain full access with a paid commercial Bitrix24 plan (a Vibe+ plan when Vibe+ is required); for trial deployment use a standalone server with a plan listed in capabilities.servers.create.limits.allowedPlans from GET /v1/me, within the remaining quota. This refusal does not forbid a GALAXY_APP container on an existing eligible host |
CodeVIBE_DEMO_EXPIRED |
HTTP403 | When it occursThe Vibe+ trial on the Bitrix24 account has ended and the server is a trial machine: starting, waking, rebooting and repairing it are refused until the account is on a paid Vibe+ plan. The server and its data are kept |
CodeSERVER_WAKE_BLOCKED |
HTTP403 | When it occursServer wake-up is blocked for a non-billing reason — for example, platform access ended |
CodeINT_TARIFF_REQUIRED |
HTTP403 | When it occursBinding a placement, installing an app, and issuing or rotating a personal key all require a commercial Bitrix24 plan — including on a self-hosted portal, where the key is issued by the connector module |
CodePORTAL_TARIFF_UNREADABLE |
HTTP403 | When it occursThe account plan could not be read, so the response does not name which plan is required: details.requiredTariffs is empty and the button points to support. Buying a plan does not clear this refusal |
What the account freeze closes. The 402 ACCOUNT_FROZEN refusal arrives on calls paid for from the Vibe credits balance: infrastructure /v1/infra/..., storage /v1/storage/..., search and deep research, AI spend beyond the Bitrix24 account plan's monthly quota, the application's source storage, ticket attachments and updating a ticket, and also issuing a project deployment key, creating an application and creating an application from Cowork/Code, redeeming a coupon, resetting limits with a promotion right and starting the Marketplace trial.
Calls that the balance does not pay for keep working under the freeze: requests to your own Bitrix24 through the entity routes and the batch call, AI within the Bitrix24 account plan's monthly quota, the paid period of a Cowork/Code subscription, the model list, the self-description GET /v1/me, the reference, the spec GET /v1/openapi.json, the support conversation — filing a ticket, listing tickets, reading one ticket and commenting on it — and the revocation of your own Cowork/Code key.
For every family listed above except AI, the refusal precedes request validation, so a call closed by the freeze returns neither 400 nor 404. On the AI routes the handler itself makes the decision after parsing the parameters, so a request carrying a bad field returns 400 before the freeze check is reached.
Important: the narrowed refusal is being rolled out account by account. Until it reaches your Bitrix24 account, the freeze answers 402 ACCOUNT_FROZEN on almost any V1 call, including entity reads and the batch call. What stays open in that state is the self-description, the reference, the spec, the same four support-conversation calls, and the revocation of your own Cowork/Code key.
Causes and step-by-step fixes for BILLING_EXHAUSTED, COMMERCIAL_PLAN_REQUIRED and INT_TARIFF_REQUIRED — Billing and plans.
Rate limiting
| Code | HTTP | When it occurs |
|---|---|---|
CodeRATE_LIMITED |
HTTP429 | When it occursBitrix24 throttled the request rate or an internal limit was exceeded. A standalone refusal carries the retry delay in the Retry-After header (seconds), with no body retryAfter field. A platform-built batch suberror carries the delay in retryAfter inside a 200 response, with no separate header for the subcall |
CodeCALLER_RATE_LIMITED |
HTTP429 | When it occursThe overall per-minute request limit is exhausted. Platform-wide ceilings: 600 per API key, 1200 across all keys of one owner; bot event polling is counted by separate counters — 120 per bot, 600 per key and 1200 per owner. The ceilings are divided across backend replicas, so a refusal can come earlier than the named numbers, and the effective number is not published in a header (details). The X-RateLimit-Scope header names the counter (key, user, bot), Retry-After gives the seconds until the one-minute window ends. The body has no retryAfter field |
CodeERROR_LOOP_DETECTED |
HTTP429 | When it occursA Vibecode-side block: the same request repeats with the same error. A signal of a bug in the client code. Recovery probes require both N requests and a growing pause; a successful call clears the block |
CodeOPERATION_TIME_LIMIT |
HTTP429 | When it occursBitrix24 paused THIS method for YOUR key for about 5 minutes: the method exhausted its operating-time budget. The response carries scope: "apiKey", retryAfter and the Retry-After header. Other methods and other keys on the portal keep working |
CodeTIMEOUT_QUARANTINE |
HTTP429 | When it occursA Vibecode-side block: the method failed to respond within the call timeout several times in a row, and the "portal + method" pair was paused. The response carries scope: "portal", retryAfter and the Retry-After header. The pause is shared by EVERY key on the portal and is lifted automatically |
Causes and step-by-step fixes for this group — Limits, queues, and pauses.
Backend and third-party services
| Code | HTTP | When it occurs |
|---|---|---|
CodeBITRIX_ERROR |
HTTP422 | When it occursBitrix24 returned a business error that does not fall under narrower categories (ACCESS_DENIED, NOT_FOUND, INVALID_PARAMS) |
CodeAGGREGATION_LIMIT_EXCEEDED |
HTTP422 | When it occursAggregation refused to answer: the selection is wider than 5000 records, the estimated call cost exceeded the safe budget, a page of records failed to load — or (for activities with no narrowing filter) Bitrix24 did not answer within the time allowed for one call. message says which case it is. There is no Retry-After header: the refusal is not transient |
CodeMETHOD_NOT_YET_AVAILABLE |
HTTP422 | When it occursThe method ships in a Bitrix24 update that has not reached this portal yet. The response contains an error.release field with the update identifier, for example imopenlines 26.700.0. This signals a gradual rollout of the update, not a call error — details |
CodeSTAGE_NOT_APPLIED |
HTTP422 | When it occursBitrix24 accepted the write but did not apply the stage or the pipeline: the value that was sent is not in the dictionary. The record has already been created or changed — its actual state arrives in the response data. The batch endpoints and import reach the same verdict, only inside a 200: an item of POST /v1/{entity}/batch and a row of POST /v1/{entity}/import get success: false, this code in error and keep their id; a sub-call of POST /v1/batch moves to data.errors.<id> with the record in that error's data. On single create this code is never returned: there the stage is checked against the dictionary BEFORE the write and the refusal comes as UNKNOWN_STAGE (the record cannot be checked after creation — portal automation runs there, and an automation rule that fires "on creation" would produce a false refusal; import runs no automation rules) |
CodeAMOUNT_NOT_APPLIED |
HTTP422 | When it occursThe request EXPLICITLY asked for manual amount mode (isManualOpportunity: true) on a smart-process item — Bitrix24 accepted the write but did not store the flag. The usual cause is a type with product rows disabled (isLinkWithProductsEnabled: false): the amount and the flag are stored only on types with product rows enabled. Manual mode is recognized in every spelling the platform accepts: true, "true", "Y", "yes", "1". The amount, if one was sent, is listed in the refusal alongside the flag; an amount sent WITHOUT the flag is not checked — from the response it is indistinguishable from a legitimate recalculation from product rows. The record was already created or updated — its actual state comes back in the response data, and the fields that were not applied are listed in error.details.unappliedFields. Such a call used to answer 201/200 with the amount silently gone. The batch endpoints and import reach the same verdict, only inside a 200: an item of POST /v1/items/{entityTypeId}/batch and a row of POST /v1/items/{entityTypeId}/import get success: false, this code in error and keep their id; a sub-call of POST /v1/batch moves to data.errors.<id> with the record in that error's data |
CodeREST_REGISTRATION_FAILED |
HTTP400 | When it occursBitrix24 refused to register the application or an inbound webhook and gave no reason. Comes back from creating an application and from issuing a personal key. The response carries error.details.incidentCode — a six-character support reference that locates the log entry. Quote it when you contact support |
CodeBITRIX_UNAVAILABLE |
HTTP502 | When it occursBitrix24 returned 5xx, did not respond in time, or the connection to Bitrix24 dropped before a complete response |
CodeBIND_FAILED |
HTTP502 | When it occursBitrix24 rejected the event registration (event.bind) — for example, the portal is not on a commercial plan. See Bitrix24 event subscriptions |
CodeWINDOWED_SEARCH_FAILED |
HTTP— | When it occursNo longer returned: when auto-windowing fails completely, /search returns the real Bitrix24 code — UNKNOWN_FILTER_FIELD / INVALID_PARAMS / BITRIX_ACCESS_DENIED / RATE_LIMITED / BITRIX_UNAVAILABLE / BITRIX_TIMEOUT (503) / BITRIX_ERROR (422), same as for a narrow range |
CodeQUEUE_OVERFLOW |
HTTP429 | When it occursThe account queue is overflowing: too many concurrent Bitrix24 calls. Rejected instantly, Retry-After in the header |
CodeQUEUE_TIMEOUT |
HTTP429 | When it occursThe account queue is saturated: more than 80 seconds of waiting on the Vibecode side. The request was NOT sent to Bitrix24 — safe to retry |
CodeBITRIX_TIMEOUT |
HTTP503 | When it occursBitrix24 accepted the request but did not respond within 60 seconds — the outcome is unknown. For writes: re-read the entity first, the change may have applied |
CodePOOL_EXHAUSTED |
HTTP503 | When it occursThe service is temporarily overloaded — the database connection pool is exhausted. The response carries retryAfter and a Retry-After header. A write's outcome is unknown: re-read the state before retrying |
CodeDB_TRANSIENT |
HTTP503 | When it occursA database transaction closed or expired. The response carries retryAfter and a Retry-After header. Rolling back a local transaction does not roll back a Bitrix24 call that already completed, so re-read the state before retrying a write |
CodeSERVICE_UNAVAILABLE |
HTTP503 | When it occursThe platform edge could not pass the request to the backend (during a redeploy, for instance) — or did not get an answer in time. The response carries retryAfter and a Retry-After header. If the request may already have run (the response wait timed out), re-read the entity before retrying a non-idempotent operation |
CodeINTERNAL_ERROR |
HTTP500 | When it occursAn unexpected Vibecode backend error |
CodePLACEMENT_UNBIND_FAILED |
HTTP502 | When it occursBitrix24 did not confirm the removal of placements. Publishing and updating an application are not applied, and the codes arrive in error.placements. Returned only on Bitrix24 accounts where the removal check is enabled |
CodeNETWORK_DEVKEY_REQUIRED |
HTTP503 | When it occursThe developer key for the application author has not been issued yet — binding a placement is temporarily unavailable. On Bitrix24 accounts with the removal check enabled, publishing and updating an application answer with the same code |
Causes and step-by-step fixes for BITRIX_ERROR, METHOD_NOT_YET_AVAILABLE, BITRIX_UNAVAILABLE, BITRIX_TIMEOUT and INTERNAL_ERROR — Bitrix24 and the platform. For QUEUE_OVERFLOW and QUEUE_TIMEOUT — Limits, queues, and pauses. Target-call delivery and retry safety for reads and writes are collected separately on What is safe to retry.