For AI agents: markdown of this page — /docs-content-en/infra/deploy/runtimes.md documentation index — /llms.txt
List of runtimes
GET /v1/infra/runtimes
Returns the IDs of ready-made runtimes to pass into POST /v1/infra/servers/:id/deploy (the runtime parameter). The runtime parameter is optional: if the stack you need is in the list, pass its ID and the platform will install the packages automatically. If not, a deploy without runtime on a dedicated virtual machine still works fully — install the software you need via preStart in the request body. For a Galaxy application runtime is required and preStart does not apply. On POST /v1/infra/servers a runtime without source has NOT been accepted since 2026-04-25 — see RUNTIME_PARAM_REMOVED. When a Galaxy application is created in one step, runtime is passed together with source; start is also required unless the runtime is static, where it is optional and ignored. Each runtime is a set of system packages (nodejs, python, nginx, databases) installed on the server. The estimated installation time is 2–4 minutes for the basic ones, up to 4+ minutes for combinations with several packages.
Examples
curl — personal key
curl -H "X-Api-Key: YOUR_API_KEY" \
https://vibecode.bitrix24.com/v1/infra/runtimes
curl — OAuth application
curl -H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
https://vibecode.bitrix24.com/v1/infra/runtimes
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/infra/runtimes', {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const { data: runtimes } = await res.json()
runtimes.forEach(r => console.log(`${r.id}: ${r.name} (${r.estimatedSetupTime}s)`))
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/infra/runtimes', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
array | Array of runtimes |
data[].id |
string | The runtime ID, passed as runtime on deploy (POST /v1/infra/servers/:id/deploy) |
data[].name |
string | Display name for the user |
data[].packages |
array<string> | List of packages installed on a dedicated virtual machine (for reference) |
data[].estimatedSetupTime |
number | Estimated installation time in seconds |
data[].supportedPlacements |
array<string> | Where the runtime is available: ["standalone"] — dedicated virtual machine only, ["standalone","galaxy"] — Galaxy too. Check this field before a Galaxy deploy: a runtime with a database cannot be installed there |
Response example
{
"success": true,
"data": [
{
"id": "node20",
"name": "Node.js 20",
"packages": ["nodejs-20", "npm", "pm2"],
"estimatedSetupTime": 120,
"supportedPlacements": ["standalone", "galaxy"]
},
{
"id": "node20-pg",
"name": "Node.js 20 + PostgreSQL",
"packages": ["nodejs-20", "npm", "pm2", "postgresql-16"],
"estimatedSetupTime": 180,
"supportedPlacements": ["standalone"]
},
{
"id": "python311-rag",
"name": "Python 3.11 + RAG (pgvector + Redis)",
"packages": ["python3.11", "pip", "postgresql-16", "pgvector", "redis"],
"estimatedSetupTime": 240,
"supportedPlacements": ["standalone"]
}
]
}
Error response example
401 — no API key provided:
{
"success": false,
"error": {
"code": "MISSING_API_KEY",
"message": "API key required. Pass via X-Api-Key header."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 401 | MISSING_API_KEY |
The X-Api-Key header was not provided |
| 401 | INVALID_API_KEY |
The key is not recognized — no such key exists on the platform |
| 429 | RATE_LIMITED |
The platform's overall request limit was exceeded |
Full list of common API errors — Errors.
Known specifics
- As of 2026-04-22 the platform offers 15 runtimes: six Node.js 20 variants (plain, with PostgreSQL, MySQL, Redis, combinations, the RAG stack), five Python 3.11 variants (similarly), two PHP 8.3 variants (plain and with MySQL), and
staticfor SPA static content. The current snapshot is always in the endpoint's response. - The start command depends on the runtime — pass it in the deploy
startfield, except forstatic. Forstatic, the field is optional and ignored: the platform starts nginx itself. Other runtimes use versioned commands on a dedicated virtual machine:node20*—node,python311*—python3.11, andphp83*—php8.3. There is nopythoncommand on such a machine, andpython3stays the Ubuntu 24.04 system interpreter — that is version 3.12. Thepython3.11command works in Galaxy too, so such astartfits both placement models. The runtime bindspipto 3.11, sopip installin theinstallfield puts dependencies into the same interpreter that runs the app. - The
pm2package in a runtime's list is a tool installed on the machine, not a way to start the application. Thenode20runtime and its variants installpm2alongside Node.js, but thestartfield requires a command that stays in the foreground and holds the listener itself. A command such aspm2 start server.js --name app && pm2 savelaunches a daemon and exits, and the platform stops the application service along with it. The full rule, both outcomes of such a command and what tells them apart in the deploy result — Full deploy, "Known specifics". - Where
pipfetches packages from. The platform sets a default package index — the canonical PyPI (pypi.org). The setting is machine-wide, so it covers the automaticrequirements.txtinstall, your own command in theinstallfield, and anypipyou run by hand throughexec. Your choice wins over ours: an--index-urlinrequirements.txtor in the install command overrides the default. APIP_INDEX_URLfrom the deployenvdoes NOT affect a Galaxy build — the environment reaches the container at runtime, while dependencies are installed earlier, during the image build; on a dedicated virtual machine it does work. If package immutability matters to you, use--require-hasheswith pinned hashes — that is the only mechanism protecting you from substitution on the index side.poetryanduvdo not read our setting; point them at an index using their own configuration mechanism. - Where npm and apt fetch packages in Galaxy. Before the build, the platform sets machine-wide npm and Debian configuration, so both automatic installation and the
installcommand see it; deployenvdoes not affect those build steps. An npm command's own registry or custom Debian sources override the default. - RAG runtimes (
node20-rag,python311-rag) — a ready-made environment for the RAG pattern (retrieval-augmented generation — an LLM response enriched with context from external sources): PostgreSQL with the pgvector extension for embeddings and Redis for caching. Right after installation you can connect LlamaIndex / LangChain. - Nginx in
static,php83, andphp83-mysql. On a dedicated virtual machine the runtime installs the package before stopping the previous application, but it does not start the systemnginx.serviceor leave it newly enabled. Forstatic, the listener is started by the managedapp.service; PHP recipes keep their own start commands. static— a runtime for single-page applications and static sites. Send an archive containing the ready build,runtime: "static", and the desiredport(default3000);startis optional and ignored in every placement. The remaining behavior is placement-specific. On a dedicated virtual machine with the usualsystemd: true, the platform creates the nginx configuration, servesextractTo(default/opt/app), and runs nginx under an unprivileged account; the document root must be a nested application directory under/optor/srv, while every/var/libpath and/opt/dataare refused. Withsystemd: false, the platform creates neither an nginx configuration nor a unit: the pre-existing unit must listen on the selectedportitself. In Galaxy, files always live at/opt/appinside the container,extractToand standalone settings are ignored, and the container runs nginx with its fixed command. The managed configurations in both placements fall back toindex.htmlfor client-side routes, check the complete path chain for symlinks, and do not serve hidden files including.env. Multipart deploys still require theportfield.- The
php83andphp83-mysqlruntimes, and the MySQL variants (node20-mysql,node20-mysql-redis,python311-mysql), need"hardening": "off". After installation MySQL allows only the administrator to connect over the local socket, and PHP-FPM runs as a separate system service — under an unprivileged account the app cannot reach the database. The platform restores the previous mode on its own, but the attempt and its health check cost time on every deploy. Pass"hardening": "off"in the deploy body to skip it. Apps that reach MySQL over TCP with a password do not need this. - Combo runtimes run on a dedicated virtual machine only. The
-pg/-mysql/-redis/-ragsuffixes describe the dedicated-machine template: there, PostgreSQL / MySQL / Redis really is installed alongside the language. A Galaxy app is a single language container on a shared host — no database is started there and no connection variables (DATABASE_URL,PG*, etc.) are injected, so deploying such a runtime into Galaxy is refused: a400with codeGALAXY_RUNTIME_DB_UNSUPPORTED, adetails.suggestedRuntimefield (the language replacement —node20instead ofnode20-pg, for example) and a hint. Which runtime fits which placement is machine-readable in the catalog GET /v1/infra/runtimes: every entry carriessupportedPlacements—["standalone"]or["standalone","galaxy"]. Thenameandpackagesfields describe the dedicated-machine install and do not change. If a Galaxy app needs a database, take a language runtime and pass the connection string of an external (managed) DB throughenv, or deploy the app to a dedicated virtual machine with the original runtime. - The same runtime ID can mean different patch versions in Galaxy versus on a dedicated virtual machine. In Galaxy the runtime is built from an official Docker image (
node:20-slim,python:3.11-slim,php:8.3-cli,nginx:alpine) — the version follows the image tag. On a dedicated virtual machine the major version is pinned and matches what is advertised (Node.js 20, Python 3.11, PHP 8.3, PostgreSQL 16); the patch version follows the install source. If the exact version is critical, check it inside the app on the target placement rather than relying on the runtime ID alone. estimatedSetupTimeis an estimate, not a guarantee. It depends on the load of the apt mirrors, the network speed of the virtual machine, and the specific Ubuntu image build. Budget 2× the stated value when automating.- If the stack you need is not in the list — use
preStarton a dedicated virtual machine. The server is a clean Ubuntu 24.04 with root access. In the deploy'spreStartfield you can run anyapt-get install, download binaries, set up the environment. The result is preserved between deploys (except for theextractTodirectory, whichcleanDeploy: truecleans). For one-off operations —POST /exec.