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 address, 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 into the application's active keys — see "Known specifics" |
redirectUris |
array | Redirect addresses for OAuth |
placements |
array | Placements. List of codes — Available placements. To bind or remove a single placement without republishing the app — Placements |
handlerUrl cannot be changed — 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 | Update date, ISO 8601 |
warnings |
array | Appears on partial embedding-place sync: codes that could not be bound |
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",
"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 account |
| 400 | TITLE_TOO_LONG_FOR_CATALOG |
The new name is longer than 100 characters for an application that is in the catalog |
| 403 | UNAUTHORIZED |
The key does not belong to the author or owner of the application |
| 403 | WRITE_BLOCKED_READONLY_KEY |
The request changes scopes while coming from a key in read-only mode. Such a key can still change the other fields. More — Access mode |
| 404 | APP_NOT_FOUND |
No application with the specified id |
| 502 | BITRIX_PARTIAL_REBIND |
Bitrix24 rejected the re-binding of an embedding place during the rename. The new name is not written — repeat the request |
Full list of common API errors — Errors.
Known specifics
- Renaming an application in the catalog also changes the labels on the account. The new
titlegoes into the catalog card (thecatalogTitlefield is written together withtitle) and into the embedding places — 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 written, and repeating the request repairs the state. The account 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:infrais taken away 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 mismatch between the application scopes and its key is repaired with two requests. An application created before propagation existed can carry
vibe:infrainscopeswhile its key does not — the key answers403to server creation. 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. The key's effective set is shown byGET /v1/meindata.scopeswhen called with that key. - Changing
placementsof a published application triggers embedding-place sync on the account. Binding and unbinding happen directly on 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 the account.