For AI agents: markdown of this page — /docs-content-en/apps/update.md documentation index — /llms.txt
Update an application
PATCH /v1/apps/:id
Changes application properties. Send only the fields you want to change.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id (path) |
string | yes | Application identifier from create or list |
Request fields (body)
| Field | Type | Description |
|---|---|---|
title |
string | Name, from 1 to 255 characters. For an application in the catalog the limit is 100 characters |
description |
string | null | Description, up to 2000 characters |
appUrl |
string | Application URL, only http:// or https://. An empty string is stored as null |
scopes |
array | Set of application scopes, at least one. A change to the platform vibe:* scopes is propagated to the application's active keys — see "Known specifics". A Bitrix24 account right cannot be added to an application that already exists, while removing rights succeeds |
redirectUris |
array | OAuth redirect URLs |
placements |
array | Placements. List of codes — Available placements. To bind or remove a single placement without republishing the application — Placements |
placementResizeEnabled |
boolean | Whether to fit the placement iframe height to the application content. Defaults to false. Before turning it on, allow the platform origin in your own frame-ancestors directive — the condition is described in What the app receives |
handlerUrl cannot be changed — passing the field in the body results in 400 HANDLER_URL_READONLY.
Examples
curl — personal key
curl -X PATCH https://vibecode.bitrix24.com/v1/apps/APP_ID \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "appUrl": "https://app-abc12345.vibecode.bitrix24.com/dashboard" }'
curl — OAuth application
curl -X PATCH https://vibecode.bitrix24.com/v1/apps/APP_ID \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "appUrl": "https://app-abc12345.vibecode.bitrix24.com/dashboard" }'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/apps/APP_ID', {
method: 'PATCH',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
appUrl: 'https://app-abc12345.vibecode.bitrix24.com/dashboard',
}),
})
const { data } = await res.json()
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/apps/APP_ID', {
method: 'PATCH',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
appUrl: 'https://app-abc12345.vibecode.bitrix24.com/dashboard',
}),
})
const { data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
data |
object | Application after the update. The field set matches the create response, without rawKey |
data.updatedAt |
string | Modification date, ISO 8601 |
warnings |
array | Appears on partial placement sync — the codes that could not be bound, as well as the placements that could not be removed. For removals the entry differs depending on the rollout — see the note under the error table. A separate entry arrives when the new title has lost its non-ASCII characters in transit: it names the field, and the rename itself still goes through. The set of entries is open — show an unfamiliar one as is rather than discarding it |
Response example
{
"success": true,
"data": {
"id": "33c4d5e6-f7a8-49b0-1234-5c6d7e8f9012",
"title": "Sales dashboard",
"description": "Updated",
"scopes": ["crm", "user", "placement"],
"handlerUrl": "https://vibecode.bitrix24.com/v1/bitrix-handler",
"appUrl": "https://app-abc12345.vibecode.bitrix24.com/dashboard",
"redirectUris": [
"https://vibecode.bitrix24.com/oauth/complete",
"http://localhost"
],
"bitrixClientId": "local.7c3d4e5f6a7b80.55556666",
"prefix": "vibe_app_local_7c3",
"suffix": "6666",
"authorId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"authorBitrixUserId": 42,
"authorBitrixUserIdSource": "member",
"portalId": "8b1f0e2a-3c4d-5e6f-7a8b-9c0d1e2f3a4b",
"createdAt": "2026-06-24T09:12:45.781Z",
"updatedAt": "2026-06-24T09:13:36.974Z",
"placements": []
}
}
Error response example
404 — application not found:
{
"success": false,
"error": {
"code": "APP_NOT_FOUND",
"message": "Application not found"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | HANDLER_URL_READONLY |
handlerUrl passed in the body — the field is set by the platform and cannot be changed |
| 400 | NO_USER_TOKEN |
Changing placements or renaming a published application without a user token on a cloud portal |
| 400 | TITLE_TOO_LONG_FOR_CATALOG |
The new name is longer than 100 characters for an application that is in the catalog |
| 403 | INFRA_DISABLED_FOR_PORTAL |
The request adds vibe:infra to scopes and the Bitrix24 account administrator has turned server management off. Neither the application nor its keys change. Editing an application that already carries the scope goes through on a closed account too, and removing the scope is always allowed |
| 403 | INFRA_FORBIDDEN_FOR_COWORK_KEY |
The call was made with a Cowork/Code key — such a key works with data only and cannot perform write operations. To issue a key that can, see Project key for deploy |
| 403 | UNAUTHORIZED |
The call was made with an authorization key vibe_app_… issued for a different application. Such a key updates only its own application, even when both applications were created by the same author |
| 403 | UNAUTHORIZED |
The key does not belong to the author or owner of the application |
| 403 | OAUTH_SCOPE_CHANGE_REQUIRES_REISSUE |
The request adds to scopes a Bitrix24 account right the application did not have. The set of account rights is fixed when the application is authorized, so an addition is refused while removing rights succeeds. Declare the right you need when you create the application — Create an application |
| 403 | WRITE_BLOCKED_READONLY_KEY |
The request changes scopes but is made with a key in read-only mode. Such a key can still change the other fields. More — Access mode |
| 403 | SCOPE_GRANT_REQUIRES_CONSENT |
The request comes from a key with a fixed rights set and adds to scopes a platform vibe:* scope that the calling key itself does not hold. The list of such scopes arrives in error.details.unconsented. Removing scopes always succeeds, adding them is allowed only within the calling key's own rights. The rights set is fixed for a partner key, for a Cowork project key, for a personal key issued by the Vibecode dashboard form and for a key issued with exactScopes: true — Management keys. How to tell such a key apart — Create an application |
| 404 | APP_NOT_FOUND |
No application with the specified id |
| 502 | BITRIX_PARTIAL_REBIND |
Bitrix24 rejected a new placement title during a developer-key rename. The new name is not saved. error.restored contains placements returned to the previous title; error.unbound contains the placements that need checking in the account: those left removed, plus those whose removal Bitrix24 never confirmed. Rejection diagnostics are in the parallel error.bitrixCodes and error.bitrixStatuses arrays |
| 502 | PLACEMENT_UNBIND_FAILED |
Bitrix24 did not confirm the removal of the placements dropped from placements. The rest of the request — the remaining fields and the title re-binding — is not applied, and the codes are listed in error.placements. The placements field itself has already been rewritten and reflects the actual state on the Bitrix24 account, so re-read the application. Arrives only once the removal check is enabled — see the note below |
| 503 | NETWORK_DEVKEY_REQUIRED |
The Bitrix24 account is switched to developer-key transport and the application author holds no such key. A retry will not help — ask the author to reconnect the account. Arrives only once the removal check is enabled — see the note below |
Full list of common API errors — Errors.
The account-side placement-removal check is currently rolling out per account, so there are two cases:
- While the capability is not enabled on the account — a
PATCHwith a reducedplacementsset answers200even when the extra placements could not be removed on the account. The code that was not removed STAYS in the application'splacements, and the reason arrives as aFailed to unbind <code>entry inwarnings. That entry is the only sign the list has drifted from the account, so for nowwarningshas to be parsed. The codesPLACEMENT_UNBIND_FAILEDandNETWORK_DEVKEY_REQUIREDdo not occur on this endpoint. - Once enabled — an unconfirmed removal answers
502 PLACEMENT_UNBIND_FAILED, and the rest of the request is not applied: neither the title re-binding nor the remaining fields. Retry the request — the placements listed inerror.placementsare still on the account. A502here does not mean "nothing changed": theplacementslist has already been rewritten with the removed set, so re-read the application through Application data instead of trusting the list you held before the call. A200carrying a placement that was not removed does not occur on this path — on a successful response the removal entries inwarningsare limited to confirmation notes. Enabling it does not change the rest of the set — binding failures and the other reasons listed in thewarningsrow above arrive on this path too.
Known specifics
- Renaming an application in the catalog also changes the labels in the Bitrix24 account. The new
titlegoes into the catalog card (thecatalogTitlefield is written together withtitle) and into the placements — the left-menu item and the CRM tabs. The rename therefore calls Bitrix24 and can return400 NO_USER_TOKENor502 BITRIX_PARTIAL_REBIND. On a rejection the name is not saved. On BOX and developer-key paths, after a confirmed removal and a rejected new binding, the platform makes one attempt to restore the previous title. Successfully restored placements are listed inerror.restored; they need no manual repair, but the rename is still refused. Only placements inerror.unboundneed checking: they were either left removed, or Bitrix24 never confirmed that the previous binding was removed. Restore them throughPOST /v1/placements/bind, then repeat the PATCH. The pairederror.bitrixCodesanderror.bitrixStatusesarrays contain the code and HTTP status for every rejected call, new title first and previous title second; missing values becomeB24_ERRORand0, while raw rejection text and the developer-key URL are never returned. The cloud OAuth rebind does not compensate, but it refuses too when Bitrix24 confirmed neither the removal of the previous binding nor the new one: such a placement lands inerror.unbound, the response is 502, and the name is not saved. Bitrix24 caches the left menu — the new name shows up after a hard page reload. For an application outside the catalog the rename changestitleonly. - Changing
scopespropagates the platformvibe:*scopes into the application's keys. The update compares the old and the new set and applies thevibe:*difference to every active key of the application — an addedvibe:aiappears on the keys, a removedvibe:infradisappears from them. Bitrix24 account scopes (crm,userand the rest) are not propagated: their set is fixed when the key is issued and changes only by reissuing it. - A key with a fixed rights set receives no platform scopes through propagation. That set is fixed on the paired key of an application created with a partner key, with a Cowork project key, with a personal key from the Vibecode dashboard form or with a key issued using
exactScopes: true— Create an application. Removals reach it like any other key, additions do not: avibe:infraadded to the application'sscopeswill not appear on such a key, andPOST /v1/infra/serverskeeps answering403 INFRA_SCOPE_REQUIRED. The required right is declared inscopeswhen the application is created. - A mismatch between the application scopes and its key is fixed with two requests. The application's
scopescan carryvibe:infrawhile its key does not — the key returns403when creating a server. Removevibe:infrafromscopeswith the first request and put it back with the second: propagation applies exactly the difference, so the second edit adds the scope to the key. This has no effect on a key with a fixed rights set — see the paragraph above. The key's effective set is shown byGET /v1/meindata.scopeswhen called with that key. - Changing
placementsof a published application triggers placement sync in the Bitrix24 account. Binding and unbinding happen directly in the Bitrix24 account, and some codes may fail to bind — then the response carrieswarningswith a list of such codes. On a cloud account without a user token the sync is impossible, and the request returns400 NO_USER_TOKEN. For an application inPRIVATEstatus,placementsare written to the database without contacting Bitrix24. - An
appUrledit reaches the application card in the Bitrix24 catalog on its own. The card is queued for an update by this same request — no separate call is needed. The card opens the full address of the application — subpath, query parameters and fragment included — when that address points to the same Black Hole subdomain as the card's server. In every other case the card opens the server root — including when the address uses a different subdomain, a custom domain or a different scheme, is empty or unparsable, carries a username before the host, or is longer than 512 characters, a limit the query parameters count toward. A separate gateway limitation applies regardless of the card: on the first visit within a session the visitor lands on the subdomain root whatever the card address is — App deployment. - Non-ASCII characters in
titlefrom Windows PowerShell. Sent without explicit UTF-8 serialization, they are stored as question marks (?): the bytes are lost on the client side, before the request is sent. A ready-to-run call withUTF8.GetBytes— Windows / PowerShell and UTF-8. - The
mobilefield is not editable. A value sent in the body is ignored, and the response is200with no change to the record. Bitrix24 has no method for updating a local application, so the flag is set only at creation. For an existing application, turn the flag on in the application card on the Bitrix24 account, or create the application again.