For AI agents: markdown of this page — /docs-content-en/applications/get.md documentation index — /llms.txt
Application card
GET /v1/applications/:id
Returns a single application from the Bitrix24 account, together with a summary of its server, saved source versions, and any operation in progress. The card is available to the owner and anyone the application has been shared with, either directly or through the server's access policy. Being a Bitrix24 account administrator does not grant access: an administrator who neither owns the application nor has been granted access receives 403 FORBIDDEN, just like any other viewer.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id (path) |
string | yes | Application ID. List: GET /v1/applications |
Examples
curl — personal key
curl -H "X-Api-Key: YOUR_API_KEY" \
https://vibecode.bitrix24.com/v1/applications/cmsw806qi0000tdskiw2aegii
curl — OAuth application
curl -H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
https://vibecode.bitrix24.com/v1/applications/cmsw806qi0000tdskiw2aegii
JavaScript — personal key
const id = 'cmsw806qi0000tdskiw2aegii'
const res = await fetch(`https://vibecode.bitrix24.com/v1/applications/${id}`, {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const { data: application } = await res.json()
console.log(application.name, application.server?.status ?? 'no server')
if (application.sources.hasVersions) {
console.log('Latest version:', application.sources.latestVersionId)
}
JavaScript — OAuth application
const id = 'cmsw806qi0000tdskiw2aegii'
const res = await fetch(`https://vibecode.bitrix24.com/v1/applications/${id}`, {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const { data: application } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data.id |
string | Application ID |
data.name |
string | Application name |
data.description |
string | null | Description. null when none was set |
data.type |
string | How the application was initially configured: SHARED — created with a server and/or an authorization key, PERSONAL — created without either. The value is set at creation and is not recalculated later, so a PERSONAL application may also have a server |
data.iconUrl |
string | null | A relative path to the icon, with no host, for example /api/app-icons/7f3…?v=1755500000000. The icon endpoint is publicly accessible: no key, signature, or expiration time is required. Combine the path with the API base URL and use the result in <img src>. The endpoint returns a 256×256 PNG with Cache-Control: public, max-age=300, must-revalidate and an ETag. null if the card has no icon |
data.createdAt |
string | When the application was created, ISO 8601 |
data.updatedAt |
string | Timestamp of the last update to the card, ISO 8601. Deploying the application does not update the card; use sources.latestSavedAt to check how recently the code was saved |
data.viewerState |
string | The viewer's relationship to the application: owner — the owner, shared — access granted directly, through the server's access policy, or through membership in that server's development team, usable — the application has no server and is available to the entire Bitrix24 account, requestable — no access. For an application with a server, access is governed by the server's policy, and an application available to everyone is still returned as shared |
data.pinned |
boolean | Whether this viewer has pinned the application |
data.author.name |
string | Display name of the application owner |
data.openUrl |
string | null | The URL used to open the application. When present, it is the application server URL. null means no URL is available; this is an expected value |
data.openTarget |
string | null | Identifies what openUrl points to. The only current value is app, meaning the application server URL. It is null whenever openUrl is null. Treat an unfamiliar value as "no supported way to open the application", not as a malformed response: the set is closed but may be extended |
data.isEmbedded |
boolean | Whether the application is embedded in the Bitrix24 interface — that is, whether at least one placement is bound to it. This is the only field that distinguishes an application that is embedded and opens inside Bitrix24 from one that has not yet been published: both have openUrl and openTarget set to null. The flag is independent of the server; an embedded application without its own server is a normal state. Returned to every viewer who can see the card |
data.server |
object | null | Summary of the application server. null when there is no server, or it was deleted or torn down |
data.server.id |
string | Server ID — the same ID used in the Servers paths |
data.server.status |
string | Server state: PROVISIONING, RUNNING, STOPPED, SLEEPING, ERROR. Uppercase here — GET /v1/infra/servers reports the same value for the same server in lowercase, so normalize the case before comparing strings from the two sections. A torn-down server never appears here at all: its server is null. Read an unfamiliar value as "a state your client does not know", not as a malformed response |
data.server.url |
string | null | Application URL. null until a subdomain is issued — there is no separate "has an address" flag, so checking for null is the only way to determine whether an address exists. Moving the container between galaxies does not change the address: it is derived from the subdomain, and the move does not change the subdomain |
data.server.kind |
string | Resource type: STANDALONE — a dedicated virtual machine, GALAXY_APP — an application on a shared galaxy host |
data.server.reachable |
boolean | Whether the server is running and reachable over the network. This is distinct from status: a container can be running even if its tunnel has never come up. The flag already includes the condition status === "RUNNING"; it is never true for any other status, so do not combine the two checks. Important: for kind: "GALAXY_APP", network reachability is determined from the galaxy host rather than the container itself; see "Known specifics" |
data.server.lastDeployedAt |
string | null | Timestamp of the last SUCCESSFUL deployment, ISO 8601. This is the only field in this section that shows whether the application has actually been deployed, rather than merely having a running server. It is distinct from updatedAt (changed by card edits, not deployments) and sources.latestSavedAt (code was saved, not deployed; returned only to the owner). Important: null does not mean "never deployed": for servers created before 2026-08-18, the field remains empty until the next deployment because historical values were deliberately not reconstructed; see "Known specifics" |
data.sources |
object | Summary of the saved source versions. Populated only for users who manage the application |
data.sources.hasVersions |
boolean | Whether at least one saved version exists |
data.sources.latestVersionId |
string | null | Latest version identifier in the form v<N>, exactly as accepted by GET /v1/infra/servers/:id/sources/:versionId/download. It is not the record's primary key, and no separate call for the version list is needed. null when there are no versions |
data.sources.latestSavedAt |
string | null | When the latest version was saved, ISO 8601 |
data.activeOperation |
object | null | Operation in progress on the server. Populated only for users who manage the application. The null case is covered in "Known specifics" |
data.activeOperation.kind |
string | Operation kind: deploy — deployment, repair — repair, resize — server plan change, migrate — moving a container between galaxies |
data.activeOperation.status |
string | running — the operation is in progress. unknown — the operation started, but its outcome is not known |
data.activeOperation.step |
string | null | The step the operation is on. A free-form string, not an enumeration |
data.activeOperation.startedAt |
string | When the operation started, ISO 8601 |
Response example
{
"success": true,
"data": {
"id": "cmsw806qi0000tdskiw2aegii",
"name": "Deal report",
"description": "Pipeline summary for the period",
"type": "PERSONAL",
"iconUrl": null,
"createdAt": "2026-08-16T19:51:18.810Z",
"updatedAt": "2026-08-16T19:51:18.810Z",
"viewerState": "owner",
"pinned": false,
"author": { "name": "Application author" },
"isEmbedded": false,
"openUrl": "https://app-05b67cf7.vibecode.bitrix24.com",
"openTarget": "app",
"server": {
"id": "5cbb50f9-f95f-4ddf-ba3b-b771209cb6fb",
"status": "RUNNING",
"url": "https://app-05b67cf7.vibecode.bitrix24.com",
"kind": "STANDALONE",
"reachable": true,
"lastDeployedAt": "2026-08-16T19:50:41.302Z"
},
"sources": {
"hasVersions": true,
"latestVersionId": "v2",
"latestSavedAt": "2026-08-16T19:41:18.818Z"
},
"activeOperation": {
"kind": "deploy",
"status": "running",
"step": "build",
"startedAt": "2026-08-16T19:50:33.822Z"
}
}
}
An application with no server returns server: null, an empty sources summary, and activeOperation: null. There is no URL to open it, so openUrl and openTarget are also null. The example below shows exactly this case: the application is embedded in Bitrix24.
{
"success": true,
"data": {
"id": "cmsw806qp0001tdskzf6mitka",
"name": "Draft with no server",
"description": null,
"type": "PERSONAL",
"iconUrl": null,
"createdAt": "2026-08-16T19:51:18.817Z",
"updatedAt": "2026-08-16T19:51:18.817Z",
"viewerState": "owner",
"pinned": false,
"author": { "name": "Application author" },
"isEmbedded": true,
"openUrl": null,
"openTarget": null,
"server": null,
"sources": { "hasVersions": false, "latestVersionId": null, "latestSavedAt": null },
"activeOperation": null
}
}
Error response example
404 — no application with that ID on the Bitrix24 account:
{
"success": false,
"error": {
"code": "APPLICATION_NOT_FOUND",
"message": "Application not found"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 404 | APPLICATION_NOT_FOUND |
No application with that id on the key's portal. The same response is returned for an ID from another portal or a deleted application |
| 403 | FORBIDDEN |
The application exists, but the viewer has no access to it |
| 401 | NO_PORTAL |
The key is not bound to a portal — the actual response in this case |
| 403 | MANAGEMENT_KEY_NO_ENTITY_ACCESS |
A management key was used; an API key or an authorization key is required |
| 403 | PORTAL_KEY_REQUIRED |
A safeguard for a corrupted key record with no owner. The usual "key with no portal" case returns 401 NO_PORTAL above |
| 401 | MISSING_API_KEY |
The X-Api-Key header is missing |
| 401 | INVALID_API_KEY |
The key is not recognized — no such key exists on the platform |
| 429 | RATE_LIMITED |
Rate limit exceeded. The platform-wide limit is 120 requests per minute. The effective limit for your key is returned in the x-ratelimit-limit header. It is lower than the platform-wide limit because that limit is divided across replicas. This endpoint has its own counter, with a noticeably higher limit than the list endpoint. The Retry-After header specifies the delay in whole seconds |
| 429 | QUOTA_EXCEEDED |
The key's daily free-call quota is exhausted. Same status, different cause: waiting does not help |
The error.message text is always in English and intended for logs, not for display to users. Build user-facing messages from error.code. See Errors for the full list of common API errors.
Known specifics
- The card is available to more than just the owner. An application shared with you directly, through the server's access policy, or through membership in its development team can be retrieved via a direct link. The response contains one of the
owner,shared, orusablestates. A viewer without access receives403 FORBIDDEN, sorequestablenever appears in a card. - An embedded application has no URL to open, so both fields are
null. The platform does not yet provide the URL used to open an embedded application inside the Bitrix24 account. An empty value is expected, not an error: inventing a URL could send the user to the wrong place while appearing to work. - The server URL is not substituted into
openUrl, and you must not substitute it yourself. For an embedded application,server.urlis returned as usual, but it is not a valid way to open the application: an unauthenticated navigation receives the Gateway authentication flow instead of the app. An in-place HTML refusal uses HTTP401; a documentGET/HEADmay first receive an HTTP302to OAuth login when the private server isRUNNINGwithout a connected tunnel. A client that fills an emptyopenUrlwithserver.urltherefore sends the user to authentication, not to the embedded application. openUrlis not suppressed when the server is unreachable. The URL is returned even withserver.reachable: false. Users cannot diagnose a disabled button, but they can diagnose a visible error.- Only
isEmbeddeddistinguishes why both open fields arenull. Both an application that is embedded and opens inside Bitrix24 and one that has not yet been published returnopenUrl: nullandopenTarget: null, but the UI must represent them differently. Do not infer embedding from the presence of a server: an embedded application with no server of its own is normal because it may have been embedded before its code was deployed. Conversely, an embedded application with a server still returnsserver.url, but that is not the URL used to open it. - For an application in a galaxy, the second component of
reachabledescribes the host, not the container. Withserver.kind: "GALAXY_APP", connectivity comes from the shared galaxy host; the container has no tunnel of its own. Therefore,truemeans that the container is running, the host is running, and the host's tunnel is up. The flag impliesstatus === "RUNNING"and is never true otherwise. Conversely, a newly created container that has not yet reachedRUNNING(which happens only after its first source upload) returnsreachable: falseeven when the host is healthy. This means "the container is not running yet", not "the host is unreachable". The flag alone cannot distinguish those cases, so checkstatus.STANDALONEhas no such split; both parts describe the same machine. lastDeployedAtrecords deployments going forward; it does not backfill history. A successful deployment writes the timestamp at the same time it records success, so a failed deployment does not change it. Servers that existed before 2026-08-18 have no backfilled value; the field remains empty until their next deployment. The operations journal could reconstruct only one of the three deployment paths. Backfilling from it would give applications on dedicated machines a date but leave applications in galaxies empty, misleading readers into thinking that galaxy applications were inactive. A consistent "no deployments since tracking began" is more accurate. Therefore,nullduring the first few weeks is expected and does not mean the application is abandoned.- A torn-down server is returned as
server: null, not as a separate status. You will not see values such asdeleted,terminated,destroyed, orarchivedinserver.status, but for different reasons:terminated,destroyed, andarchiveddo not exist in the platform, while the torn-down state does exist but is not exposed by this endpoint. Once a server is torn down, the card returnsserver: nulltogether withopenUrl: null. If you normalize statuses returned byGET /v1/infra/servers, note that its value set is different: that endpoint returns lowercase statuses and, whenincludeDeletedis set, includes deleted servers. The application card has no equivalent parameter. - An application belonging to another Bitrix24 account is indistinguishable from a missing one. An ID from another account produces
404 APPLICATION_NOT_FOUNDrather than403: the endpoint does not even confirm that such a record exists. - The source summary and the operation in progress are returned only to users who manage the application. A viewer who was merely granted access to the application receives an empty
sourcessummary andactiveOperation: null, without any change to the response shape. An empty summary alone therefore does not mean "there are no versions": the application may have no server, may genuinely have no versions, or may belong to someone else whose data is not disclosed to you. A client that renders "no code" from an emptysourcessummary will be wrong for every application belonging to someone else. activeOperation: nulldoes not mean "nothing is happening to this application". The field is reliable only for operations with a stored record — deployment, repair, a server plan change, and moving a container between galaxies. Other actions are not recorded by the platform and therefore never appear in this field. The valueunknowninstatusrepresents a third state: the operation started, but its outcome is unknown. Waiting for it to finish is pointless; read the current state from the server itself.- Server state is returned in uppercase. In the card,
server.statusfor a running server isRUNNING, whileGET /v1/infra/serversreturnsrunningfor the same server at the same time. A client comparing strings from both endpoints must normalize the case.