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
Create an account
Sign up online. Add credit when you are ready to deploy.
Create an account2
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 key3
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/mcpAuthentication: Authorization: Bearer followed by an MCP key (prefix gpc_mcp_). REST API keys are refused there.
Create an MCP key in the consoleClient 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 productsgpucloud_get_product: Get a GPU productgpucloud_get_stock: GPU stockgpucloud_list_regions: List regionsgpucloud_list_images: List OS imagesgpucloud_list_templates: List one-click templates
Servers
gpucloud_list_servers: List serversgpucloud_get_server: Get a servergpucloud_quote_server: Quote a servergpucloud_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 servergpucloud_reboot_server: Reboot a servergpucloud_hibernate_server: Hibernate a servergpucloud_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 consolegpucloud_get_server_metrics: Server metricsgpucloud_list_server_volumes: Server volumesgpucloud_list_server_snapshots: Server snapshotsgpucloud_list_firewall_rules: Firewall rulesgpucloud_add_firewall_rule: Add a firewall rulegpucloud_delete_firewall_rule: Delete a firewall rulegpucloud_list_server_backups: Server backupsgpucloud_create_server_backup: Back up a server nowgpucloud_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 keysgpucloud_add_ssh_key: Add an SSH public keygpucloud_generate_ssh_key: Generate an SSH key pairgpucloud_delete_ssh_key: Delete an SSH key
Billing, budget and orders
gpucloud_get_server_usage: Server billing historygpucloud_get_balance: Credit balancegpucloud_list_transactions: Credit transactionsgpucloud_list_invoices: List invoicesgpucloud_get_invoice: Get an invoicegpucloud_topup_credits: Buy credits (charges the card)gpucloud_get_payment_method: Saved payment cardgpucloud_add_payment_method: Add a payment card (console link)gpucloud_get_auto_reload: Auto-reload settingsgpucloud_set_auto_reload: Change auto-reloadgpucloud_list_orders: List ordersgpucloud_get_order: Get an ordergpucloud_quote_order: Quote an ordergpucloud_create_order: Place an order (charges the card)gpucloud_get_budget: Account budget limitgpucloud_set_budget: Set the account budget limit
Account and support
gpucloud_whoami: Who am Igpucloud_get_profile: Get profilegpucloud_update_profile: Update profilegpucloud_list_tickets: List support ticketsgpucloud_create_ticket: Open a support ticketgpucloud_reply_ticket: Reply to a support ticket
Discovery files
- https://gpucloud.ca/api/v1/openapi.json: OpenAPI 3 spec of the REST API
- https://gpucloud.ca/.well-known/mcp.json: MCP server metadata
- https://gpucloud.ca/llms.txt: Site summary for language models
- https://gpucloud.ca/api/v1/availability: Public availability as JSON