For AI agents: markdown of this page — /docs-content-en/infra/servers/get.md documentation index — /llms.txt
Get a server
GET /v1/infra/servers/:id
Returns details of a single server by ID. For a full owner card, the endpoint automatically polls the cloud provider when the stored status is provisioning, or when the IP is absent and the server has an external ID. A deleted server (status: "deleted") is not accessible: a 404 is returned.
The card has three shapes. The managing key gets the full object. An application key gets the same shape without an access block for the server bound to its application, except for a GALAXY host, even when the server row is assigned to another application key. A member of the server's development team gets 200 with a shortened card. If the galaxyId of a live Galaxy application managed by the current key points to a live shared host in the same Bitrix24 account, that host arrives as a safe read-only projection with access.via: "galaxy-reference". The shapes and fields are broken down in List servers.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id |
path | string (UUID) | yes | Server ID or a Galaxy application's galaxyId from POST /v1/infra/servers or GET /v1/infra/servers |
Examples
curl — personal key
curl -H "X-Api-Key: YOUR_API_KEY" \
https://vibecode.bitrix24.com/v1/infra/servers/e765edfc-ba0a-43de-b8ea-838dd872c522
curl — OAuth application
curl -H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
https://vibecode.bitrix24.com/v1/infra/servers/SERVER_ID
JavaScript — personal key
// Poll the server until it is ready
async function waitReady(serverId) {
while (true) {
const res = await fetch(
`https://vibecode.bitrix24.com/v1/infra/servers/${serverId}`,
{ headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
)
const { data } = await res.json()
if (data.access?.via === 'galaxy-reference') {
throw new Error('Use the Galaxy application ID, not the host ID, to wait for readiness')
}
if (data.status === 'running' && data.blackholeStatus === 'CONNECTED') {
return data
}
if (data.status === 'error') {
throw new Error(`Server in error state: ${data.id}`)
}
await new Promise(r => setTimeout(r, 10000))
}
}
JavaScript — OAuth application
const res = await fetch(
`https://vibecode.bitrix24.com/v1/infra/servers/${serverId}`,
{
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
}
)
const { data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
object | Full owner card, shortened collaborator card or galaxy-reference projection. A referenced host projection contains only id, status, kind, galaxyId, name, displayName, createdAt and access. The other fields in this table are absent from it |
data.id |
string (UUID) | Server ID |
data.status |
string | Last stored status: provisioning | running | stopped | sleeping | error. A deleted server returns 404 |
data.provider |
string | Provider ID |
data.kind |
string | Resource type: STANDALONE (a dedicated virtual machine), GALAXY (a host carrying Galaxy applications) or GALAXY_APP (a Galaxy application — a container on a shared host). Determines the deploy contract — check it before uploading code |
data.galaxyId |
string (UUID) | null | For GALAXY_APP — the ID of the host the application runs on. null for other types |
data.appCount |
number | null | For a GALAXY host — the number of non-deleted applications on it. null for other types |
data.diskTotalMb |
number | null | Disk size of the galaxy host machine, in mebibytes. null for STANDALONE and GALAXY_APP |
data.diskFreeMb |
number | null | Free disk space on the galaxy host machine, in mebibytes. null for STANDALONE and GALAXY_APP |
data.diskState |
string | null | Disk usage verdict: ok, warning, critical, or unknown when nothing has been measured yet. Thresholds are described in Galaxy. null for STANDALONE and GALAXY_APP |
data.diskProbedAt |
string (ISO 8601) | null | Time of the disk measurement. A sleeping machine reports the last known value together with the time of that measurement |
data.reachability |
object | null | GALAXY_APP only — whether the application can respond right now: effectiveStatus, the host galaxy state hostStatus and hostTunnel, the live readings container and forwarder, the poll outcome probe and its timestamp probedAt. The status field above is the state of the application record, and during a wake it lags behind the machine. The values are explained in Galaxy app sleep and wake. null for other types |
data.name |
string | System name of the server — the technical identifier |
data.displayName |
string | null | Display name for the UI. Equals name if it was not provided at creation |
data.description |
string | null | Application description shown on the Bitrix24 catalog card. null if no description was set. Changed via PATCH /v1/infra/servers/:id |
data.ip |
string | null | Public IP. null until the virtual machine receives an address |
data.ssh |
object | null | For an OPEN server: { user, port, hasPassword }. For BLACKHOLE it may be null or the same block without actual access. The password and private key are not returned here — they are returned only once, by POST /v1/infra/servers, at creation |
data.plan |
string | Plan. For a Galaxy application (kind: "GALAXY_APP") the host's plan is returned, not the one requested at creation — applications share the host's resources |
data.region |
string | The region the server actually landed in. For a Galaxy application the host's region is returned (the platform picks placement itself), not the one requested |
data.image |
string | OS image |
data.monthlyCost |
string | Catalog monthly cost in Vibe credits (Ꝟ) as a string (for example "24"). The amount actually billed may differ. Compare via Number(data.monthlyCost) |
data.mode |
string | BLACKHOLE or OPEN |
data.createdVia |
string | api — a call through the Vibecode API, ui — an action in the Vibecode dashboard, galaxy — a Galaxy application. Servers of agents and bots carry their own values |
data.subdomain |
string | Subdomain for the application |
data.blackholeStatus |
string | NONE | WAITING | CONNECTED | DISCONNECTED |
data.accessPolicy |
string | OWNER_ONLY | NAMED_USERS | DEPARTMENT | PORTAL | AUTHENTICATED | PUBLIC |
data.runtimeId |
string | null | ID of the runtime installed via POST /:id/deploy (server creation always returns null). |
data.runtimeStatus |
string | null | A deprecated field, kept for compatibility. For servers created after 2026-04-25 it always returns null. The runtime is installed at the POST /:id/deploy stage, and its readiness signal is the success of the runtime step in the deploy response, not this field's value |
data.appUrl |
string | null | HTTPS address of the application |
data.localPort |
number | Local port the tunnel forwards traffic to (default 3000). Changed via PATCH /v1/infra/servers/:id/port |
data.portPinned |
boolean | The port is pinned in the agent settings on the machine, so it survives sleep, wake, and tunnel repair. false — the agent detects the port itself on every start. Details — Change the port |
data.sleepAfterMinutes |
number | null | Number of idle minutes after which the server is automatically put to sleep. null — never auto-sleep |
data.provisionError |
string | null | A short reason for the last provisioning/build failure. null if there were no errors |
data.provisionErrorCode |
string | null | Machine-readable failure category: PREEMPTIBLE_EVICTION / PROVISION_TIMEOUT / NO_CAPACITY / GUEST_NOT_BOOTING / AGENT_NEVER_CONNECTED / GENERIC. null if there were no errors. The GUEST_NOT_BOOTING value is terminal — see "Known specifics" |
data.provisionReason |
string | null | Structured cause of a Galaxy application failure: oom — the container ran out of memory, or crash. null for regular servers and when there was no failure. oom is the signal to move the application to a dedicated server; the procedure is described in Create a server |
data.buildLog |
string | null | Tail of the docker build log (≤8 KB) for a failed Galaxy application build. null for regular servers and on a successful build |
data.nextScheduledWakeAt |
string (ISO 8601) | null | The next scheduled wake time (lead offset included). null if the server has no enabled wake windows. Configured via Scheduled wake |
data.wakeScheduleCapable |
boolean | Whether scheduled wake windows can be configured for the server. Depends on the server kind and whether the feature is enabled for the Bitrix24 account |
data.buildHint |
string | null | A localized recommendation on what to do about a failed Galaxy application build. The field is always present. It is null for regular servers, for a Galaxy application outside the error status, and when the failure could not be matched to any known category |
data.b24CatalogSync |
object | State of the app card in the Vibecode apps catalog on the Bitrix24 account: { status, itemId, attempts, pendingOp, eligible }. Field breakdown — Publish to the catalog |
data.createdAt |
string (ISO 8601) | Creation timestamp |
data.access |
object | For a team member, contains via: "collaborator", role, allowedActions, allowedEndpoints and _note. For a referenced host, contains via: "galaxy-reference", allowedActions: ["read"], only GET /v1/infra/servers and GET /v1/infra/servers/:id in allowedEndpoints, and _note. There is no role. The managing key gets no such field in detail — List servers emits the via: "owner" marker |
Full response example
{
"success": true,
"data": {
"id": "e765edfc-ba0a-43de-b8ea-838dd872c522",
"status": "running",
"provider": "bitrix-cloud",
"kind": "STANDALONE",
"galaxyId": null,
"appCount": null,
"diskTotalMb": null,
"diskFreeMb": null,
"diskState": null,
"diskProbedAt": null,
"name": "vibe-server-pd9l",
"displayName": "vibe-server-pd9l",
"description": null,
"ip": "111.88.251.211",
"ssh": {
"user": "ubuntu",
"port": 22,
"hasPassword": true
},
"plan": "bc-small",
"region": "bc-eu-central",
"image": "ubuntu-2404-lts",
"monthlyCost": "24",
"mode": "OPEN",
"createdVia": "ui",
"subdomain": "app-05b67cf7",
"blackholeStatus": "CONNECTED",
"accessPolicy": "OWNER_ONLY",
"runtimeId": null,
"runtimeStatus": null,
"appUrl": "https://app-05b67cf7.vibecode.bitrix24.com",
"localPort": 3000,
"portPinned": true,
"sleepAfterMinutes": null,
"provisionError": null,
"provisionErrorCode": null,
"provisionReason": null,
"b24CatalogSync": {
"status": "IDLE",
"itemId": null,
"attempts": 0,
"pendingOp": null,
"eligible": true
},
"buildLog": null,
"nextScheduledWakeAt": null,
"wakeScheduleCapable": true,
"buildHint": null,
"createdAt": "2026-04-03T13:30:25.819Z"
}
}
Host response by `galaxyId`
{
"success": true,
"data": {
"id": "3f7a91c4-6e0b-42d8-8b55-19ad7c204e6f",
"status": "running",
"kind": "GALAXY",
"galaxyId": null,
"name": "vibe-galaxy-host-q7x2",
"displayName": "Shared Galaxy host",
"createdAt": "2026-06-18T08:15:30.000Z",
"access": {
"via": "galaxy-reference",
"allowedActions": ["read"],
"allowedEndpoints": [
"GET /v1/infra/servers",
"GET /v1/infra/servers/:id"
],
"_note": "This host is readable only because one of your galaxy applications references it. Host management and application operations must target resources owned by your key, not this shared host."
}
}
}
Error response example
404 — the server does not exist, is deleted, or the current key has no managing, team or reference access:
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Server not found"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 401 | MISSING_API_KEY |
The X-Api-Key header was not passed |
| 401 | INVALID_API_KEY |
Invalid or expired API key |
| 404 | NOT_FOUND |
Server not found, deleted or inaccessible through management, application binding or development-team membership. A foreign host stays hidden unless a live Galaxy application managed by the key references it in the same Bitrix24 account |
| 429 | RATE_LIMITED |
The platform's overall request limit was exceeded |
The full list of common API errors — Errors.
Known specifics
- A development-team member's card is shorter and does not poll the provider. With
access.via: "collaborator"the fieldsip,ssh,localPort,portPinned,deletedAt,appCount, the disk fields,wakeScheduleCapableandb24CatalogSyncdo not arrive, whilemonthlyCost,sleepAfterMinutesandnextScheduledWakeAtare added for theADMINrole only. Application diagnostics stay in place:reachability,buildLogandbuildHintarrive exactly as they do for the owner. The status on this branch comes from the platform's last measurement rather than being reconciled with the provider on the spot, so on a freshly created server it can lag by one polling tick — for a readiness-waiting loop use the key the server was created with. - The
galaxy-referenceprojection is shorter still and always uses stored state. It does not contact the provider or gateway even withstatus: "provisioning". The projection exists only while a live Galaxy application managed by the current key references a liveGALAXYhost in the same Bitrix24 account. It opens only this GET and the server list./deploy,/exec,/upload,/logs,/sources,/ssh,/refresh, lifecycle,PATCHandDELETEremain unavailable for the host. - For a full owner card, a provider request is made for
provisioningor a missing IP. In either case, the server must have an external ID. When an IP is already stored, no request is made forrunning/stopped/sleeping/error. To force reconciliation, usePOST /v1/infra/servers/:id/refresh. - The readiness criterion is two fields. To continue working with the Deploy API you need both
status: "running"andblackholeStatus: "CONNECTED"at the same time. If onlyrunningis set, the virtual machine is already up, but the tunnel agent has not connected yet. You do not have to wait forever: on a newly created standalone server (kind: "STANDALONE") that holdsrunningwithblackholeStatus: "NONE"for more than ten minutes the agent is not coming — the platform moves such a server toerrorwith the codeAGENT_NEVER_CONNECTED(see below). Runtime readiness after a deploy is determined by the success of theruntimestep in thePOST /:id/deployresponse — theruntimeStatusfield is not used for this, it is deprecated and staysnull. blackholeStatus: "DISCONNECTED"withrunning— the tunnel lost its connection on a live server. TryPOST /v1/infra/servers/:id/repair.AGENT_NEVER_CONNECTED— the agent never came up on a new machine. The virtual machine started normally, but the on-boot agent install did not finish, so there is no tunnel and there will not be one: the first-boot script runs once. The platform issues this verdict only for a newly created STANDALONE server (kind: "STANDALONE") that holdsstatus: "running"withblackholeStatus: "NONE"for more than ten minutes — the server moves toerrorand billing for the machine is closed out. TryPOST /v1/infra/servers/:id/repairfirst: it reinstalls the agent over SSH. If that does not help, recreate the server.POST /starton such a server answers422with the same code: starting it fixes nothing and erases the explanation. The verdict applies to Black Hole servers only — on an open-mode serverrunningwithblackholeStatus: "NONE"is a normal state. A galaxy host (kind: "GALAXY") does NOT get this code: the platform moves it toerrortoo, but on its own threshold — fifteen minutes — and without aprovisionErrorCode, so do not branch on the code for it; the reason arrives as text inprovisionError. Should the agent connect on its own, the server returns torunningand bothprovisionErrorandprovisionErrorCodeare cleared.monthlyCostpitfall: the field is returned as a string. Two such strings are compared character by character:"24" > "1000"returnstrue, and.sort()orders the values lexicographically, not numerically. Convert to a number viaNumber(data.monthlyCost).- If you lost the SSH credentials from the creation response, they cannot be recovered. Recreate the SSH key manually via
POST /v1/infra/servers/:id/exec(for BLACKHOLE) or recreate the server. GUEST_NOT_BOOTINGis terminal — retrying does not help. The machine's guest operating system does not boot after an interrupted update.POST /repairandPOST /startreturn422with the same code,availableActionskeeps onlydelete, and billing for the machine has stopped. Applications hosted on such a machine are normally deleted one by one without a live tunnel —DELETE /v1/infra/servers/:idanswers200, after which the host itself can be deleted. The marker alone does not guarantee the200: the platform also confirms through the gateway that no live tunnel exists, and that check is fail-safe — with the gateway unreachable the answer stays502(details on theDELETEpage). A client that starts or repairs servers on a schedule must read this value: such a machine has to be recreated, not repaired.