Para agentes de IA: markdown desta página — /docs-content-en/management-keys.md índice da documentação — /llms.txt
Os artigos da documentação estão disponíveis atualmente em inglês.
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_) |
|---|---|---|---|
| Bound to a Bitrix24 account | Yes (a single account) | Yes (a single account) | No (all of the user's accounts) |
| Access to Bitrix24 entities (deals, tasks, etc.) | Yes | Yes | No |
| Managing API keys | No | No | Yes |
| Viewing the Bitrix24 account list | No | No | Yes |
| Working with feedback | Own tickets only | Own tickets only | All platform tickets |
API reference (/v1/guide) |
Filtered by scopes | Filtered by scopes | 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 |
|---|---|
vibe:mgmt:keys |
/v1/keys (list, create, update, delete, rotate) |
vibe:mgmt:portals |
/v1/portals |
vibe:mgmt:feedback |
/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 |
|---|---|---|
| 403 | OWNER_DELETED |
The key owner's account has been deleted |
| 403 | OWNER_BLOCKED |
The key owner's account is blocked by the platform |
| 503 | ACCOUNT_PENDING_ERASURE |
The 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 |
| 409 | B24_USER_DELETED |
The 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.
curl -H "X-Api-Key: vibe_live_abc123..." \
https://vibecode.bitrix24.com/v1/me
Response:
{
"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.
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.
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.
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.
curl -H "X-Api-Key: vibe_live_abc123..." \
"https://vibecode.bitrix24.com/v1/keys?portalId=portal-uuid"
| Field | Type | Description |
|---|---|---|
data[].id |
string | Identifier of the key record. Accepted by endpoints that need a key as a resource — for example targetApiKeyId in bot ownership transfer |
data[].name |
string | Key name given at creation |
data[].prefix |
string | Beginning of the key value |
data[].suffix |
string | Last characters of the key value |
data[].type |
string | Key type. For Bitrix24 account keys — APP |
data[].userId |
string | Identifier of the key owner |
data[].portalId |
string | Identifier of the Bitrix24 portal |
data[].clientId |
string | null | Identifier of the OAuth app for an authorization key, null for a personal key |
data[].scopes |
array | Key scopes |
data[].ipWhitelist |
array | Allowed IP addresses, an empty array means no restriction |
data[].rateLimit |
number | null | Custom request limit, null means the platform-wide limit |
data[].status |
string | ACTIVE, REVOKED or BLOCKED |
data[].accessMode |
string | READWRITE or READONLY |
data[].issuedVia |
string | null | The 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 |
data[].expiresAt |
string | null | Expiration date, null means no expiry |
data[].lastUsedAt |
string | null | Date of the last request made with this key |
data[].createdAt |
string | Creation date |
data[].updatedAt |
string | Date of the last change |
{
"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"
}
]
}
Rejections of this request:
| HTTP | Code | When returned |
|---|---|---|
| 400 | MISSING_PORTAL_ID |
The required portalId parameter was not provided |
| 401 | WRONG_KEY_TYPE |
The request was sent with a portal key — the key list is served to a management key only |
| 403 | NOT_PORTAL_MEMBER |
The key owner is not a member of the portal with the given portalId |
| 403 | PORTAL_ACCESS_BLOCKED |
The key owner's access to that portal is blocked |
| 401 | KEY_INACTIVE |
The management key is revoked or blocked |
| 401 | KEY_EXPIRED |
The management key's validity period has ended |
| 403 | MANAGEMENT_SCOPE_REQUIRED |
The 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.
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:
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, and answers 403 to POST /v1/infra/servers and to AI calls. 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 |
|---|---|---|
exactScopes |
boolean | Optional, false by default. true — store exactly the listed scopes, without the four platform ones |
Additional error codes:
| Code | HTTP | When returned |
|---|---|---|
MISSING_PORTAL_ID |
400 | portalId not provided in the request body |
BILLING_MODE_NOT_SUPPORTED |
400 | The body carries billing: "subscription". Subscription-billed Cowork/Code keys are issued from the Vibecode dashboard only — see Your own agent on the subscription |
NOT_PORTAL_MEMBER |
403 | The key owner is not a member of the specified portal |
PORTAL_NOT_LINKED |
400 | The portal is not connected to Bitrix24 Network — the key cannot be created |
PERSONAL_KEY_WEBHOOK_SCOPES_INVALID |
400 | No data scope is left in scopes. A portal 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 |
INVALID_SCOPES |
400 | Some of the requested scopes are unavailable on the Bitrix24 account |
INFRA_DISABLED_FOR_PORTAL |
403 | scopes 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 a closed account as well |
INT_TARIFF_REQUIRED |
402 | The 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 |
REST_REGISTRATION_FAILED |
400 | Bitrix24 refused to register the inbound webhook and gave no reason. The response carries error.details.incidentCode — a six-character support reference that locates the log entry |
INT_TARIFF_REQUIRED |
403 | The account's Bitrix24 plan does not grant access, so the webhook is not issued. The response carries no upgrade link |
PORTAL_TARIFF_UNREADABLE |
403 | The 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 |
B24_INSUFFICIENT_SCOPE |
403 | The owner's developer key lacks the required rights on the account. Reconnect the account so the developer key is re-issued |
B24_ACCESS_DENIED |
403 | Bitrix24 did not issue the webhook because of the employee's rights |
CONNECTOR_KEY_ISSUE_FORBIDDEN |
403 | The account bars this employee from issuing keys. The right is granted by an account administrator. More — Creation rights |
CONNECTOR_MODULE_NOT_INSTALLED |
409 | The 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 |
B24_USER_DELETED |
409 | The key owner has been deleted from the Bitrix24 account — the key is not created |
STALE_DEVELOPER_KEY |
410 | The owner's developer key is invalid and cannot be re-issued automatically. Reconnect the account |
RECOVERY_FAILED |
502 | Re-issuing the developer key failed. The state is transient — retry the request |
CONNECTOR_REST_UNAVAILABLE |
502 | The 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 |
CONNECTOR_PLAN_REQUIRED |
502 | The Bitrix24 account plan does not include Vibecode, and there is nothing to offer — a self-hosted account, an account already on a paid plan, an unrecognized region. The human-readable cause arrives in error.userMessage. The state is permanent: retrying will not help until the plan changes |
CONNECTOR_KEY_ISSUE_FAILED |
502 | Another refusal from the connector module, or its transport was unreachable. The original reason arrives in error.details.reason |
DEVKEY_MINT_FAILED |
502 | Another issuance failure through the developer key. Diagnostics arrive in error.details.b24Code and error.details.b24Status |
BITRIX_UNAVAILABLE |
502 | Bitrix24 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 — because the platform access check does not apply 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 Bitrix24 account 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: when the account plan could not be read at all, it answers PORTAL_TARIFF_UNREADABLE, and in that state 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.
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 |
|---|---|---|
name |
string | Key name in the Vibecode dashboard |
scopes |
string[] | List of scopes — see Scopes |
status |
"ACTIVE" | "REVOKED" |
Activate or revoke the key |
ipWhitelist |
string[] | List of allowed IP addresses |
rateLimit |
number | null | Custom request limit per second |
expiresAt |
ISO-8601 | null | Key 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.
Keys the platform issues on its own endpoints come back into service under special rules. A key billed against the subscription 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 five 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 issued again where they were issued.
| Code | HTTP | When returned |
|---|---|---|
SYSTEM_KEY_REACTIVATE_FORBIDDEN |
403 | The 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 |
INFRA_DISABLED_FOR_PORTAL |
403 | The 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 a closed account too, and removing the scope is always allowed |
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.
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 chat-bot, 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 chat-bots), a details.agents list, and details.bots (up to 10 regular chat-bots). For DELETE /v1/bots/:botId, take the numeric bitrixBotId from the matching details.bots item in the 409 response.
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.
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.
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 key billed against the subscription, 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 issued again where they were issued. In all these cases the previous key keeps working.
| Code | HTTP | When returned |
|---|---|---|
SYSTEM_KEY_ROTATE_FORBIDDEN |
403 | The 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 |
COWORK_HARNESS_DISABLED |
403 | Issuing subscription keys for third-party agents is disabled on the platform |
COWORK_PLATFORM_DISABLED |
403 | Cowork/Code is disabled at the platform level |
COWORK_ACCESS_REQUIRED |
403 | The key owner has not been granted Cowork/Code access |
COWORK_EXTERNAL_CLIENTS_DISABLED |
403 | The account administrator has disallowed third-party clients |
COWORK_SUBSCRIPTION_INACTIVE |
403 | The 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.
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 |
|---|---|
NEW |
The user has just submitted the ticket, no one has looked at it yet |
REVIEWING |
The team has started working on the ticket, the user is not yet receiving updates |
AWAITING_USER |
The team asked the user a clarifying question — awaiting a reply (the user receives an email) |
NEEDS_REVIEW |
The user replied to the clarification — the team reads the new comment and decides the next step |
RESOLVED |
The fix is published in the production environment, the user has been notified |
ARCHIVED |
Closed without a code change (duplicate, off-topic, not reproducible) |
WITHDRAWN |
The 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
- Create a management key in the Vibecode dashboard (the "Management Keys" section)
- Get the Bitrix24 account list:
GET /v1/portals - View the existing keys in the target Bitrix24 account:
GET /v1/keys?portalId=<id> - Create an API key with the required scopes:
POST /v1/keys { portalId, name, scopes } - 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