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

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

Management keys

Management keys (vibe_live_) are not tied to a single Bitrix24 account and are intended for automating administration: managing API keys, viewing Bitrix24 accounts, and working with feedback.

Difference from Bitrix24 account keys

Capability API key (vibe_api_) Authorization key (vibe_app_) Management key (vibe_live_)
CapabilityBound to a Bitrix24 account API key (vibe_api_)Yes (a single account) Authorization key (vibe_app_)Yes (a single account) Management key (vibe_live_)No (all of the user's accounts)
CapabilityAccess to Bitrix24 entities (deals, tasks, etc.) API key (vibe_api_)Yes Authorization key (vibe_app_)Yes Management key (vibe_live_)No
CapabilityManaging API keys API key (vibe_api_)No Authorization key (vibe_app_)No Management key (vibe_live_)Yes
CapabilityViewing the Bitrix24 account list API key (vibe_api_)No Authorization key (vibe_app_)No Management key (vibe_live_)Yes
CapabilityWorking with feedback API key (vibe_api_)Own tickets only Authorization key (vibe_app_)Own tickets only Management key (vibe_live_)All platform tickets
CapabilityAPI reference (/v1/guide) API key (vibe_api_)Filtered by scopes Authorization key (vibe_app_)Filtered by scopes Management key (vibe_live_)Full (all entities)

Management key scopes

Each management key is created with one or more scopes. Without the required scope, the endpoint returns 403 MANAGEMENT_SCOPE_REQUIRED — even if the endpoint is otherwise available to management keys.

Scope Grants
Scopevibe:mgmt:keys Grants/v1/keys (list, create, update, delete, rotate)
Scopevibe:mgmt:portals Grants/v1/portals
Scopevibe:mgmt:feedback Grants/v1/feedback (ticket list, read, update, comments)

The endpoints /v1/me, /v1/guide, and /v1/openapi.json are available to any management key without a separate scope.

When creating a key, select only the scopes you need — if the key is intended only for managing API keys, it does not need the vibe:mgmt:feedback scope.

Key owner's account state

A management key acts on behalf of its owner, so the state of the owner's account is checked on every endpoint available to management keys — on reads and on writes alike. The check runs before the scope check, so these codes arrive even where the key lacks the required scope.

HTTP Code When returned
HTTP403 CodeOWNER_DELETED When returnedThe key owner's account has been deleted
HTTP403 CodeOWNER_BLOCKED When returnedThe key owner is blocked or no longer active in the Bitrix24 account
HTTP503 CodeACCOUNT_PENDING_ERASURE When returnedThe owner requested erasure of their data — the key is frozen until the cancellation window ends. The response carries a Retry-After: 3600 header. Cancelling the request restores the key — no rotation is needed
HTTP409 CodeB24_USER_DELETED When returnedThe key owner is no longer an active employee of the target Bitrix24 account — no key can be issued for them. Checked on issuance (POST /v1/keys) and rotation (POST /v1/keys/:id/rotate), the two operations that give a new key an owner. Different from NOT_PORTAL_MEMBER: that one arrives when the owner is not on the account at all, this one when the record exists but the employee has been deleted or deactivated

The freeze covers every management-key operation, including issuing, rotating and deleting API keys.

Available endpoints

Calls to Bitrix24 entity endpoints return 403 MANAGEMENT_KEY_NO_ENTITY_ACCESS.

`GET /v1/me` — key self-description

Returns the key type, the list of Bitrix24 accounts with roles and key counts, the list of available endpoints, and a quickstart.

Terminal
curl -H "X-Api-Key: vibe_live_abc123..." \
  https://vibecode.bitrix24.com/v1/me

Response:

JSON
{
  "success": true,
  "data": {
    "type": "management",
    "keyPrefix": "vibe_live_abc123",
    "keySuffix": "f9d2",
    "expiresAt": null,
    "scopes": [],
    "capabilities": [
      "GET https://vibecode.bitrix24.com/v1/me — this endpoint (management key self-description)",
      "GET https://vibecode.bitrix24.com/v1/guide — full API reference (portal-agnostic)",
      "GET https://vibecode.bitrix24.com/v1/keys — list APP keys for a portal (requires portalId query param)",
      "POST https://vibecode.bitrix24.com/v1/keys — create APP key (requires portalId in body)",
      "GET https://vibecode.bitrix24.com/v1/portals — list your portals",
      "GET https://vibecode.bitrix24.com/v1/feedback — list ALL platform feedback (management key sees everything)",
      "GET https://vibecode.bitrix24.com/v1/feedback/:id — feedback details including comment thread",
      "PATCH https://vibecode.bitrix24.com/v1/feedback/:id — update status/resolution (legacy, prefer /comments)",
      "POST https://vibecode.bitrix24.com/v1/feedback/:id/comments — post a team comment, changes status"
    ],
    "portals": [
      {
        "id": "portal-uuid",
        "domain": "mycompany.bitrix24.com",
        "status": "ACTIVE",
        "role": "ADMIN",
        "appKeyCount": 3
      }
    ],
    "totalAppKeys": 3,
    "quickstart": {
      "step1": "GET https://vibecode.bitrix24.com/v1/portals — list available portals",
      "step2": "GET https://vibecode.bitrix24.com/v1/keys?portalId=<id> — list APP keys for a portal",
      "step3": "POST https://vibecode.bitrix24.com/v1/keys { portalId, name, scopes } — create an APP key",
      "step4": "Use the APP key for entity API calls (deals, tasks, etc.)"
    },
    "docs": "https://vibecode.bitrix24.com/docs/management-keys"
  }
}

The response also contains a feedback object that lists the endpoints, statuses, and filters for working with feedback tickets — it is used by AI models to process tickets automatically.

`GET /v1/guide` — API reference

Returns the full API reference with all entities (no scope filtering). Used to pick the required endpoints before creating API keys.

Terminal
curl -H "X-Api-Key: vibe_live_abc123..." \
  https://vibecode.bitrix24.com/v1/guide

`GET /v1/openapi.json` — OpenAPI specification

Returns the machine-readable OpenAPI 3.1 specification of the Vibecode platform.

Terminal
curl -H "X-Api-Key: vibe_live_abc123..." \
  https://vibecode.bitrix24.com/v1/openapi.json

`GET /v1/portals` — Bitrix24 account list

Returns the Bitrix24 accounts the user has access to, along with the user's role in each.

Terminal
curl -H "X-Api-Key: vibe_live_abc123..." \
  https://vibecode.bitrix24.com/v1/portals

`GET /v1/keys` — API key list for a Bitrix24 account

The portalId parameter is required. The response lists the management key owner's keys in the specified Bitrix24 account — both personal vibe_api_ keys and authorization vibe_app_ keys. Key values are never returned: you recognize your own key in the list by its prefix and suffix fields.

Terminal
curl -H "X-Api-Key: vibe_live_abc123..." \
  "https://vibecode.bitrix24.com/v1/keys?portalId=portal-uuid"
Field Type Description
Fielddata[].id Typestring DescriptionIdentifier of the key record. Accepted by endpoints that need a key as a resource — for example targetApiKeyId in bot ownership transfer
Fielddata[].name Typestring DescriptionKey name given at creation
Fielddata[].prefix Typestring DescriptionBeginning of the key value
Fielddata[].suffix Typestring DescriptionLast characters of the key value
Fielddata[].type Typestring DescriptionKey type. For Bitrix24 account keys — APP
Fielddata[].userId Typestring DescriptionIdentifier of the key owner
Fielddata[].portalId Typestring DescriptionIdentifier of the Bitrix24 account
Fielddata[].clientId Typestring | null DescriptionIdentifier of the OAuth application for an authorization key, null for a personal key
Fielddata[].scopes Typearray DescriptionKey scopes
Fielddata[].ipWhitelist Typearray DescriptionAllowed IP addresses, an empty array means no restriction
Fielddata[].rateLimit Typenumber | null DescriptionCustom request limit, null means the platform-wide limit
Fielddata[].status Typestring DescriptionACTIVE, REVOKED or BLOCKED
Fielddata[].accessMode Typestring DescriptionREADWRITE or READONLY
Fielddata[].issuedVia Typestring | null DescriptionThe channel that issued the key's webhook: per-portal and cloud-shared — the connector module on the account, dev_key — the owner's developer key, legacy — registration through Bitrix24 Network, none — no webhook was created, the key carries vibe:* scopes only. null for keys issued before the field existed
Fielddata[].expiresAt Typestring | null DescriptionExpiration date, null means no expiry
Fielddata[].lastUsedAt Typestring | null DescriptionDate of the last request made with this key
Fielddata[].createdAt Typestring DescriptionCreation date
Fielddata[].updatedAt Typestring DescriptionDate of the last change
JSON
{
  "success": true,
  "data": [
    {
      "id": "3f9a1c20-5e6b-4d18-9a77-0c2b8e4f1d33",
      "name": "Support bot",
      "prefix": "vibe_api_XXXXXXXXX",
      "suffix": "XXXX",
      "type": "APP",
      "userId": "a02e7b64-91c3-4f5a-8d20-7e1b3c95a4dc",
      "portalId": "d41f0b93-6c85-42e7-9a13-58bd0e7c2f46",
      "clientId": null,
      "scopes": ["imbot"],
      "ipWhitelist": [],
      "rateLimit": null,
      "status": "ACTIVE",
      "accessMode": "READWRITE",
      "issuedVia": "legacy",
      "expiresAt": null,
      "lastUsedAt": "2026-07-29T09:12:44.301Z",
      "createdAt": "2026-07-14T08:03:17.118Z",
      "updatedAt": "2026-07-14T08:03:17.118Z"
    }
  ]
}

Refusals of this request:

HTTP Code When returned
HTTP400 CodeMISSING_PORTAL_ID When returnedThe required portalId parameter was not provided
HTTP401 CodeWRONG_KEY_TYPE When returnedThe request was sent with a Bitrix24 account key — the key list is served to a management key only
HTTP403 CodeNOT_PORTAL_MEMBER When returnedThe key owner is not a member of the portal with the given portalId
HTTP403 CodePORTAL_ACCESS_BLOCKED When returnedThe key owner's access to that portal is blocked
HTTP401 CodeKEY_INACTIVE When returnedThe management key is revoked or blocked
HTTP401 CodeKEY_EXPIRED When returnedThe management key's validity period has ended
HTTP403 CodeMANAGEMENT_SCOPE_REQUIRED When returnedThe key does not carry the vibe:mgmt:keys scope

`POST /v1/keys` — create an API key

Creates a new API key (vibe_api_) for the specified Bitrix24 account. Pass portalId, a name, and a list of scopes in the body. The full key is returned in the rawKey field once — save it immediately.

Terminal
curl -X POST \
  -H "X-Api-Key: vibe_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{"portalId": "portal-uuid", "name": "My Key", "scopes": ["crm", "task"]}' \
  https://vibecode.bitrix24.com/v1/keys

By default four platform scopes are added to the requested ones: vibe:infra, vibe:ai, vibe:search, vibe:storage. The key in the example above gets crm, task, and those four.

On an account where the administrator has turned server management off, vibe:infra is silently dropped from that default — the key is issued with the other three. The 403 INFRA_DISABLED_FOR_PORTAL refusal comes back only for an explicitly requested scope.

To get a key with exactly the scopes you listed, pass exactScopes: true:

Terminal
curl -X POST \
  -H "X-Api-Key: vibe_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{"portalId": "portal-uuid", "name": "Storage only", "scopes": ["crm", "vibe:storage"], "exactScopes": true}' \
  https://vibecode.bitrix24.com/v1/keys

Such a key gets only crm and vibe:storage; with it, POST /v1/infra/servers and AI calls return 403. Its scopes are treated as final: the platform does not widen them at request time, so GET /v1/me returns exactly what was stored at issue time.

Field Type Description
FieldexactScopes Typeboolean DescriptionOptional, false by default. true — store exactly the listed scopes, without the four platform ones

Additional error codes:

Code HTTP When returned
CodeMISSING_PORTAL_ID HTTP400 When returnedportalId not provided in the request body
CodeBILLING_MODE_NOT_SUPPORTED HTTP400 When returnedThe body carries billing: "subscription". Subscription-billed Cowork/Code keys are issued from the Vibecode dashboard only — see Your own agent on the subscription
CodeNOT_PORTAL_MEMBER HTTP403 When returnedThe key owner is not a member of the specified portal
CodePORTAL_NOT_LINKED HTTP400 When returnedThe portal is not connected to Bitrix24 Network — the key cannot be created
CodePERSONAL_KEY_WEBHOOK_SCOPES_INVALID HTTP400 When returnedNo data scope is left in scopes. A personal key is backed by a Bitrix24 incoming webhook, while placement, entity, and userfieldtype require an application context and are unavailable to a personal key. Add at least one data scope, for example crm or user_brief, or register an OAuth application for application features
CodeINVALID_SCOPES HTTP400 When returnedSome of the requested scopes are unavailable on the Bitrix24 account
CodeINFRA_DISABLED_FOR_PORTAL HTTP403 When returnedscopes explicitly asks for vibe:infra and the Bitrix24 account administrator has turned server management off. The key is not created. A request without that scope goes through on such an account as well
CodeINT_TARIFF_REQUIRED HTTP402 When returnedThe portal is on a free Bitrix24 plan. For accounts where access is narrowed to the Vibe+ plan line, infrastructure and key issuance require a Vibe+ plan, and an ordinary commercial plan is declined with INT_VIBE_PLUS_REQUIRED
CodeREST_REGISTRATION_FAILED HTTP400 When returnedBitrix24 refused to register the incoming webhook and gave no reason. The response carries error.details.incidentCode — a six-character support reference that locates the log entry
CodeINT_TARIFF_REQUIRED HTTP403 When returnedThe account's Bitrix24 plan does not grant access, so the webhook is not issued. The response carries no upgrade link
CodePORTAL_TARIFF_UNREADABLE HTTP403 When returnedThe account plan could not be read, and the response does not name the plan that is missing: error.details.requiredTariffs is empty and the button points to support. Buying a plan does not clear this refusal
CodeB24_INSUFFICIENT_SCOPE HTTP403 When returnedThe owner's developer key lacks the required rights on the account. Reconnect the account so the developer key is re-issued
CodeB24_ACCESS_DENIED HTTP403 When returnedBitrix24 did not issue the webhook because of the employee's rights
CodeCONNECTOR_KEY_ISSUE_FORBIDDEN HTTP403 When returnedThe account bars this employee from issuing keys. The right is granted by an account administrator. For details, see Creation rights
CodeCONNECTOR_MODULE_NOT_INSTALLED HTTP409 When returnedThe connector module is not installed on the account, so a key cannot be issued through it. The state is permanent — retrying without installing the module will not help
CodeB24_USER_DELETED HTTP409 When returnedThe key owner has been deleted from the Bitrix24 account — the key is not created
CodeSTALE_DEVELOPER_KEY HTTP410 When returnedThe owner's developer key is invalid and cannot be re-issued automatically. Reconnect the account
CodeRECOVERY_FAILED HTTP502 When returnedRe-issuing the developer key failed. The state is transient — retry the request
CodeCONNECTOR_REST_UNAVAILABLE HTTP502 When returnedThe account's plan or trial period is active, but Bitrix24 refused the issuance. The original reason arrives in error.details.reason, and the state is transient
CodeCONNECTOR_PLAN_REQUIRED HTTP502 When returnedThe Bitrix24 account plan does not include Vibecode, and there is nothing to offer — a self-hosted portal, an unrecognized region. The human-readable cause arrives in error.userMessage. The state is permanent: retrying will not help until the plan changes
CodeCONNECTOR_KEY_ISSUE_FAILED HTTP502 When returnedAny other refusal from the connector module, or its transport was unreachable. The original reason arrives in error.details.reason
CodeDEVKEY_MINT_FAILED HTTP502 When returnedAny other issuance failure through the developer key. Diagnostics arrive in error.details.b24Code and error.details.b24Status
CodeBITRIX_UNAVAILABLE HTTP502 When returnedBitrix24 did not respond to the incoming webhook registration

The 403, 409, 410 and 502 issuance refusals from the table above also arrive on POST /v1/keys/:id/rotate — both methods issue the key through the same path. The exception is 403 PORTAL_TARIFF_UNREADABLE: it is an outcome of the platform access check, which does not apply to rotation. A 402 reaches rotation only from the issuance itself — the second check described below. The platform access check does not extend to rotation. The body of such a refusal carries an optional error.reason field with the exact cause in the platform's taxonomy, while error.code stays as it was. Branch on error.code, not on the message text.

The 402 INT_TARIFF_REQUIRED refusal comes from the platform access check: a commercial Bitrix24 plan grants full access, a trial plan grants limited access, and an account on a free plan is refused. That check applies to issuing a new key only: rotation via POST /v1/keys/:id/rotate, automatic key recovery and ownership handover are not subject to it, and already issued keys keep working. The same check has one outcome with status 403, PORTAL_TARIFF_UNREADABLE: the account plan could not be read at all, so the platform has nothing to name as the required plan.

A second check runs later, and its reach is wider: Bitrix24 itself refuses the issuance because the account plan does not include Vibecode. It fires on everything that actually issues a key — creation, rotation via POST /v1/keys/:id/rotate, automatic key recovery and ownership handover. Where access can be purchased, the answer is 402 INT_VIBE_PLUS_REQUIRED; where there is nothing to offer, it is 502 CONNECTOR_PLAN_REQUIRED from the table above. Either code is terminal: retrying will not help until the Bitrix24 plan changes.

The placement, entity, and userfieldtype scopes are not kept on the success path either: a created personal key does not return them in the response scopes, even when they were sent alongside data scopes. userfieldconfig remains available.

`GET /v1/keys/:id` — single key data

Returns a single key record without its value. The field set is the same as for GET /v1/keys above.

Terminal
curl -H "X-Api-Key: vibe_live_abc123..." \
  https://vibecode.bitrix24.com/v1/keys/key-uuid

`PATCH /v1/keys/:id` — update a key

Any of the fields below can be changed (all optional — pass only what you are changing):

Field Type Description
Fieldname Typestring DescriptionKey name in the Vibecode dashboard
Fieldscopes Typestring[] DescriptionList of scopes — see Scopes
Fieldstatus Type"ACTIVE" | "REVOKED" DescriptionActivate or revoke the key
Fieldmode Type"READWRITE" | "READONLY" DescriptionKey access mode — see Access mode. For Cowork/Code keys the change is restricted — see the table below
FieldipWhitelist Typestring[] DescriptionList of allowed IP addresses
FieldrateLimit Typenumber | null DescriptionCustom request limit per second
FieldexpiresAt TypeISO-8601 | null DescriptionKey expiration (null — never expires)

The new scopes list goes through the same check as on creation: if no data scope is left once placement, entity, and userfieldtype are dropped, 400 PERSONAL_KEY_WEBHOOK_SCOPES_INVALID arrives.

Adding vibe:storage requires a personal key. An application-issued key or a key of unknown origin cannot gain storage access: create a new personal key with storage access. Existing storage may be re-sent unchanged or removed; renaming and other edits remain allowed.

If a self-hosted Bitrix24 portal has moved to a new address while the key's webhook is still issued for the previous one, a scope change is refused with 409 PORTAL_ADDRESS_CHANGED. No request is sent to Bitrix24, and the key's scopes change neither on the Vibecode platform nor in Bitrix24. Reconnect the key and repeat the change — the steps are in Authorization, keys and permissions.

Keys the platform issues on its own endpoints come back into service under special rules. A subscription-billed key is made active again through status and extended through expiresAt only while the issuance checks pass: a failing check answers 403 with its own code — the same issuance-check codes as on rotation; their table is in the POST /v1/keys/:id/rotate section below. The other such keys — a Cowork/Code desktop key, an agent key, a project deploy key — do not come back into service here at all: they are re-issued where they were originally issued.

The mode of Cowork/Code keys lives on the seat — the pair of an employee and a Bitrix24 account, shared by all of the employee's devices. So changing mode on a desktop app key does not go through here at all, and on a third-party agent key billed to the subscription it is capped by the seat mode. A request carrying the same mode, sent for a rename, is not a change and goes through.

Code HTTP When returned
CodeSYSTEM_KEY_REACTIVATE_FORBIDDEN HTTP403 When returnedThe request activates or extends the expiry of a key the platform issues on its own endpoint: a Cowork/Code desktop key, an agent key, a project deploy key. The response text says where that particular key is issued again
CodeKEY_STORAGE_SCOPE_REQUIRES_PERSONAL_KEY HTTP403 When returnedThe new scope set adds vibe:storage to an application-issued key or a key of unknown origin. Create a new personal key with storage access
CodeINFRA_DISABLED_FOR_PORTAL HTTP403 When returnedThe new scopes list adds vibe:infra, which the key did not carry, and the Bitrix24 account administrator has turned server management off. The key's scopes do not change. What counts is the addition, not the presence of the scope in the body: editing a key that already carries it goes through on such an account too, and removing the scope is always allowed
CodeCOWORK_SEAT_KEY_MODE_CABINET_ONLY HTTP403 When returnedThe request changes mode on a Cowork/Code desktop app key. That is the mode of the whole seat, and it is changed in the Vibecode dashboard, where the change shows what narrows along with it
CodeCOWORK_KEY_MODE_ABOVE_SEAT HTTP403 When returnedThe request raises mode on a third-party agent key billed to the Cowork/Code subscription above the seat mode. Widen the seat first; within the seat the edit goes through

Shortening the expiry, revoking and editing the other fields work as before — they stop a key rather than hand one out. Ordinary dashboard keys are unaffected by these checks.

A separate restriction applies to an authorization key (vibe_app_): a request that changes mode, status or expiresAt does not run at the same time as another operation on a key of the same application.

The codes below apply to any key when the corresponding operation is performed; only REISSUE_IN_PROGRESS is limited to an application authorization key. In particular, revoking an ordinary vibe_api_ key may also return KEY_MANAGES_FOREIGN_SERVER or KEY_OPERATION_IN_PROGRESS.

Code HTTP When returned
CodeREISSUE_IN_PROGRESS HTTP409 When returnedAnother operation on this application's key is already running — a rotation, an update or a deletion. The key is not changed; retry once that operation finishes
CodeKEY_NOT_ACTIVE HTTP409 When returnedThe key is no longer active or has changed since the request started — for example, it was revoked or deleted. Changing mode on a revoked or blocked authorization key also returns this code. The key is not changed. Re-read it with GET /v1/keys/:id
CodeKEY_MANAGES_FOREIGN_SERVER HTTP409 When returnedThe key manages a live server owned by another user, a server without an owner, or a server owned by the same user in another portal. Set the server's owner and intended portal, then rebind it to a key owned by that user in that portal before retrying revocation
CodeKEY_OPERATION_IN_PROGRESS HTTP409 When returnedA transfer, revocation or concurrent scope edit conflicts with this update. Reload the key and retry using its current scopes
Terminal
curl -X PATCH \
  -H "X-Api-Key: vibe_live_abc123..." \
  -H "Content-Type: application/json" \
  -d '{"status": "REVOKED"}' \
  https://vibecode.bitrix24.com/v1/keys/key-uuid

`DELETE /v1/keys/:id` — delete a key

Deletes the key. If the key has active servers, 409 KEY_HAS_ACTIVE_SERVERS is returned — the servers must be deleted first. If an agent, a managed bot, or a regular chatbot, including a disabled Bot Platform row, is managed through the key, deletion returns 409 KEY_HAS_LINKED_AGENT with details.linkedAgentCount, details.linkedBotCount (managed + regular chatbots), a details.agents list, and details.bots (up to 10 regular chatbots). For DELETE /v1/bots/:botId, take the numeric bitrixBotId from the matching details.bots item in the 409 response.

A key whose replacement is unfinished cannot be deleted: the answer is 409 KEY_ROTATION_RECOVERY_REQUIRED. The exception is the new key from a 500 rotation response without the strandedSlots field; the steps are in the POST /v1/keys/:id/rotate section below. Deleting an authorization key (vibe_app_) does not run at the same time as another operation on a key of the same application: the answer is 409 REISSUE_IN_PROGRESS. If the key is no longer active or has changed since the request started, the answer is 409 KEY_NOT_ACTIVE.

Terminal
curl -X DELETE \
  -H "X-Api-Key: vibe_live_abc123..." \
  https://vibecode.bitrix24.com/v1/keys/key-uuid

`POST /v1/keys/:id/rotate` — rotate a key

Creates a new key with the same settings and gives the old one a 24-hour transition period. After rotation, the old key automatically becomes invalid. The scopes are carried over from the previous key as they are — a new set is not passed here.

A blocked key (status: BLOCKED) can be rotated too — it is the only way to replace one; there is no unblocking. The block stays, the old key gets no transition period, and its live access tokens are revoked rather than moved.

A rotation can end with a 500 response — the replacement is then rolled back and the response carries no value for the new key, but the new key has already been created. This happens in three cases:

  • KEY_ROTATE_REVOKE_FAILED — for a blocked key, it was not confirmed that its access tokens were revoked.
  • KEY_ROTATION_REPOINT_FAILED — the move of bindings to the new key was not confirmed.
  • KEY_ROTATION_FINALIZE_FAILED — the completion of the replacement was not confirmed.

The new key's ID arrives in error.details.orphanKeyId. The error.details.strandedSlots field appears when the rollback could not return something to the old key, and lists exactly what. If the field is absent or the list has no previousKeyGrace value, the old key keeps its previous expiry after the rollback. The next steps depend on the strandedSlots field:

  • The strandedSlots field is present — contact support. Do not delete the new key while anything still points at it.
  • The strandedSlots field is absent — delete the new key with DELETE /v1/keys/:id using the ID from orphanKeyId. After the 204 response, rotate the old key once more. If the deletion returns 409 KEY_ROTATION_RECOVERY_REQUIRED, contact support.

Until the replacement is finished, rotating or deleting either the old or the new key answers 409 KEY_ROTATION_RECOVERY_REQUIRED, so retrying the rotation without these steps does not go through. The exception is deleting the new key as described in the second item above.

If the source key's binding changes during issuance, the answer is 409 KEY_ROTATION_SOURCE_CHANGED. If the key is deleted, the answer is 404 KEY_NOT_FOUND. Neither outcome creates a new key. Re-read the current key record and state before starting a new operation.

Rotation refusals for an unfinished replacement and concurrent operations:

Code HTTP When returned
CodeKEY_ROTATION_RECOVERY_REQUIRED HTTP409 When returnedThe replacement of this key is unfinished: an earlier rotation ended with a 500 response, or another rotation of the same key has not finished yet. The refusal applies to both the old and the new key of that replacement. No new key is created. If there was no 500 response and the refusal still arrives after a few minutes, contact support
CodeKEY_ROTATE_REVOKE_FAILED HTTP500 When returnedThe replacement was rolled back: for a blocked key, it was not confirmed that its access tokens were revoked. The steps are described above
CodeKEY_ROTATION_REPOINT_FAILED HTTP500 When returnedThe replacement was rolled back: the move of bindings to the new key was not confirmed. The steps are described above
CodeKEY_ROTATION_FINALIZE_FAILED HTTP500 When returnedThe replacement was rolled back: the completion of the replacement was not confirmed. The steps are described above
CodeREISSUE_IN_PROGRESS HTTP409 When returnedAuthorization keys (vibe_app_) only: another operation on this application's key is already running — a rotation, an update or a deletion. Retry once that operation finishes
CodeKEY_NOT_ACTIVE HTTP409 When returnedThe key is no longer active — for example, it was revoked. For an authorization key (vibe_app_) this code is also returned when the key was deleted or changed after the request started. No new key is created. Re-read the key with GET /v1/keys/:id

If the previous Bitrix24 account key is left with only application-context scopes — placement, entity, userfieldtype — rotation fails. The scope set is checked before the account is contacted, so every account receives the same refusal, 400 PERSONAL_KEY_WEBHOOK_SCOPES_INVALID. Add a data scope to the previous key through PATCH /v1/keys/:id first.

Rotation is subject to the same Bitrix24 plan requirement as key creation: on an account whose plan does not grant access, it answers 403 INT_TARIFF_REQUIRED. Every other issuance refusal is the same as on creation — see the code table under POST /v1/keys above. Only the 402 variant of INT_TARIFF_REQUIRED is out of scope for rotation: the platform access check applies to issuing a new key. Already issued keys keep working, and rotation resumes as soon as the account is on a qualifying plan.

Terminal
curl -X POST \
  -H "X-Api-Key: vibe_live_abc123..." \
  https://vibecode.bitrix24.com/v1/keys/key-uuid/rotate

Keys the platform issues on its own endpoints rotate under special rules. For a subscription-billed key, the scope carry-over is not unconditional: before rotation the same checks run as when the key was issued, and a failing check answers 403 with its own code. The other such keys — a Cowork/Code desktop key, an agent key, a project deploy key — are not rotated here at all: they are re-issued where they were originally issued. In all these cases the previous key keeps working.

Code HTTP When returned
CodeSYSTEM_KEY_ROTATE_FORBIDDEN HTTP403 When returnedThe key being rotated is one the platform issues on its own endpoint: a Cowork/Code desktop key, an agent key, a project deploy key. The response text says where that particular key is issued again
CodeCOWORK_PLATFORM_DISABLED HTTP403 When returnedCowork/Code is disabled at the platform level
CodeCOWORK_ACCESS_REQUIRED HTTP403 When returnedThe key owner has not been granted Cowork/Code access
CodeCOWORK_EXTERNAL_CLIENTS_DISABLED HTTP403 When returnedThe account administrator has disallowed third-party clients
CodeCOWORK_SUBSCRIPTION_INACTIVE HTTP403 When returnedThe Cowork/Code subscription is paused or cancelled

Ordinary dashboard keys are unaffected by these checks — they rotate as before. What a subscription key can do and how to issue one — Your own agent on the subscription.

`GET /v1/feedback` — feedback ticket list

Returns all feedback tickets on the platform. Supports filters by status, category, and Bitrix24 account, plus pagination.

Terminal
curl -H "X-Api-Key: vibe_live_abc123..." \
  "https://vibecode.bitrix24.com/v1/feedback?status=NEW&page=1&limit=50"

`GET /v1/feedback/:id` — ticket card

Returns the ticket with the full comment thread.

`PATCH /v1/feedback/:id` — update a ticket

Changes the ticket status and resolution.

`POST /v1/feedback/:id/comments` — comment on a ticket

Adds a team comment to the thread and changes the status at the same time. Used by AI models to reply to the user.

Ticket statuses

Status When applied
StatusNEW When appliedThe user has just submitted the ticket; no one has looked at it yet
StatusREVIEWING When appliedThe team has started working on the ticket; the user is not yet receiving updates
StatusAWAITING_USER When appliedThe team asked the user a clarifying question — awaiting a reply (the user receives an email)
StatusNEEDS_REVIEW When appliedThe user replied to the clarification — the team reads the new comment and decides the next step
StatusRESOLVED When appliedThe fix is published in the production environment; the user has been notified
StatusARCHIVED When appliedClosed without a code change (duplicate, off-topic, not reproducible)
StatusWITHDRAWN When appliedThe author withdrew the ticket themselves; no triage is needed

A user's reply moves a ticket out of AWAITING_USER into NEEDS_REVIEW. A resolved ticket (RESOLVED) is brought back into the queue by an author reply — the status also becomes NEEDS_REVIEW, the closure stamp (resolvedAt, resolvedBy) is cleared, and the resolution text is kept. On NEW, REVIEWING and NEEDS_REVIEW the status is preserved, because the next move is the team's anyway. The updatedAt field is always refreshed, so a queue sorted by it surfaces new replies regardless of status.

Ticket categories

BUG, SUGGESTION, DOCS, CHAT, BOTS, OTHER.

List filters

?status=NEW&category=BUG&portalId=<uuid>&page=1&limit=50. The limit parameter is capped at 100.

Quickstart

  1. Create a management key in the Vibecode dashboard (the "Management Keys" section)
  2. Get the Bitrix24 account list: GET /v1/portals
  3. View the existing keys in the target Bitrix24 account: GET /v1/keys?portalId=<id>
  4. Create an API key with the required scopes: POST /v1/keys { portalId, name, scopes }
  5. Use the resulting API key (vibe_api_…) to work with Bitrix24 data

Limitations

  • Management keys cannot call Bitrix24 entity endpoints (/v1/deals, /v1/tasks, and others)
  • To work with data, use an API key (vibe_api_) or an authorization key (vibe_app_)
  • An attempt to call an unsupported endpoint returns 403 MANAGEMENT_KEY_NO_ENTITY_ACCESS

See also