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 |
|---|---|---|---|---|
Parameterid |
Inpath | Typestring (UUID) | Requiredyes | DescriptionServer 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 |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata |
Typeobject | DescriptionFull 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 |
Fielddata.id |
Typestring (UUID) | DescriptionServer ID |
Fielddata.status |
Typestring | DescriptionLast stored status: provisioning | running | stopped | sleeping | error. A deleted server returns 404 |
Fielddata.provider |
Typestring | DescriptionProvider ID |
Fielddata.kind |
Typestring | DescriptionResource 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 |
Fielddata.galaxyId |
Typestring (UUID) | null | DescriptionFor GALAXY_APP — the ID of the host the application runs on. null for other types |
Fielddata.appCount |
Typenumber | null | DescriptionFor a GALAXY host — the number of non-deleted applications on it. null for other types |
Fielddata.diskTotalMb |
Typenumber | null | DescriptionDisk size of the galaxy host machine, in mebibytes. null for STANDALONE and GALAXY_APP |
Fielddata.diskFreeMb |
Typenumber | null | DescriptionFree disk space on the galaxy host machine, in mebibytes. null for STANDALONE and GALAXY_APP |
Fielddata.diskState |
Typestring | null | DescriptionDisk usage verdict: ok, warning, critical, or unknown when nothing has been measured yet. Thresholds are described in Galaxy. null for STANDALONE and GALAXY_APP |
Fielddata.diskProbedAt |
Typestring (ISO 8601) | null | DescriptionTime of the disk measurement. A sleeping machine reports the last known value together with the time of that measurement |
Fielddata.reachability |
Typeobject | null | DescriptionGALAXY_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 |
Fielddata.name |
Typestring | DescriptionSystem name of the server — the technical identifier |
Fielddata.displayName |
Typestring | null | DescriptionDisplay name for the UI. Equals name if it was not provided at creation |
Fielddata.description |
Typestring | null | DescriptionApplication description shown on the Bitrix24 catalog card. null if no description was set. Changed via PATCH /v1/infra/servers/:id |
Fielddata.ip |
Typestring | null | DescriptionPublic IP. null until the virtual machine receives an address |
Fielddata.ssh |
Typeobject | null | DescriptionFor 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 by GET /v1/infra/servers/:id/ssh for a server in OPEN mode, which a person switches on in the cabinet, and the POST /v1/infra/servers response does not contain them |
Fielddata.plan |
Typestring | DescriptionPlan. 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 |
Fielddata.region |
Typestring | DescriptionThe 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 |
Fielddata.image |
Typestring | DescriptionOS image |
Fielddata.monthlyCost |
Typestring | DescriptionCatalog monthly cost in Vibe credits (Ꝟ) as a string (for example "24"). The amount actually billed may differ. Compare via Number(data.monthlyCost) |
Fielddata.mode |
Typestring | DescriptionBLACKHOLE or OPEN |
Fielddata.createdVia |
Typestring | Descriptionapi — 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 |
Fielddata.subdomain |
Typestring | DescriptionSubdomain for the application |
Fielddata.blackholeStatus |
Typestring | DescriptionNONE | 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 |
Fielddata.accessPolicy |
Typestring | DescriptionOWNER_ONLY | NAMED_USERS | DEPARTMENT | PORTAL | AUTHENTICATED | PUBLIC |
Fielddata.runtimeId |
Typestring | null | DescriptionID of the runtime installed via POST /:id/deploy (server creation always returns null). |
Fielddata.runtimeStatus |
Typestring | null | DescriptionA 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 |
Fielddata.startCommand |
Typestring | null | DescriptionStart 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 |
Fielddata.installCommand |
Typestring | null | DescriptionInstall command of the same deploy. null — the deploy ran without install, including when an empty value was passed |
Fielddata.deployPort |
Typenumber | null | DescriptionPort 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 |
Fielddata.appUrl |
Typestring | null | DescriptionHTTPS address of the application |
Fielddata.localPort |
Typenumber | DescriptionConfigured 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 |
Fielddata.detectedPort |
Typenumber | null | DescriptionLast 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 |
Fielddata.detectedPortObservedAt |
Typestring (ISO 8601) | null | DescriptionWhen the platform received detectedPort. It is updated asynchronously after the tunnel connects; this GET does not probe the agent |
Fielddata.portPinned |
Typeboolean | DescriptionThe 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 |
Fielddata.sleepAfterMinutes |
Typenumber | null | DescriptionNumber of idle minutes after which the server is automatically put to sleep. null — never auto-sleep |
Fielddata.idleSleepProtected |
Typeboolean | Descriptiontrue when idle sleep is unavailable because the server must stay reachable. The field exposes only the decision and no bot or API-key metadata |
Fielddata.runMode |
Typestring | DescriptionRun 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 |
Fielddata.workSchedule |
Typeobject | null | DescriptionThe 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 |
Fielddata.provisionError |
Typestring | null | DescriptionA short reason for the last provisioning/build failure. null if there were no errors |
Fielddata.provisionErrorCode |
Typestring | null | DescriptionPublic failure category: PROVISION_TIMEOUT / NO_CAPACITY / NETWORK_CAPACITY / OVERLOADED / TRANSPORT_UNAVAILABLE / CONFIG / INVALID_INPUT / GENERIC / BOX_UNREACHABLE / HOST_UNREACHABLE / WAKE_NO_CAPACITY / PREEMPTIBLE_EVICTION / AGENT_SERVER_GONE / AGENT_NEVER_CONNECTED / KEY_ISSUE_REFUSED / KEY_ISSUE_OUTCOME_UNKNOWN / KEY_ISSUE_RESPONSE_LOST / DISK_FULL / CREATION_HELD / KEY_ISSUE_MODULE_MISSING / GUEST_NOT_BOOTING. A creation hold may instead return the stored hold reason, for example BILLING_FROZEN or TRIAL_EXPIRED. Internal and unknown codes are returned as GENERIC with a neutral provisionError: contact support before creating another server. null when no code is stored. GUEST_NOT_BOOTING is terminal; it and DISK_FULL are explained in "Known specifics" |
Fielddata.provisionReason |
Typestring | null | DescriptionStructured 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 |
Fielddata.buildLog |
Typestring | null | DescriptionTail of the Docker build log (≤8 KB) for a failed Galaxy application build. null for regular servers and on a successful build |
Fielddata.nextScheduledWakeAt |
Typestring (ISO 8601) | null | DescriptionThe next scheduled wake time (lead offset included). null if the server has no enabled wake windows. Configured via Scheduled wake |
Fielddata.wakeScheduleCapable |
Typeboolean | DescriptionWhether scheduled wake windows can be configured for the server. Depends on the server kind and whether the feature is enabled for the Bitrix24 account |
Fielddata.buildHint |
Typestring | null | DescriptionA localized recommendation for a Galaxy app build failure or a busy upload path. Always present. Set for a recognized cause in error, and for provisioning with a busy upload path (GALAXY_UPLOAD_BUSY), where it advises retrying the same deploy. A stuck background attempt changes to error after the timeout, preserving the busy-path reason and hint. Otherwise null, including for regular servers |
Fielddata.b24CatalogSync |
Typeobject | DescriptionState of the app card in the Vibecode apps catalog in the Bitrix24 account: { status, itemId, attempts, pendingOp, eligible }. Field breakdown — Publish to the catalog |
Fielddata.createdAt |
Typestring (ISO 8601) | DescriptionCreation timestamp |
Fielddata.access |
Typeobject | DescriptionFor 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, with no role field. The managing key gets no such field in the detail card — List servers returns the via: "owner" marker |
Response example
Full owner card:
{
"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"
}
}
The shared host referenced by the galaxyId of the current key's Galaxy application, as a read-only projection with access.via: "galaxy-reference":
{
"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 |
|---|---|---|
| HTTP401 | CodeMISSING_API_KEY |
DescriptionThe X-Api-Key header was not passed |
| HTTP401 | CodeINVALID_API_KEY |
DescriptionThe key is not recognized — no such key exists on the platform |
| HTTP403 | CodeEXTERNAL_COLLABORATOR_KEY_SERVER_MISMATCH |
DescriptionThe 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 |
| HTTP403 | CodeEXTERNAL_COLLABORATOR_NOT_A_MEMBER |
DescriptionAn 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 |
| HTTP404 | CodeNOT_FOUND |
DescriptionServer 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 |
| HTTP429 | CodeRATE_LIMITED |
DescriptionThe 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).- The password and key of an OPEN server can always be read again. The create response does not contain SSH credentials. A person switches OPEN mode on in the cabinet; an API key cannot do it. While the server is in OPEN mode, they are returned by
GET /v1/infra/servers/:id/ssh. With an API key alone, work through the Deploy API. For BLACKHOLE, recreate the SSH key manually viaPOST /v1/infra/servers/:id/execor recreate the server. GUEST_NOT_BOOTINGis terminal — retrying does not help. The guest operating system cannot boot.POST /repairandPOST /startreturn422with this code,availableActionskeeps onlydelete, and billing has stopped. Application deletion still requires confirmed container removal:DELETE /v1/infra/servers/:idreturns502 GALAXY_HOST_UNREACHABLEif teardown cannot be confirmed and preserves the application and its binding. Restore host access and retry, or contact platform support to confirm cloud VM destruction and finish cleanup. Scheduled clients must recreate this machine instead of repeatedly starting or repairing it.