For AI agents: markdown of this page — /docs-content-en/infra/access/ssh.md documentation index — /llms.txt
SSH credentials
GET /v1/infra/servers/:id/ssh
Returns the SSH connection credentials. Full SSH credentials (password, private key, and public key) are returned only for servers in OPEN mode. For BLACKHOLE, sshPassword, sshPrivateKey, sshPublicKey, and sshCommand are null, while sshUser and sshPort are omitted: the server is closed off by an iptables firewall, and direct SSH is not possible. For BLACKHOLE, use the Deploy API instead of SSH — /exec, /upload, /logs. Rate limit: up to 10 requests per minute per server. The effective value is provided in the x-ratelimit-limit header.
Parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
Parameterid |
Inpath | Typestring (UUID) | Requiredyes | DescriptionServer ID |
Examples
curl — personal key
curl -H "X-Api-Key: YOUR_API_KEY" \
https://vibecode.bitrix24.com/v1/infra/servers/SERVER_ID/ssh
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/ssh
JavaScript — personal key
const res = await fetch(
`https://vibecode.bitrix24.com/v1/infra/servers/${serverId}/ssh`,
{ headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
)
const { data } = await res.json()
if (data.mode === 'OPEN') {
console.log('Command:', data.sshCommand)
console.log('Password:', data.sshPassword) // if it was issued
} else {
console.log(data.note) // BLACKHOLE — use the Deploy API
}
JavaScript — OAuth application
const res = await fetch(
`https://vibecode.bitrix24.com/v1/infra/servers/${serverId}/ssh`,
{
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
}
)
Response fields
| Field | Type | Description |
|---|---|---|
Fieldsuccess |
Typeboolean | DescriptionAlways true on success |
Fielddata.mode |
Typestring | DescriptionOPEN or BLACKHOLE |
Fielddata.ip |
Typestring | DescriptionPublic IP of the server |
Fielddata.sshDirect |
Typeboolean | Descriptiontrue for OPEN (SSH connects directly to the IP), false for BLACKHOLE (closed off by the firewall) |
Fielddata.sshUser |
Typestring | DescriptionSSH user: ubuntu or root. Omitted for BLACKHOLE |
Fielddata.sshPort |
Typenumber | DescriptionSSH port: 22. Omitted for BLACKHOLE |
Fielddata.sshPassword |
Typestring | null | DescriptionPassword. Always null for BLACKHOLE. For OPEN, the password the server generated when switching to OPEN, if any |
Fielddata.sshPrivateKey |
Typestring | null | DescriptionThe platform's private key in OpenSSH format (ed25519). Always null for BLACKHOLE |
Fielddata.sshPublicKey |
Typestring | null | DescriptionPublic key (ed25519) — the public part matching sshPrivateKey |
Fielddata.sshCommand |
Typestring | null | DescriptionReady-to-copy command: ssh ubuntu@IP. null for BLACKHOLE |
Fielddata.appUrl |
Typestring | DescriptionThe application's HTTPS address (present only for BLACKHOLE, where SSH is unavailable) |
Fielddata.note |
Typestring | DescriptionExplanation for BLACKHOLE: "BLACKHOLE servers do not expose SSH. Use the Deploy API…" |
Response example
OPEN server:
{
"success": true,
"data": {
"mode": "OPEN",
"ip": "111.88.251.211",
"sshUser": "ubuntu",
"sshPort": 22,
"sshPassword": "Oi9owBO6zMbueGmM75J9hg",
"sshPrivateKey": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmU…\n-----END OPENSSH PRIVATE KEY-----\n",
"sshPublicKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM0JAP1EMGh0CkT7RkZ26pTSa4X1FsWXe61cB5Fiqqjz vibe-generated",
"sshCommand": "ssh ubuntu@111.88.251.211",
"sshDirect": true
}
}
BLACKHOLE server:
{
"success": true,
"data": {
"mode": "BLACKHOLE",
"ip": "93.77.184.167",
"sshDirect": false,
"sshPassword": null,
"sshPrivateKey": null,
"sshPublicKey": null,
"sshCommand": null,
"appUrl": "https://app-abc12345.vibecode.bitrix24.com",
"note": "BLACKHOLE servers do not expose SSH. Use the Deploy API (exec/upload/logs) instead."
}
}
Error response example
404 — the server does not exist:
{
"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 provided |
| HTTP401 | CodeINVALID_API_KEY |
DescriptionThe key is not recognized — no such key exists on the platform |
| HTTP403 | CodeSERVER_ROLE_FORBIDDEN |
DescriptionYou are on this server's development team with the Developer role, but this operation requires the Administrator role. error.hint includes your role, the minimum required role, and the API calls available to you. Role breakdown — List servers |
| HTTP404 | CodeNOT_FOUND |
DescriptionThe server does not exist or belongs to another API key while you are not on its development team |
| HTTP409 | CodeSERVER_NOT_READY |
DescriptionThe server has no assigned IP address yet |
| HTTP429 | CodeRATE_LIMITED |
DescriptionThe limit of 10 requests per minute per server or the platform's overall rate limit was exceeded. The effective value is provided in the x-ratelimit-limit header |
For the full list of common API errors, see Errors.
Known specifics
- Each BLACKHOLE → OPEN switch generates a new password. Old passwords (if any) become invalid. The same applies to a back-and-forth cycle BLACKHOLE → OPEN → BLACKHOLE → OPEN: each time the server enters OPEN, the platform generates a fresh
sshPassword. sshPrivateKeyandsshPublicKeyare the platform's key pair, not yours. The platform creates this key pair for every server, so inOPENmode both fields are returned even if you passed your ownsshPublicKeywhen creating the server viaPOST /v1/infra/servers. This request does not return your key: the platform does not store it. You can connect with your own key to either a machine created from scratch or a pre-provisioned machine if you supplied it when creating the server. To tell which machine you got, see "Known specifics" on the server creation page.sshCommandis a ready-to-copy string for AI agents and scripts. It is not a separate launch command — justssh ubuntu@IP. Authentication via password or key is a separate step on the SSH client side.- A separate limit of 10 requests per minute per server exists precisely because the returned data is sensitive. The effective value is provided in the
x-ratelimit-limitheader. The platform's overall limit is higher, but/sshis throttled more strictly.