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 the IP is absent, provided the server has an external ID. A deleted server (status: "deleted") is not accessible: a 404 is returned.
The card comes in three shapes. The managing key gets the full object. An application key gets the same shape, without the access block, for the server bound to it — except for a GALAXY host — even when the server record 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 state of the carrying galaxy in hostStatus and hostTunnel, the live readings container and forwarder, the state of the public address publicEntry, 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. Agent and bot servers carry their own values |
data.subdomain |
string | Subdomain for the application |
data.blackholeStatus |
string | NONE | CONNECTED | DISCONNECTED. For a running BLACKHOLE server, a stored CONNECTED value is checked against the current gateway snapshot for this response only; this GET changes neither the database row nor the tunnel |
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.startCommand |
string | null | Start command of the last SUCCESSFUL deploy (start in POST /:id/deploy). null means either no command was needed or no deploy has completed yet; distinguish those cases with deployPort |
data.installCommand |
string | null | Install command of the same deploy. null — the deploy ran without install, including when an empty value was passed |
data.deployPort |
number | null | Port declared in the same deploy (port in POST /:id/deploy). Distinct from localPort: PATCH /v1/infra/servers/:id/port changes localPort independently of any deploy. null — no deploy yet |
data.appUrl |
string | null | HTTPS address of the application |
data.localPort |
number | Configured port (default 3000). In auto-detect mode it is the preferred fallback; detectedPort shows the last actual target. Changed via PATCH /v1/infra/servers/:id/port |
data.detectedPort |
number | null | Last port reported by the connected agent's scanner. null means no reliable observation has been stored yet; a reply from an agent without a scanner neither creates nor erases an observation |
data.detectedPortObservedAt |
string (ISO 8601) | null | When the platform received detectedPort. It is updated asynchronously after the tunnel connects; this GET does not probe the agent |
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.idleSleepProtected |
boolean | true when idle sleep is unavailable because the server must stay reachable. The field exposes only the decision and no bot or API-key metadata |
data.runMode |
string | Run mode: IDLE — sleeps when idle, SCHEDULE — runs on a schedule, ALWAYS — around the clock. Derived from the assigned schedule, idleSleepProtected, createdVia, and sleepAfterMinutes. A protected server without a schedule is ALWAYS even when it stores a numeric threshold |
data.workSchedule |
object | null | The assigned schedule, or null. Fields: id, name (empty for a platform preset — identify it by presetKey), presetKey, timezone, windows. Every window is {{ isoDay, start, end }}, where isoDay is 1…7 counted from Monday and start/end are local HH:MM in the timezone of that schedule. Windows arrive as a LIST: one day may hold two of them, a shift with a break for instance |
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 / DISK_FULL / GENERIC. null if there were no errors. The GUEST_NOT_BOOTING value is terminal. Both it and DISK_FULL are explained in "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 in 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 field. The managing key gets no such field in the detail card — List servers returns 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,
"startCommand": null,
"installCommand": null,
"deployPort": null,
"appUrl": "https://app-05b67cf7.vibecode.bitrix24.com",
"localPort": 3000,
"detectedPort": 3000,
"detectedPortObservedAt": "2026-09-15T08:15:30.000Z",
"portPinned": false,
"sleepAfterMinutes": null,
"idleSleepProtected": false,
"runMode": "IDLE",
"workSchedule": 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 |
The key is not recognized — no such key exists on the platform |
| 403 | EXTERNAL_COLLABORATOR_KEY_SERVER_MISMATCH |
The call was made with an external-collaborator key, and the address names a server other than the one the key was issued for. Such a key is valid for exactly one server, and the response does not reveal whether the requested server exists. Working with another server requires the key issued for that external membership |
| 403 | EXTERNAL_COLLABORATOR_NOT_A_MEMBER |
An external-collaborator key addresses its own server, but access is not granted right now: the membership was removed, it expired, or external development collaborators are switched off for the Bitrix24 account that owns the server. The code does not tell these reasons apart and reveals nothing about the server. Membership is re-read on every request, so revoked access stops working immediately |
| 404 | NOT_FOUND |
Server not found, deleted or inaccessible to the current key 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 portal |
| 429 | RATE_LIMITED |
The platform's overall request limit was exceeded |
The full list of common API errors — Errors.
Known specifics
- The card uses an effective tunnel status without side effects. If a running BLACKHOLE server is stored as
CONNECTEDbut its subdomain is absent from a successful non-empty gateway snapshot, the response showsDISCONNECTED. An unavailable or empty snapshot preserves the stored value. The request does not runrepairor write the check result to the database. This does not apply to thegalaxy-referenceprojection, which always remains a stored snapshot. - A development-team member's card is shorter and does not poll the provider. With
access.via: "collaborator"the fieldsip,ssh,localPort,detectedPort,detectedPortObservedAt,portPinned,deletedAt,appCount, the disk fields,wakeScheduleCapableandb24CatalogSyncdo not arrive, whilemonthlyCost,sleepAfterMinutesandnextScheduledWakeAtare added for theADMINrole only. Application diagnostics and the last deploy parameters stay in place:reachability,buildLog,buildHint,startCommand,installCommandanddeployPortarrive exactly as they do for the owner. In this card, the status 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 grants access only to this GET and the server list./deploy,/exec,/upload,/logs,/sources,/ssh,/refresh, lifecycle operations,PATCHandDELETEremain unavailable for the host. - For a full owner card, a provider request is made when the status is
provisioningor the IP is missing. 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 will not come up — 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. For a standalone server (kind: "STANDALONE") the platform issues this verdict only while it is newly created and 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") gets the same code on its own threshold — fifteen minutes inrunningwithblackholeStatus: "NONE"— and not only right after creation: the verdict is issued whenever the host stays in that state past the threshold again. Existing galaxy hosts that already had the legacyprovisionErrortext before this change keepprovisionErrorCode: nullin GET responses, but/startandavailableActionsrecognize that exact legacy reason and expose the same repair-only behavior. The rest is the same: billing is closed out,POST /startanswers422with this code, and repair fixes it. Should the agent connect on its own, the server returns torunningand bothprovisionErrorandprovisionErrorCodeare cleared.DISK_FULL— the repair could not install the agent: the server's disk is full. The code is recorded by a repair that failed. Repeating the repair helps only once disk space has been freed. A successful repair clears the code. The server does not move toerror. If the repair woke a sleeping server, the machine stays running after the failure until auto-sleep, or until someone stops it if auto-sleep is off.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 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.