Base URL
https://console.vrtxlabs.tech/api/v2Successful responses wrap payloads in { "data": ... }. Errors return { "error": { "code", "message" } }.
Authentication
Every request requires a Bearer token in the Authorization header. Generate a token from Account Settings → API.
Authorization: Bearer YOUR_API_TOKENOptional IP whitelisting is enforced when configured on your account. Requests from non-whitelisted IPs receive 403 IP_NOT_ALLOWED.
Typical workflow
Authenticate
Create a Bearer token in the console under Account Settings → API.
Discover plans & regions
List compute plans and datacenter locations before provisioning.
Pick an OS template
Templates use slugs (e.g. ubuntu-24.04) that work across nodes in a location.
Create & poll
POST /servers, then poll /servers/{uuid}/status until state is running.
Discover plans, regions & templates
Before creating a server, list available compute plans, datacenter locations, and OS templates for your chosen region.
# List plans
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://console.vrtxlabs.tech/api/v2/plans
# List locations
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://console.vrtxlabs.tech/api/v2/locations
# Templates for location 1
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://console.vrtxlabs.tech/api/v2/locations/1/templatesPlan ↔ API mapping
Use these plan_id values in POST /servers. Tiers match the Cloud VPS pricing page. Prices may change — confirm with GET /plans.
| plan_id | Tier | Specs | USD / mo | USD / hr |
|---|---|---|---|---|
| 1 | 1 vCPU | 1 vCPU · 3 GB · 20 GB NVMe | $3.92 | $0.0053 |
| 2 | 2 vCPU | 2 vCPU · 4 GB · 30 GB NVMe | $5.23 | $0.0073 |
| 3 | 3 vCPU | 3 vCPU · 6 GB · 40 GB NVMe | $7.85 | $0.0109 |
| 4 | 4 vCPU | 4 vCPU · 8 GB · 40 GB NVMe | $10.46 | $0.0153 |
| 5 | 8 vCPU · 16 GB | 8 vCPU · 16 GB · 60 GB NVMe | $20.93 | $0.0294 |
| 6 | 8 vCPU · 24 GB | 8 vCPU · 24 GB · 60 GB NVMe | $31.39 | $0.0436 |
| 7 | 10 vCPU | 10 vCPU · 32 GB · 140 GB NVMe | $41.86 | $0.0589 |
| 8 | 16 vCPU | 16 vCPU · 64 GB · 200 GB NVMe | $85.89 | $0.1188 |
Region ↔ location_id
Pass location_id when creating a server. Regions align with the datacenter list on /vps. Availability varies — always validate with GET /locations before provisioning.
| location_id | Region |
|---|---|
| 1 | New York, USA |
| 2 | San Francisco, USA |
| 3 | London, UK |
| 4 | Frankfurt, DE |
| 5 | Singapore, SG |
| 6 | Sydney, AU |
| 7 | Hong Kong, HK |
| 8 | Tokyo, JP |
| 9 | Mumbai, IN |
| 10 | Seattle, USA |
| 11 | Melbourne, AU |
| 12 | Hobart, AU |
| 13 | Perth, AU |
Create a server
Send plan_id, location_id, and template_slug. The platform selects the best node automatically. The server starts in installing status.
curl -X POST https://console.vrtxlabs.tech/api/v2/servers \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"plan_id": 1,
"location_id": 6,
"template_slug": "ubuntu-24.04",
"hostname": "app-01.example.com"
}'Common template slugs
| Slug | OS |
|---|---|
| ubuntu-24.04 | Ubuntu 24.04 LTS |
| ubuntu-22.04 | Ubuntu 22.04 LTS |
| debian-12 | Debian 12 |
| almalinux-9 | AlmaLinux 9 |
| windows-2022 | Windows Server 2022 |
Always confirm slugs with GET /locations/{id}/templates — availability varies by region.
Poll until running
Poll GET /servers/{uuid}/status until the hypervisor reports running. Fetch root credentials from GET /servers/{uuid}/credentials once installation completes.
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://console.vrtxlabs.tech/api/v2/servers/SERVER_UUID/statusCore endpoints
/plansList plans
Returns compute tiers sorted by monthly price. Filter with ?location_id= for stock at a region.
{
"data": [
{
"id": 1,
"name": "1 vCPU",
"cpu": 1,
"memory": 3221225472,
"disk": 21474836480,
"monthly_price": 3.92,
"hourly_price": 0.0053
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 25,
"total": 8
}
}/locationsList locations
Returns available datacenter locations (Sydney, London, Singapore, etc.).
/locations/{id}/templatesList OS templates
Returns template slugs for a location. Use slug when creating or reinstalling a server.
/serversCreate server
Provisions a VPS. Requires plan_id, location_id, and template_slug. Node selection is automatic.
{
"plan_id": 1,
"location_id": 3,
"template_slug": "ubuntu-24.04",
"hostname": "app-01.example.com"
}{
"data": {
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"uuid_short": "a1b2c3d4",
"name": "app-01.example.com",
"status": "installing",
"cpu": 1,
"memory": 3221225472,
"disk": 21474836480,
"password_status": "generating",
"operating_system": "Ubuntu 24.04 LTS",
"ip_addresses": [
{
"address": "203.0.113.50",
"type": "ipv4",
"gateway": "203.0.113.1",
"cidr": 24
}
],
"created_at": "2026-05-14T10:30:00+00:00"
}
}/serversList servers
Returns a paginated list of your servers. Filter with ?status=installing or ?page=2.
{
"data": [
{
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"uuid_short": "a1b2c3d4",
"name": "app-01.example.com",
"status": "installing",
"cpu": 1,
"memory": 3221225472
}
],
"meta": {
"current_page": 1,
"last_page": 2,
"per_page": 25,
"total": 34
}
}/servers/{uuid}Get server
Full server details. Accepts full UUID or 8-character short UUID.
/servers/{uuid}/statusReal-time status
Hypervisor state (running, stopped) plus app status (installing, suspended, etc.).
{
"data": {
"state": "running",
"status": null,
"uptime_seconds": 86400
}
}/servers/{uuid}/credentialsRoot credentials
Returns root password once installation completes (null while installing).
{
"data": {
"password_status": "ready",
"root_password": "generated-secret-password"
}
}/servers/{uuid}/powerPower actions
Start, shutdown, restart, or kill a server.
Additional endpoints cover backups, security groups, SSH keys, power actions, and billing. See the full reference below.
Pagination
List endpoints return paginated collections. Pass ?page=N (1-based) to walk results. The meta object is always present on paginated responses.
Query parameters
page— Page number (default 1)per_page— Items per page (default 25, max 100)
meta fields
current_page— The page returned in this responselast_page— Total number of pages availableper_page— Page size used for this requesttotal— Total items across all pages
Paginated endpoints: /plans/servers/servers/{uuid}/backups
GET https://console.vrtxlabs.tech/api/v2/servers?page=2&per_page=25
{
"data": [ /* server objects */ ],
"meta": {
"current_page": 2,
"last_page": 4,
"per_page": 25,
"total": 87
}
}Rate limits
API tokens are rate-limited per account. Limits apply across all tokens on the account unless noted otherwise.
Response headers
| Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests allowed in the current window |
| X-RateLimit-Remaining | Requests left before the window resets |
| X-RateLimit-Reset | Unix timestamp when the window resets |
| Retry-After | Seconds to wait before retrying (present on 429 responses) |
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1715684400
Retry-After: 42
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Retry after 42 seconds."
}
}Idempotency & retries
Use retries with care on mutating endpoints. Reads are always safe to repeat; creates are not unless you supply an idempotency key.
Safe to retry
GET, HEAD— Safe — no side effectsDELETE— Safe after the first success (404 on repeat is acceptable)GET /servers/{uuid}/status— Preferred for polling during provisioning
Not safe without a key
POST /servers— May create duplicate VMs if the first request succeeded but the client timed outPOST /servers/{uuid}/power— Repeated shutdown/restart calls may queue conflicting actions
Send Idempotency-Key: <unique-uuid> on POST /servers. The same key within 24 hours returns the original 201 response instead of creating a second server.
POST https://console.vrtxlabs.tech/api/v2/servers
Authorization: Bearer YOUR_API_TOKEN
Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7
Content-Type: application/json
{ "plan_id": 1, "location_id": 3, "template_slug": "ubuntu-24.04" }- Retry GET and status polls with exponential backoff (e.g. 2s → 4s → 8s, cap at 30s) while status is installing.
- On 429, honour Retry-After before sending the next request.
- On 5xx, retry at most 3 times with jitter; do not retry 4xx except 429.
- Never retry POST /servers without Idempotency-Key unless you can tolerate duplicate resources.
Webhooks
Register HTTPS endpoints in the console to receive lifecycle events. Payloads are signed with HMAC-SHA256 (X-Vrtx-Signature header).
| Event | When fired |
|---|---|
| server.installing | Emitted when provisioning starts after POST /servers succeeds |
| server.running | Emitted when the hypervisor reports running and install completes |
| server.suspended | Emitted when a server is suspended (billing or policy action) |
| server.deleted | Emitted after permanent deletion and IP release |
{
"id": "evt_01j2k3m4n5p6q7r8",
"type": "server.running",
"created_at": "2026-05-14T10:35:12+00:00",
"data": {
"uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"uuid_short": "a1b2c3d4",
"name": "app-01.example.com",
"status": null,
"state": "running"
}
}- Endpoints must return 2xx within 10 seconds.
- Failed deliveries are retried with exponential backoff for up to 72 hours.
- Verify signatures before acting on payload data.
Common errors
| Code | HTTP | Description |
|---|---|---|
| UNAUTHENTICATED | 401 | Missing or invalid Authorization header |
| INVALID_TOKEN | 401 | API token does not match any account |
| IP_NOT_ALLOWED | 403 | Request IP is not on your API whitelist |
| RATE_LIMIT_EXCEEDED | 429 | Too many requests — back off and retry after Retry-After |
| VALIDATION_ERROR | 422 | Request body failed validation |
| OVERDUE_INVOICE | 402 | Pay outstanding invoices before creating servers |
Console & OpenAPI
Provision servers in the console, create an API token for automation, or download the OpenAPI spec for code generation.