GPUcloud

Developers

REST API and MCP server

Catalog and prices in CAD, availability, GPU servers, SSH keys, backups, credit and budget are available to your code: your scripts use the REST API (operations listed below), your AI agents connect to the MCP server. Access keys are created in the console.

Get started in 3 steps

  1. 1

    Create an account

    Sign up online. Add credit when you are ready to deploy.

    Create an account
  2. 2

    Create an API key

    In the console, Settings page, API keys section. The full key is shown only once: keep it in a secrets manager.

    Create an API key
  3. 3

    Make your first call

    List the catalog with your prices in Canadian dollars and live availability.

curl "https://gpucloud.ca/api/v1/gpu"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"

Replace $GPUCLOUD_API_KEY with your key (prefix gpu_).

Public availability, no key

To check whether a GPU model can be deployed right now. Response cached 60 seconds, open CORS.

curl "https://gpucloud.ca/api/v1/availability"

Authentication

  • Every request carries the header Authorization: Bearer followed by your REST API key (prefix gpu_).
  • Keys are created from the console only, never through the API: a key cannot create or delete other keys.
  • A key expires after 90 days. Only its prefix stays visible; the key is stored as a SHA-256 hash.
  • Two levels: full access, or read only (GET only; any other method answers 401).
  • MCP keys (prefix gpc_mcp_) are refused by the REST API and reserved for the MCP server.

Write requests (POST, PUT, DELETE) must also send the header Origin: https://gpucloud.ca, otherwise they answer 403. The examples below include it.

Endpoints

Base URL: https://gpucloud.ca/api. The operations below are generated from the published OpenAPI spec.

Catalog, prices and availability

GET/api/v1/gpuList GPU PlansAPI key, 60 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/v1/gpu" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"

Response

{
  "data": [
    {
      "id": "gpu-l40",
      "name": "NVIDIA L40",
      "gpu": "1x NVIDIA L40 (48 GB GDDR6)",
      "gpuModel": "NVIDIA L40",
      "gpuCount": 1,
      "spot": false,
      "hourlyOnly": false,
      "specs": {
        "vcores": 28,
        "ram": 58,
        "storage": 100,
        "localStorage": 725,
        "storageType": "NVMe"
      },
      "pricing": {
        "hourly": 1.34,
        "monthly": 941.7,
        "annual": 941.7,
        "currency": "CAD"
      },
      "priceOnRequest": false,
      "available": true,
      "purchasable": true,
      "autoProvisioning": true,
      "eligibility": "deployable"
    },
    {
      "id": "gpu-l40-x2",
      "name": "NVIDIA L40 × 2",
      "gpu": "2x NVIDIA L40 (48 GB GDDR6)",
      "gpuModel": "NVIDIA L40",
      "gpuCount": 2,
      "spot": false,
      "hourlyOnly": false,
      "specs": {
        "vcores": 60,
        "ram": 116,
        "storage": 100,
        "localStorage": 1550,
        "storageType": "NVMe"
      },
      "pricing": {
        "hourly": 2.68,
        "monthly": 1876.1,
        "annual": 1876.1,
        "currency": "CAD"
      },
      "priceOnRequest": false,
      "available": true,
      "purchasable": true,
      "autoProvisioning": true,
      "eligibility": "deployable"
    }
  ]
}
GET/api/v1/availabilityPublic GPU availabilityPublic, 60 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/v1/availability"

Response

{
  "data": {
    "region": "canada-montreal",
    "updatedAt": "2026-09-28T12:00:00.000Z",
    "models": [
      {
        "slug": "h100",
        "name": "NVIDIA H100 PCIe",
        "sizes": [
          {
            "id": "gpu-h100",
            "gpuCount": 1,
            "spot": false,
            "available": true,
            "priceOnRequest": false
          },
          {
            "id": "gpu-h100-x2",
            "gpuCount": 2,
            "spot": false,
            "available": false,
            "priceOnRequest": false
          }
        ]
      },
      {
        "slug": "h200",
        "name": "NVIDIA H200 SXM",
        "sizes": [
          {
            "id": "gpu-h200-sxm-x8",
            "gpuCount": 8,
            "spot": false,
            "available": false,
            "priceOnRequest": true
          }
        ]
      }
    ]
  }
}
GET/api/v1/stockAvailability per model and size (same view as /v1/availability).API key, 30 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/v1/stock"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"
GET/api/v1/regionsRegions served.API key, 30 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/v1/regions"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"
GET/api/v1/flavorsMachine sizes of the catalog.API key, 30 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/v1/flavors"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"
GET/api/v1/imagesOperating system images.API key, 30 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/v1/images"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"
GET/api/v1/environmentsEnvironments where your servers are deployed.API key, 30 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/v1/environments"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"
GET/api/servers/deploy-quoteWhat a deployment will cost your account (price and credit required), without creating anything.API key, 60 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/servers/deploy-quote?productId=gpu-l40"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"

Servers: create, list, start, stop, delete

GET/api/serversList ServersAPI key, 30 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/servers" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"

Response

{
  "data": [
    {
      "id": "clxyz123456",
      "name": "gpu-abc12345-1719000000000",
      "status": "ACTIVE",
      "gpu": "L40",
      "specs": {
        "vcores": 28,
        "ram": 58,
        "storage": 100
      },
      "ipv4": "1.2.3.4",
      "region": "canada-montreal",
      "monthlyCost": 941.7,
      "createdAt": "2026-06-24T12:00:00.000Z"
    }
  ]
}
POST/api/serversCreate ServerAPI key, 5 requests per minute

Request

curl -X POST "https://gpucloud.ca/api/servers" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca" \
  -H "Content-Type: application/json" \
  -d '{"productId":"gpu-l40","sshKeyId":"clxyz123456","name":"my-ml-server","region":"canada-montreal"}'

Response

{
  "data": {
    "id": "clxyz123456",
    "name": "gpu-abc12345-1719000000000",
    "status": "PROVISIONING",
    "gpu": "L40"
  }
}
GET/api/servers/{id}Get ServerAPI key, 30 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/servers/<id>" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"
DELETE/api/servers/{id}Delete ServerAPI key, 5 requests per minute

Request

curl -X DELETE "https://gpucloud.ca/api/servers/<id>" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca"
POST/api/servers/{id}/actionsServer ActionAPI key, 5 requests per minute

Request

curl -X POST "https://gpucloud.ca/api/servers/<id>/actions" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca" \
  -H "Content-Type: application/json" \
  -d '{"action":"reboot"}'
GET/api/servers/{id}/metricsServer MetricsAPI key, 30 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/servers/<id>/metrics" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"
GET/api/servers/{id}/firewallList Firewall RulesAPI key, 30 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/servers/<id>/firewall" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"
POST/api/servers/{id}/firewallAdd Firewall RuleAPI key, 5 requests per minute

Request

curl -X POST "https://gpucloud.ca/api/servers/<id>/firewall" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca" \
  -H "Content-Type: application/json" \
  -d '{"direction":"ingress","protocol":"tcp","portRangeMin":8080,"portRangeMax":8080,"remoteIpPrefix":"0.0.0.0/0"}'
DELETE/api/servers/{id}/firewallDelete Firewall RuleAPI key, 5 requests per minute

Request

curl -X DELETE "https://gpucloud.ca/api/servers/<id>/firewall" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca" \
  -H "Content-Type: application/json" \
  -d '{"ruleId":123}'
GET/api/servers/{id}/backupsList backupsAPI key, 60 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/servers/<id>/backups" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"
POST/api/servers/{id}/backupsBack up nowAPI key, 5 requests per minute

Request

curl -X POST "https://gpucloud.ca/api/servers/<id>/backups" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca"
PUT/api/servers/{id}/backupsBackup optionAPI key, 10 requests per minute

Request

curl -X PUT "https://gpucloud.ca/api/servers/<id>/backups" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true,"hourLocal":3,"retention":7}'
DELETE/api/servers/{id}/backups/{backupId}Delete a backupAPI key, 10 requests per minute

Request

curl -X DELETE "https://gpucloud.ca/api/servers/<id>/backups/<backupId>" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca"
GET/api/servers/{id}/backups/{backupId}/restoreRestore priceAPI key, 30 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/servers/<id>/backups/<backupId>/restore" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"
POST/api/servers/{id}/backups/{backupId}/restoreRestore to a new serverAPI key, 3 requests per minute

Request

curl -X POST "https://gpucloud.ca/api/servers/<id>/backups/<backupId>/restore" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca" \
  -H "Content-Type: application/json" \
  -d '{"name":"train-restored"}'
GET/api/servers/{id}/eventsActivity log of a server.API key, 30 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/servers/<id>/events"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"

SSH keys

GET/api/settings/ssh-keysList SSH KeysAPI key, 30 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/settings/ssh-keys" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"
POST/api/settings/ssh-keysAdd SSH KeyAPI key, 5 requests per minute

Request

curl -X POST "https://gpucloud.ca/api/settings/ssh-keys" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca" \
  -H "Content-Type: application/json" \
  -d '{"name":"my-laptop","publicKey":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExample user@laptop"}'
DELETE/api/settings/ssh-keysDelete SSH KeyAPI key, 5 requests per minute

Request

curl -X DELETE "https://gpucloud.ca/api/settings/ssh-keys?id=<id>" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY" \
  -H "Origin: https://gpucloud.ca"

Billing and budget

GET/api/creditsCredit balance and transactions (summary=1 for the balance only).API key, 30 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/credits"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"
GET/api/servers/{id}/usageHour by hour billing of a server.API key, 30 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/servers/<id>/usage"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"
GET/api/servers/{id}/budgetMonthly limit of a server and its cost this month.API key, 60 requests per minute

Read only, not in the OpenAPI spec yet.

Request

curl -X GET "https://gpucloud.ca/api/servers/<id>/budget"   -H "Authorization: Bearer $GPUCLOUD_API_KEY"

API keys

GET/api/v1/api-keysList API KeysAPI key, 30 requests per minute

Request

curl -X GET "https://gpucloud.ca/api/v1/api-keys" \
  -H "Authorization: Bearer $GPUCLOUD_API_KEY"

Response

{
  "data": [
    {
      "id": "clxyz123456",
      "name": "CI/CD Pipeline",
      "prefix": "gpu_k_abc1",
      "lastUsedAt": "2026-06-24T10:00:00.000Z",
      "createdAt": "2026-06-01T12:00:00.000Z"
    }
  ]
}

API keys are created and revoked from the console only, signed in to your account: an API key can neither create nor delete a key. Manage my API keys in the console

Rate limits

Each operation is limited per IP address and per minute. Beyond that, the answer is 429 Too many requests: wait for the next minute before retrying. The limit of each operation is shown next to it above.

Error codes

400
Invalid request (missing or out of range parameter).
401
Missing key (NO_API_KEY), or an invalid, expired, revoked key or a read only key on a write (INVALID_API_KEY). The answer links to account and key creation.
402
Not enough credit, card required (PAYMENT_REQUIRED) or budget cap reached (BUDGET_CAP_REACHED). The answer gives the direct link to pay or raise the cap.
403
Write request without an allowed Origin header.
404
Resource not found or not owned by your account.
409
Conflict, for example a GPU model not available right now.
429
Rate limit reached.
500
Internal error: retry later or write to support.

Errors are JSON with at least an error field (code or message), sometimes with a message field and details.

Account or payment: what to do, with the link

When a request fails for an account or payment reason, the answer carries an accountAction object: a stable code, a clear message (in French when your Accept-Language header asks for it, otherwise in English), the action to take with its absolute link, every useful link and, when known, the minimum amount in Canadian dollars covering one hour of the GPU asked for. Add your card and credits at the given link, run the same request again: you will get your GPU.

NO_API_KEY
401: no key was sent. Create an account, then an API key in the console.
INVALID_API_KEY
401: invalid, expired or revoked key, or one without the required permission. Create a new key.
PAYMENT_REQUIRED
402: not enough credit, no saved card or a declined card. Add a card and credits; minimumCad is the price of one hour of the GPU asked for.
BUDGET_CAP_REACHED
402: the account or server budget limit, or an MCP key cap, was reached. Nothing is charged; the link opens the cap setting.

Compatibility: the error field keeps its previous value (a string, for example Unauthorized or INSUFFICIENT_CREDITS) along with message and the existing details; accountAction is added next to them. Read accountAction.code for the stable code.

AI agents (MCP): the same object comes back in the tool error result (isError, structuredContent.error.accountAction) and the message text contains the link, readable by the AI.

Example 402 answer:

{
  "error": "INSUFFICIENT_CREDITS",
  "message": "Payment required. You need a paid order or at least enough credits for 1 hour of usage.",
  "requiredCredits": 1.34,
  "currentBalance": 0,
  "accountAction": {
    "code": "PAYMENT_REQUIRED",
    "message": "Payment required. Add your card and credits here, then run the same request again: you will get your GPU. https://gpucloud.ca/en/console/billing?addCredits=25 At least 1.34 CAD is needed to cover one hour of this GPU (smallest credit purchase: 25 CAD).",
    "action": {
      "label": "Add a card and credits",
      "url": "https://gpucloud.ca/en/console/billing?addCredits=25"
    },
    "links": {
      "signup": "https://gpucloud.ca/en/auth/register",
      "login": "https://gpucloud.ca/en/auth/login",
      "apiKeys": "https://gpucloud.ca/en/console/settings#api-keys",
      "billing": "https://gpucloud.ca/en/console/billing",
      "addCredits": "https://gpucloud.ca/en/console/billing?addCredits=25",
      "paymentMethod": "https://gpucloud.ca/en/console/billing#payment-method",
      "budget": "https://gpucloud.ca/en/console/billing#budget-limit",
      "documentation": "https://gpucloud.ca/en/developers#errors"
    },
    "minimumCad": 1.34,
    "minimumTopupCad": 25
  }
}

Credit, budget and caps

  • Hourly billing is taken from your prepaid credit balance in Canadian dollars; an hourly deployment needs at least one hour of credit.
  • GET /api/servers/deploy-quote tells the price and the credit required before you create a server.
  • You can set a monthly (and daily) budget limit for the account: once reached, running hourly servers are hibernated with no data lost and new deployments are refused.
  • Each hourly server can also have its own monthly limit, readable with GET /api/servers/{id}/budget.
  • MCP keys have their own caps, chosen when they are created (see the AI agents section).

AI agents (MCP)

GPUcloud runs a Model Context Protocol server: an AI agent (Claude, Cursor, VS Code or any MCP client) can browse the catalog, get a quote, deploy and manage your GPU servers, within the limits you set.

Endpoint (Streamable HTTP, POST)

https://gpucloud.ca/api/mcp

Authentication: Authorization: Bearer followed by an MCP key (prefix gpc_mcp_). REST API keys are refused there.

Create an MCP key in the console

Client configuration

Claude Code

In a terminal

claude mcp add --transport http gpucloud https://gpucloud.ca/api/mcp --header "Authorization: Bearer gpc_mcp_YOUR_KEY"

Cursor

File ~/.cursor/mcp.json

{
  "mcpServers": {
    "gpucloud": {
      "url": "https://gpucloud.ca/api/mcp",
      "headers": {
        "Authorization": "Bearer gpc_mcp_YOUR_KEY"
      }
    }
  }
}

VS Code

File <project>/.vscode/mcp.json

{
  "servers": {
    "gpucloud": {
      "type": "http",
      "url": "https://gpucloud.ca/api/mcp",
      "headers": {
        "Authorization": "Bearer gpc_mcp_YOUR_KEY"
      }
    }
  }
}

Claude Desktop

File claude_desktop_config.json

{
  "mcpServers": {
    "gpucloud": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://gpucloud.ca/api/mcp",
        "--header",
        "Authorization: Bearer ${GPUCLOUD_KEY}"
      ],
      "env": {
        "GPUCLOUD_KEY": "gpc_mcp_YOUR_KEY"
      }
    }
  }
}

Streamable HTTP

Any MCP client that accepts a URL and headers

{
  "mcpServers": {
    "gpucloud": {
      "type": "streamable-http",
      "url": "https://gpucloud.ca/api/mcp",
      "headers": {
        "Authorization": "Bearer gpc_mcp_YOUR_KEY"
      }
    }
  }
}

Safety and spending

  • Each MCP key has its permissions: launch servers, delete, charge the saved card.
  • Caps per key: maximum hourly rate per server, total hourly cost, number of concurrent servers, monthly spend, maximum amount per charge and monthly total of charges.
  • Cap reached: new launches are refused, and if you chose so the servers created by the key are stopped.
  • Anything that costs money is two steps: a quote returns the price and a single use token valid 10 minutes, then the agent confirms after your approval.
  • Failed authentication attempts are rate limited per IP address.

Available tools

The MCP server exposes 55 tools, listed here from their definition.

Catalog and stock

  • gpucloud_list_products: List GPU products
  • gpucloud_get_product: Get a GPU product
  • gpucloud_get_stock: GPU stock
  • gpucloud_list_regions: List regions
  • gpucloud_list_images: List OS images
  • gpucloud_list_templates: List one-click templates

Servers

  • gpucloud_list_servers: List servers
  • gpucloud_get_server: Get a server
  • gpucloud_quote_server: Quote a server
  • gpucloud_create_server: Launch a server (spends money)
  • gpucloud_start_server: Start a server (spends money)
  • gpucloud_restore_server: Restore a hibernated server (spends money)
  • gpucloud_stop_server: Stop a server
  • gpucloud_reboot_server: Reboot a server
  • gpucloud_hibernate_server: Hibernate a server
  • gpucloud_delete_server: Delete a server (irreversible)
  • gpucloud_cancel_server: Cancel a server (irreversible)
  • gpucloud_renew_server: Renew a prepaid server (charges the card)
  • gpucloud_get_console_url: Open the web console
  • gpucloud_get_server_metrics: Server metrics
  • gpucloud_list_server_volumes: Server volumes
  • gpucloud_list_server_snapshots: Server snapshots
  • gpucloud_list_firewall_rules: Firewall rules
  • gpucloud_add_firewall_rule: Add a firewall rule
  • gpucloud_delete_firewall_rule: Delete a firewall rule
  • gpucloud_list_server_backups: Server backups
  • gpucloud_create_server_backup: Back up a server now
  • gpucloud_restore_server_backup: Restore a backup to a new server (spends money)
  • gpucloud_set_server_backup_policy: Backup option of a server

SSH keys

  • gpucloud_list_ssh_keys: List SSH keys
  • gpucloud_add_ssh_key: Add an SSH public key
  • gpucloud_generate_ssh_key: Generate an SSH key pair
  • gpucloud_delete_ssh_key: Delete an SSH key

Billing, budget and orders

  • gpucloud_get_server_usage: Server billing history
  • gpucloud_get_balance: Credit balance
  • gpucloud_list_transactions: Credit transactions
  • gpucloud_list_invoices: List invoices
  • gpucloud_get_invoice: Get an invoice
  • gpucloud_topup_credits: Buy credits (charges the card)
  • gpucloud_get_payment_method: Saved payment card
  • gpucloud_add_payment_method: Add a payment card (console link)
  • gpucloud_get_auto_reload: Auto-reload settings
  • gpucloud_set_auto_reload: Change auto-reload
  • gpucloud_list_orders: List orders
  • gpucloud_get_order: Get an order
  • gpucloud_quote_order: Quote an order
  • gpucloud_create_order: Place an order (charges the card)
  • gpucloud_get_budget: Account budget limit
  • gpucloud_set_budget: Set the account budget limit

Account and support

  • gpucloud_whoami: Who am I
  • gpucloud_get_profile: Get profile
  • gpucloud_update_profile: Update profile
  • gpucloud_list_tickets: List support tickets
  • gpucloud_create_ticket: Open a support ticket
  • gpucloud_reply_ticket: Reply to a support ticket

Discovery files