لوكلاء AI: ملف markdown لهذه الصفحة — /docs-content-en/connectors-host.md فهرس التوثيق — /llms.txt
مقالات التوثيق متاحة حاليًا باللغة الإنجليزية فقط.
Connectors for Cowork and Vibe applications
GET /v1/connectors
POST /v1/connectors/{slug}/access-requests
Access requests are available only to Cowork.
GET /v1/connectors/write-tickets/{id}
Cowork device keys with purpose cowork-desktop keep their employee access flow. A personal application key or OAuth application key is admitted only with explicit effective vibe:connectors, an active application, and matching key owner and Bitrix24 account. While the feature is not enabled for the account, routes return 404 ROUTE_NOT_FOUND. When it is enabled, other keys receive 403 CONNECTOR_KEY_NOT_ALLOWED.
The application acts as the key owner, never the browser viewer or a user supplied in headers. It sees only shared PORTAL connections allowed by the administrator and owner permissions. The scope creates neither a connection nor an administrator rule and grants no employee-viewer access.
The exact application allowlist is GET /v1/connectors, POST /v1/connectors/mcp, GET /v1/connectors/write-tickets/{id} and GET /v1/me. Every other host route or operation, including access requests and connection management, is denied with CONNECTOR_KEY_NOT_ALLOWED. A restricted Cowork employee still receives the catalog with ACCESS_RESTRICTED states; a restricted application owner receives 403 PORTAL_ACCESS_BLOCKED.
The host keeps the key away from the agent. The owner approves writes in the web account. Application polling and pending counts are isolated to this account and the same application and the same key; another application or key cannot read the ticket even with the same owner. Cowork keeps its employee-based flow.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
Parameterslug (path) |
Typestring | Requiredyes | DescriptionName from data.items[].slug in GET /v1/connectors |
Parameternote (body) |
Typestring | Requiredno | DescriptionReason for requesting access, up to 500 characters. Leading and trailing whitespace is trimmed. The body can be omitted or set to {}. Unknown fields are rejected |
Parameterid (path) |
Typestring | Requiredyes | DescriptionticketId from _meta["vibe/confirmation"] in the gateway result |
Examples
curl — list connectors
curl https://vibecode.bitrix24.com/v1/connectors \
-H "X-Api-Key: YOUR_COWORK_DEVICE_KEY"
curl — request access
curl -X POST https://vibecode.bitrix24.com/v1/connectors/bridge-test/access-requests \
-H "X-Api-Key: YOUR_COWORK_DEVICE_KEY" \
-H "Content-Type: application/json" \
-d '{"note":"Project access"}'
curl — confirmation outcome
curl https://vibecode.bitrix24.com/v1/connectors/write-tickets/5f0c1f7e-2b8a-4c1e-9d6f-3a7b9e2c4d10 \
-H "X-Api-Key: YOUR_COWORK_DEVICE_KEY"
bridge-test is an example name. Use a slug from the list.
JavaScript — confirmation outcome
const response = await fetch(
'https://vibecode.bitrix24.com/v1/connectors/write-tickets/5f0c1f7e-2b8a-4c1e-9d6f-3a7b9e2c4d10',
{ headers: { 'X-Api-Key': 'YOUR_COWORK_DEVICE_KEY' } },
)
const result = await response.json()
console.log(result)
Response fields
Success is wrapped in { success: true, data }. The list has the following fields in data.
| Field | Type | Description |
|---|---|---|
Fielddata.items |
Typearray | DescriptionUp to 100 entries, sorted by name |
Fielddata.items[].slug |
Typestring | DescriptionConnector name |
Fielddata.items[].type |
Typestring | Descriptionconnector — a catalog connector; own is reserved for own connectors. The list currently contains only connector |
Fielddata.items[].title |
Typestring | DescriptionEmployee-facing title |
Fielddata.items[].summary |
Typestring | DescriptionShort description |
Fielddata.items[].iconUrl |
Typestring / null | DescriptionIcon URL or null |
Fielddata.items[].category |
Typestring | DescriptionService category |
Fielddata.items[].connectionScope |
Typestring | DescriptionPORTAL — company, USER — employee; applications receive only PORTAL |
Fielddata.items[].state |
Typestring | DescriptionState from the table below |
Fielddata.items[].mode |
Typestring / null | DescriptionREAD, READ_WRITE or null |
Fielddata.items[].modes |
Typearray of strings | DescriptionSupplier-supported session modes: cowork, code, or both. A nonempty list without duplicates; defaults to ["cowork", "code"], including previously published connectors |
Fielddata.items[].retryAfter |
Typestring / null | DescriptionISO 8601 time for requesting access again after rejection in NOT_ENABLED, otherwise null |
Fielddata.items[].webUrl |
Typestring | DescriptionAbsolute card URL: /extensions/connectors/<slug> for Cowork; Application keys retain /connectors/<slug> |
Fielddata.items[].pricing |
Typeobject / null | DescriptionPrice range of the tools in Vibe credits per successful call: minVibes and maxVibes are strings with a decimal amount. null — the connector is free |
Fielddata.pendingConfirmations.count |
Typeinteger | DescriptionCowork: live pending confirmations across accessible employee accounts. Application: only this account and host/application/key |
Fielddata.pendingConfirmations.url |
Typestring | DescriptionPage with all pending confirmations |
Fielddata.manageUrl |
Typestring | DescriptionCowork only: absolute URL /extensions/connectors?view=mine to manage connections |
Fielddata.addUrl |
Typestring | DescriptionCowork only: absolute catalog URL /extensions/connectors |
Fielddata.addOwnUrl |
Typenull | DescriptionCowork only: null while custom connectors are unavailable; the host falls back to addUrl |
Cowork opens these regular web account URLs in the system browser. Application keys omit manageUrl, addUrl, and addOwnUrl; existing fields and list ordering are preserved.
type identifies the origin, while connectionScope identifies the connection scope: PORTAL for a company, USER for a personal connection. The built-in Browser is a separate Cowork desktop row. modes describes supported session modes and does not replace the read/write access field mode. Adding these fields preserves existing fields and list order; the query parameter mode (cowork or code) filters by Connector.modes, and omitting it keeps both modes visible.
An access request returns 201 with data.id and data.status = "PENDING". The confirmation outcome has the following fields.
| Field | Type | Description |
|---|---|---|
Fielddata.status |
Typestring | DescriptionOne of the five statuses below |
Fielddata.summary |
Typestring | DescriptionAction summary. REJECTED, CONSUMED and EXPIRED contain only the heading, without arguments |
Fielddata.expiresAt |
Typestring | DescriptionExpiration time in ISO 8601 |
Fielddata.webUrl |
Typestring | DescriptionConfirmation URL to open in the system browser |
Fielddata.continueText |
Typestring / null | Descriptionnull for PENDING, otherwise the dictionary text to pass to the agent |
States
state |
What to show the employee |
|---|---|
stateACCESS_RESTRICTED |
What to show the employeeAccess to the Bitrix24 account is restricted by the administrator |
stateUNAVAILABLE |
What to show the employeeConnector is temporarily turned off |
stateREQUEST_PENDING |
What to show the employeeAccess request awaits a decision |
stateNOT_ENABLED |
What to show the employeeAccess can be requested |
stateWAITING_ADMIN |
What to show the employeeWaiting for the administrator to connect the company |
stateNEEDS_REAUTH |
What to show the employeeReconnect the service through webUrl |
stateNOT_CONNECTED |
What to show the employeeConnect the service through webUrl |
stateACTIVE |
What to show the employeeTools are available |
Confirmation statuses
status |
Host action |
|---|---|
statusPENDING |
Host actionAwaiting a decision, keep polling |
statusAPPROVED |
Host actionApproved, pass continueText and repeat the original call |
statusREJECTED |
Host actionRejected, pass continueText and stop polling |
statusCONSUMED |
Host actionApproval used, pass continueText and stop polling. This is not proof of a successful write |
statusEXPIRED |
Host actionExpired, pass continueText and stop polling |
Paid call refusals
A tool with a price above zero charges it to the Vibe credit balance of the Bitrix24 account for each successful call. A failure of the external service, a timeout and any gateway refusal are not charged. Before calling the external service, the gateway checks the balance, the daily cap of the account rule and the company budget. On refusal the call is not made, and tools/call answers with a tool error: isError: true and a code in _meta["vibe/error"].code.
code |
retryable |
Field _meta["vibe/error"] |
Host action |
|---|---|---|---|
codeINSUFFICIENT_BALANCE |
retryablefalse |
Field _meta["vibe/error"]topUpUrl |
Host actionExplanation and a "Top up" button that opens topUpUrl in the system browser |
codeACCOUNT_FROZEN |
retryablefalse |
Field _meta["vibe/error"]topUpUrl |
Host actionExplanation and a "Top up" button, as for INSUFFICIENT_BALANCE. The account is frozen |
codeDAILY_CAP_REACHED |
retryabletrue |
Field _meta["vibe/error"]retryAfter |
Host actionExplanation and the retryAfter time when the call becomes possible again. It is the start of the next UTC day in ISO 8601 |
codeCOMPANY_BUDGET_EXHAUSTED |
retryablefalse |
Field _meta["vibe/error"]none | Host actionExplanation without a top-up button. Funds are available, and the account administrator raises the company budget |
For a write tool the check runs before the write confirmation. Without funds no confirmation is created, and an approved confirmation is not consumed by a refusal and stays valid until it expires. After a top-up the repeated call runs without a new approval.
Response example
Example shape of a pending confirmation outcome.
{
"success": true,
"data": {
"status": "PENDING",
"summary": "bridge-test \u00b7 update_record",
"expiresAt": "2026-10-01T12:10:00.000Z",
"webUrl": "https://vibecode.bitrix24.com/connectors/confirm/5f0c1f7e-2b8a-4c1e-9d6f-3a7b9e2c4d10",
"continueText": null
}
}
Error response example
429 CONNECTOR_ACCESS_REQUEST_COOLDOWN — the request was rejected less than a day ago.
{
"success": false,
"error": {
"code": "CONNECTOR_ACCESS_REQUEST_COOLDOWN",
"message": "The request was rejected recently",
"retryAfter": "2026-10-02T12:00:00.000Z"
}
}
error.retryAfter is a separate ISO 8601 timestamp. When present for an input error, error.details contains a list of validation paths and messages.
Errors
| HTTP | Code | When |
|---|---|---|
| HTTP400 | CodeINVALID_BODY |
WhenInvalid access-request body |
| HTTP403 | CodeCONNECTOR_KEY_NOT_ALLOWED |
WhenKey is not a Cowork desktop key |
| HTTP403 | CodeOWNER_BLOCKED |
WhenThe key owner is blocked or no longer active in the Bitrix24 account |
| HTTP403 | CodeWRITE_BLOCKED_READONLY_KEY |
WhenPOST access request with a read-only key |
| HTTP403 | CodePORTAL_ACCESS_BLOCKED |
WhenAccess request by an employee with restricted access |
| HTTP403 | CodeCONNECTOR_BLOCKED |
WhenConnector blocked by the administrator |
| HTTP403 | CodeCONNECTOR_DISABLED |
WhenConnector disabled |
| HTTP404 | CodeROUTE_NOT_FOUND |
WhenConnectors flag is off |
| HTTP404 | CodeCONNECTOR_NOT_FOUND |
WhenRequested connector not found |
| HTTP404 | CodeCONNECTOR_WRITE_TICKET_NOT_FOUND |
WhenTicket belongs to another employee or Bitrix24 account, is missing, or cannot be read |
| HTTP409 | CodeCONNECTOR_ACCESS_REQUEST_EXISTS |
WhenPending access request already exists |
| HTTP409 | CodeCONNECTOR_ALREADY_ENABLED |
WhenEmployee already has access |
| HTTP429 | CodeCONNECTOR_ACCESS_REQUEST_COOLDOWN |
WhenRequest after rejection, retry time in error.retryAfter |
| HTTP429 | CodeRATE_LIMITED |
WhenRequest limit exceeded |
| HTTP503 | CodeCONNECTOR_VAULT_NOT_CONFIGURED |
WhenVault is not configured, ticket outcome is unavailable |
For common authorization and deletion-freeze errors, see Errors.
Known specifics
With restricted access, the list returns
200and every entry has stateACCESS_RESTRICTED. The count includes only accessible Bitrix24 accounts with both flags, active membership and no pending self-deletion.Reading a ticket requires both
connectorsandconnectors-write, a live Bitrix24 account, active membership, permitted access and no pending self-deletion in the key’s account. The ticket belongs to that account and the key owner.Poll at most once every 3 seconds. Platform-wide ceilings: list 120/min per key, request 10/hour per key, polling 1200/min total per key and 60/min per key-ticket pair. Ceilings are divided across replicas, and the active route limit is returned in
x-ratelimit-limit.Pass
continueTextto the agent verbatim for every status exceptPENDING. The gateway uses the approval before calling the external service. The repeated call’s result, rather than statusCONSUMED, reports whether the write succeeded or failed.Writing also requires
connectors-writeand an eligible desktop version. In production,connectorsWriteMinDesktopVersionremainsnulluntil the operator decides to enable it. An empty setting blocks writing for everyone.
See also
Long-running BRIDGE operations
The host retains the action UUID in params._meta["vibe/idempotencyKey"] and retries a lost start with the same UUID and arguments. To retrieve pending work it calls connectors_get_result({operationId}) through POST /v1/connectors/mcp with the original key. No new V1 URL or key is needed. Live access and ownership checks also apply to replay; reconnecting or revoking access hides the old payload but does not cancel settlement of accepted successful work.
A paid WRITE first requires owner approval; retry the same UUID afterwards. Replaying an accepted operation consumes no second ticket and incurs no second charge. A timeout does not mean cancellation. Pending remains in the journal with the original call time and no paid amount until completion. Examples, lifetimes and limits: MCP BRIDGE operations.
Request-local gateway selection
POST /v1/connectors/mcp
Send optional X-Cowork-Connectors-Enabled: bridge-test,crm and
X-Cowork-Mode: cowork (or code) on every HTTP request. Enabled is an ASCII
CSV of at most 100 connector slugs and 8192 bytes. An empty header disables all
connectors; absence preserves the original set. Invalid headers return
400 INVALID_BODY. Individual tool selection is not supported.
The stateless gateway does not retain headers from initialize. Filtering applies
before the direct-tool threshold, to list/discovery and to direct calls and
connectors_run_tool. Account rules and platform-disabled tools still apply.
Mode filters a connector when its modes metadata is available; legacy records
without metadata retain availability. Omitting both headers preserves the
original response. Retrieve already accepted jobs through connectors_get_result
with the existing ownership and live-access checks.
curl https://vibecode.bitrix24.com/v1/connectors/mcp \
-H "X-Api-Key: YOUR_COWORK_DEVICE_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-Cowork-Connectors-Enabled: bridge-test" \
-H "X-Cowork-Mode: cowork" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Omit the last two headers for the original selection. Connection setup, OAuth and rule changes are performed in the web cabinet.
Published connector card
GET /v1/connectors/{slug}
Only Cowork device keys can read this card; the Application allowlist remains
unchanged. The response is { success: true, data } for one catalog connector.
data.tools contains { name, title, readOnly } from the published version,
excluding platform-disabled tools. These labels describe tools; the gateway
checks execution permission separately. Company and publisher are independent:
vendor is { name, url } or null, publisher is { name, url }. For catalog
connectors, verified is derived and always true. modes contains cowork
and/or code; legacy metadata supports both. When company metadata is absent,
vendor is null rather than copied from publisher.
The card also includes title, summary, description, setupHint, category, iconUrl,
connectionScope, state, mode, retryAfter, pendingRequestId, pricing, authType,
grant, dataLocation, dataLocationNote, webUrl and companyConnected.
addedAt is the visible connection creation time or null; vaultReady indicates
whether connection storage is configured. No connection forms or secret values
are returned. A personal connection is scoped to the owner. Company connection
metadata is visible only to administrators; other employees receive connection:
null and addedAt: null. A connector blocked by the account is hidden from everyone,
including administrators, with 404 CONNECTOR_NOT_FOUND. Missing or unpublished
connectors return the same error. Restricted owners receive 403 PORTAL_ACCESS_BLOCKED.
curl https://vibecode.bitrix24.com/v1/connectors/bridge-test \
-H "X-Api-Key: YOUR_COWORK_DEVICE_KEY"
Connection setup and settings use webUrl in the browser. The Cowork card and
catalog share the cabinet URL /extensions/connectors/<slug>.