For AI agents: markdown of this page — /docs-content-en/cowork/deploy-key.md documentation index — /llms.txt
Project key for deploy
POST /v1/cowork/deploy-key
A Cowork/Code key (scope vibe:cowork) works only with the data plane — chat and the Bitrix24 REST proxy — and is blocked on the infrastructure control plane (server creation, deploy, exec, lifecycle) with the response 403 INFRA_FORBIDDEN_FOR_COWORK_KEY. This endpoint issues a separate project key with deploy rights: call it with the same Cowork/Code key, take the key field from the response (the body is a flat object, without a data wrapper), and use it as the X-Api-Key header for all operations under /v1/infra/*.
The returned key carries the vibe:infra and vibe:storage scopes (without vibe:cowork), is valid for 7 days, and is bound to the owner and account of the Cowork/Code key. Each call issues a fresh key and revokes the previous project key — only one is ever active.
Scope: vibe:cowork (the Cowork/Code key you call the endpoint with). The returned key is separate, with the vibe:infra + vibe:storage scopes.
Examples
curl
curl -X POST https://vibecode.bitrix24.com/v1/cowork/deploy-key \
-H "X-Api-Key: YOUR_COWORK_KEY"
JavaScript — get the key and deploy with it
// 1. Get the project key with the Cowork/Code key
const res = await fetch('https://vibecode.bitrix24.com/v1/cowork/deploy-key', {
method: 'POST',
headers: { 'X-Api-Key': 'YOUR_COWORK_KEY' },
})
const deployKey = await res.json()
// 2. From here on use the key field (top level) for the infrastructure control plane
const deploy = await fetch('https://vibecode.bitrix24.com/v1/infra/servers/SERVER_ID/deploy', {
method: 'POST',
headers: {
'X-Api-Key': deployKey.key, // NOT the Cowork/Code key
'Content-Type': 'application/json',
},
body: JSON.stringify({ /* ... */ }),
})
Response fields
| Field | Type | Description |
|---|---|---|
key |
string | The raw key. Returned ONCE and cannot be recovered — save it. |
apiKeyId |
string | Identifier of the created key |
prefix |
string | Key prefix for display |
suffix |
string | Last characters of the key for identification |
scopes |
array | ["vibe:infra", "vibe:storage"] |
expiresAt |
string | Expiration (ISO 8601), 7 days from issuance |
howToUse |
string | A hint for the agent: how to apply the key |
Response example
{
"key": "vibe_api_…",
"apiKeyId": "...",
"prefix": "vibe_api_…",
"suffix": "…xy3z",
"scopes": ["vibe:infra", "vibe:storage"],
"expiresAt": "2026-07-06T14:05:00.000Z",
"howToUse": "Use this key as the X-Api-Key header for all deploy / provision / exec / server-lifecycle calls under /v1/infra/*."
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 401 | MISSING_API_KEY |
The X-Api-Key header was not passed |
| 401 | INVALID_API_KEY |
Invalid API key |
| 402 | ACCOUNT_FROZEN |
The account balance is exhausted — top up |
| 403 | INSUFFICIENT_SCOPE |
The key lacks the vibe:cowork scope |
| 403 | COWORK_NOT_ACTIVATED |
No active Cowork/Code subscription for the user and Bitrix24 account |
| 503 | COWORK_FEATURE_DISABLED |
Cowork/Code is disabled at the platform level |
| 503 | DEPLOY_KEY_DISABLED |
Self-service issuance of project keys is disabled at the platform level |
| 503 | INFRA_DISABLED |
Infrastructure is disabled at the platform level — the key would be pointless |
The full list of common API errors — Errors.
Known specifics
The raw key (key) is returned once — at issuance. It cannot be recovered afterward. Each call issues a new key and revokes the previous project key, so call the endpoint once at the start of the deploy session and use the received key until the end.
Use the key field from the response (top level) for deploy, NOT the Cowork/Code key. The Cowork/Code key stays for chat and Bitrix24 REST calls; the project key is for /v1/infra/*.
A successful response (200) is the object itself, without a success wrapper. Errors arrive in the envelope { success: false, error: { code, message } }. Determine success by the HTTP status (res.ok).