REST API · v1

STABLEVPS API

Integrate Forex VPS provisioning directly into your platform. Create, manage, and control VPS instances programmatically — no dashboard required.

⚡

REST API

Standard HTTP/JSON interface, works with any language

🔑

API Keys

Bearer token auth, scoped permissions, up to 10 keys

🌍

6 Locations

Amsterdam, London, Frankfurt, New York, Singapore, Tokyo

Base URL: https://stablevps.com
All endpoints are prefixed with /api/v1/. Responses are JSON.

⚡ Quickstart

Provision your first VPS in 3 steps.

1

Get an API key

Call POST /api/v1/auth with your credentials, or go to your dashboard.

curl -X POST https://stablevps.com/api/v1/auth \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"••••","name":"My App"}'
# → { "apiKey": "svps_live_..." }
2

Top up your wallet

Visit Dashboard → Add Funds. VPS creation via API uses wallet balance only.

curl https://stablevps.com/api/v1/wallet \
  -H "Authorization: Bearer svps_live_..."
# → { "balance": 100.00, "currency": "EUR" }
3

Create a VPS

Provision a VPS and poll until active.

# Create
curl -X POST https://stablevps.com/api/v1/vps \
  -H "Authorization: Bearer svps_live_..." \
  -H "Content-Type: application/json" \
  -d '{"planId":"basic","billingCycle":"monthly","location":"amsterdam"}'

# Poll until vpsStatus === "active"
curl https://stablevps.com/api/v1/vps/<id> \
  -H "Authorization: Bearer svps_live_..."

🔑 Authentication

All API endpoints (except POST /api/v1/auth) require an API key passed in the Authorization header.

# Option A — Bearer token

Authorization: Bearer svps_live_xxxxxxxxxxxx


# Option B — Custom header

X-API-Key: svps_live_xxxxxxxxxxxx

full

Read + write. Can create/delete VPS, perform actions.

read

Read-only. Can list/view resources, cannot modify.

POST/api/v1/authEmail + Password

Authenticates with email + password and returns a new API key. The raw key is only returned once — store it securely. Up to 10 keys per account.

Request Body

NameTypeRequiredDescription
emailstringrequiredAccount email address
passwordstringrequiredAccount password
namestringrequiredA label for the key, e.g. "My Bot"
scopestringoptionalPermission scope"full" | "read" — default: "full"
expiresInDaysnumberoptionalValidity in days. Omit for no expiry.

Response — 200 / 201

{
  "apiKey": "svps_live_a3f7c2...",
  "keyPrefix": "svps_live_a3f7",
  "name": "My Bot",
  "scope": "full",
  "expiresAt": null,
  "message": "Store this key safely — it will not be shown again."
}

Examples

curl -X POST https://stablevps.com/api/v1/auth \
  -H "Content-Type: application/json" \
  -d '{
    "email": "you@example.com",
    "password": "YourPassword",
    "name": "My Bot",
    "scope": "full"
  }'
GET/api/v1/authAPI Key Required

Returns metadata for all API keys on the account. The raw key is never returned — only the prefix for identification.

Response — 200 / 201

{
  "keys": [
    {
      "_id": "664abc...",
      "name": "My Bot",
      "keyPrefix": "svps_live_a3f7",
      "scope": "full",
      "lastUsedAt": "2026-05-10T14:32:00.000Z",
      "expiresAt": null,
      "createdAt": "2026-05-01T09:00:00.000Z"
    }
  ]
}

Examples

curl https://stablevps.com/api/v1/auth \
  -H "Authorization: Bearer svps_live_xxxx..."
DELETE/api/v1/authAPI Key Required

Permanently revokes a key. You cannot revoke the key currently used to make this request.

Query Parameters

NameTypeRequiredDescription
keyIdstringrequiredThe MongoDB `_id` of the key to revoke

Response — 200 / 201

{ "success": true, "message": "API key revoked" }

Examples

curl -X DELETE "https://stablevps.com/api/v1/auth?keyId=664abc..." \
  -H "Authorization: Bearer svps_live_xxxx..."

🖥️ VPS

Provision, inspect, and control VPS instances.

GET/api/v1/vpsAPI Key Required

Returns all VPS services attached to the authenticated account.

Response — 200 / 201

{
  "vps": [
    {
      "id": "6641abc...",
      "planId": "prime",
      "billingCycle": "monthly",
      "status": "active",
      "vpsStatus": "active",
      "ipAddress": "185.12.34.56",
      "location": "amsterdam",
      "rdpUsername": "Administrator",
      "serverId": "zomro-12345",
      "currentPeriodEnd": "2026-06-11T09:00:00.000Z",
      "createdAt": "2026-05-11T09:00:00.000Z"
    }
  ],
  "total": 1
}

Examples

curl https://stablevps.com/api/v1/vps \
  -H "Authorization: Bearer svps_live_xxxx..."
POST/api/v1/vpsAPI Key Requiredscope: full

Provisions a new Forex VPS and deducts the cost from the wallet balance. The VPS is provisioned asynchronously — poll `GET /api/v1/vps/:id` until `vpsStatus` is `"active"`.

Request Body

NameTypeRequiredDescription
planIdstringrequiredPlan identifier"basic" | "prime" | "pro"
billingCyclestringrequiredBilling cycle"monthly" | "yearly"
locationstringrequiredDatacenter location"amsterdam" | "london" | "frankfurt" | "newYork" | "singapore" | "tokyo"

Response — 200 / 201

{
  "success": true,
  "message": "VPS provisioning started. It will be active in a few minutes.",
  "id": "6641abc...",
  "vpsId": "zomro-67890",
  "planId": "prime",
  "billingCycle": "monthly",
  "location": "amsterdam",
  "vpsStatus": "provisioning",
  "rdpUsername": "Administrator",
  "cost": 19.49,
  "newBalance": 80.51,
  "currency": "EUR",
  "currentPeriodEnd": "2026-06-11T09:00:00.000Z"
}

Examples

curl -X POST https://stablevps.com/api/v1/vps \
  -H "Authorization: Bearer svps_live_xxxx..." \
  -H "Content-Type: application/json" \
  -d '{
    "planId": "prime",
    "billingCycle": "monthly",
    "location": "amsterdam"
  }'
GET/api/v1/vps/:idAPI Key Required

Retrieves the current state of a VPS, including live data from the provider (IP address, hostname).

Path Parameters

NameTypeRequiredDescription
idstringrequiredThe MongoDB service `_id` returned when creating the VPS

Response — 200 / 201

{
  "id": "6641abc...",
  "planId": "prime",
  "billingCycle": "monthly",
  "status": "active",
  "vpsStatus": "active",
  "ipAddress": "185.12.34.56",
  "hostname": "vps-john-1715420400000",
  "rdpUsername": "Administrator",
  "rdpPassword": "••••••••",
  "location": "amsterdam",
  "serverId": "zomro-67890",
  "currentPeriodStart": "2026-05-11T09:00:00.000Z",
  "currentPeriodEnd": "2026-06-11T09:00:00.000Z",
  "createdAt": "2026-05-11T09:00:00.000Z"
}

Examples

curl https://stablevps.com/api/v1/vps/6641abc... \
  -H "Authorization: Bearer svps_live_xxxx..."
DELETE/api/v1/vps/:idAPI Key Requiredscope: full

Terminates and permanently removes a VPS. This action is irreversible and no refund is issued for the remaining period.

Path Parameters

NameTypeRequiredDescription
idstringrequiredThe MongoDB service `_id`

Response — 200 / 201

{
  "success": true,
  "message": "VPS terminated successfully",
  "id": "6641abc...",
  "providerDeleted": true
}

Examples

curl -X DELETE https://stablevps.com/api/v1/vps/6641abc... \
  -H "Authorization: Bearer svps_live_xxxx..."
POST/api/v1/vps/:id/actionsAPI Key Requiredscope: full

Send a control action to a VPS: `start`, `stop`, or `reboot`.

Path Parameters

NameTypeRequiredDescription
idstringrequiredThe MongoDB service `_id`

Request Body

NameTypeRequiredDescription
actionstringrequiredAction to perform"start" | "stop" | "reboot"

Response — 200 / 201

{
  "success": true,
  "action": "reboot",
  "vpsId": "zomro-67890",
  "message": "VPS reboot request sent successfully"
}

Examples

curl -X POST https://stablevps.com/api/v1/vps/6641abc.../actions \
  -H "Authorization: Bearer svps_live_xxxx..." \
  -H "Content-Type: application/json" \
  -d '{"action": "reboot"}'

👤 Account

Retrieve account profile and wallet balance.

GET/api/v1/accountAPI Key Required

Returns profile information and VPS count summary for the authenticated account.

Response — 200 / 201

{
  "id": "6630abc...",
  "firstName": "John",
  "lastName": "Doe",
  "email": "john@example.com",
  "role": "user",
  "balance": 100.00,
  "currency": "EUR",
  "referralCode": "JOHN2026",
  "affiliateStats": {
    "totalReferrals": 3,
    "successfulReferrals": 2,
    "totalEarnings": 3.90
  },
  "activeVpsCount": 1,
  "totalVpsCount": 2,
  "createdAt": "2026-01-01T00:00:00.000Z"
}

Examples

curl https://stablevps.com/api/v1/account \
  -H "Authorization: Bearer svps_live_xxxx..."
GET/api/v1/walletAPI Key Required

Returns the current EUR wallet balance. The wallet is the only payment method available via API.

Response — 200 / 201

{ "balance": 100.00, "currency": "EUR" }

Examples

curl https://stablevps.com/api/v1/wallet \
  -H "Authorization: Bearer svps_live_xxxx..."

⚠️ Errors

All errors return a JSON body with an error field.

{ "error": "Insufficient wallet balance", "required": 19.49, "available": 5.00, "currency": "EUR" }
StatusMeaning
200 / 201Success
400Bad request — missing or invalid parameters
401Unauthorized — missing, invalid or expired API key
402Payment required — insufficient wallet balance
403Forbidden — read-only key used on a write endpoint
404Not found — resource does not exist or belongs to another account
429Rate limited — max 10 API keys per account
500Internal server error
502Provider error — the VPS provider returned a failure

đź’¶ Plans & Pricing

Use these planId values when creating a VPS.

planIdNameCPURAMStorageMonthlyYearly
basicStarter1 vCPU2.5 GB17 GB NVMe€12.49€124.90
primeProfessional2 vCPU4 GB35 GB NVMe€19.49€194.90
proEnterprise4 vCPU8 GB65 GB NVMe€34.49€344.90

All prices in EUR. Windows Server 2022 included. MT5 pre-installed.

🌍 Locations

🇳🇱

amsterdam

Amsterdam

🇬🇧

london

London

🇩🇪

frankfurt

Frankfurt

🇺🇸

newYork

New York

🇸🇬

singapore

Singapore

🇯🇵

tokyo

Tokyo

🚀 Use Cases

Integrate VPS sales into your SaaS

Let your users purchase Forex VPS directly from your platform — you handle billing, we handle provisioning.

// 1. Your backend creates a VPS when user pays
async function onUserPaid(userId, plan) {
  const res = await fetch('https://stablevps.com/api/v1/vps', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.STABLEVPS_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      planId: plan,          // 'basic' | 'prime' | 'pro'
      billingCycle: 'monthly',
      location: 'amsterdam',
    }),
  });
  const vps = await res.json();
  await db.users.update(userId, { vpsId: vps.id });
}

// 2. Poll and deliver credentials to your user
async function awaitAndDeliver(vpsId, userId) {
  let vps;
  while (true) {
    const r = await fetch(`https://stablevps.com/api/v1/vps/${vpsId}`, {
      headers: { Authorization: `Bearer ${process.env.STABLEVPS_API_KEY}` },
    });
    vps = await r.json();
    if (vps.vpsStatus === 'active') break;
    await new Promise(r => setTimeout(r, 15000)); // wait 15s
  }
  await sendEmail(userId, {
    ip: vps.ipAddress,
    user: vps.rdpUsername,
    pass: vps.rdpPassword,
  });
}

Auto-reboot monitoring bot

import requests, time

API_KEY = 'svps_live_...'
HEADERS = {'Authorization': f'Bearer {API_KEY}'}

def monitor():
    vps_list = requests.get(
        'https://stablevps.com/api/v1/vps', headers=HEADERS
    ).json()['vps']

    for vps in vps_list:
        if vps['vpsStatus'] != 'active':
            print(f"VPS {vps['id']} is down, rebooting...")
            requests.post(
                f"https://stablevps.com/api/v1/vps/{vps['id']}/actions",
                json={'action': 'reboot'},
                headers=HEADERS,
            )

while True:
    monitor()
    time.sleep(60)  # check every minute

Shell alias for quick management

# ~/.bashrc or ~/.zshrc
export SVPS_KEY="svps_live_..."
alias svps-list='curl -s https://stablevps.com/api/v1/vps -H "Authorization: Bearer $SVPS_KEY" | jq'
alias svps-balance='curl -s https://stablevps.com/api/v1/wallet -H "Authorization: Bearer $SVPS_KEY" | jq'
svps-reboot() { curl -s -X POST "https://stablevps.com/api/v1/vps/$1/actions" \
  -H "Authorization: Bearer $SVPS_KEY" -H "Content-Type: application/json" \
  -d '{"action":"reboot"}' | jq; }

# Usage:
svps-list
svps-balance
svps-reboot 6641abc...

STABLEVPS API v1 · stablevps.com

Questions? Open a support ticket.