GPU Cloud GPU Plans API
The GPU Plans API from GPU Cloud — 3 operation(s) for gpu plans.
The GPU Plans API from GPU Cloud — 3 operation(s) for gpu plans.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/gpucloud-ca:gpucloud-ca-gpu-plans-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: GPU Cloud GPU Plans API
description: 'REST API of GPUcloud.ca: GPU plans, GPU servers (deploy, power actions, metrics, firewall), SSH keys and API keys. All prices are in CAD. Authenticate with a REST API key: `Authorization: Bearer `. AI agents should use the MCP endpoint (https://gpucloud.ca/api/mcp) with an MCP key instead. REST keys (prefix gpu_) are created in the console, expire after 90 days and are either full access or read-only (GET only; a read-only key gets 401 on any other method). Write requests (POST, PUT, DELETE) must also send the header `Origin: https://gpucloud.ca`, otherwise they get 403. Developer guide: https://gpucloud.ca/en/developers'
version: 1.1.1
contact:
name: GPU Cloud Support
url: https://gpucloud.ca
email: info@gpucloud.ca
servers:
- url: https://gpucloud.ca/api
description: Production
security: []
tags:
- name: GPU Plans
paths:
/v1/gpu:
get:
summary: List GPU Plans
description: Returns every GPU machine size with the prices of the authenticated account (CAD per machine) and its current availability. Requires an API key. For anonymous availability, use GET /v1/availability.
operationId: listGpuPlans
tags:
- GPU Plans
responses:
'200':
description: List of GPU plans
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/GpuPlan'
example:
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.55
monthly: 1131.5
annual: 1131.5
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: 3.08
monthly: 2248.4
annual: 2248.4
currency: CAD
priceOnRequest: false
available: true
purchasable: true
autoProvisioning: true
eligibility: deployable
- id: gpu-l40-spot
name: NVIDIA L40 Spot (interruptible)
gpu: 1x NVIDIA L40 (48 GB GDDR6)
gpuModel: NVIDIA L40
gpuCount: 1
spot: true
hourlyOnly: true
specs:
vcores: 28
ram: 58
storage: 100
localStorage: 725
storageType: NVMe
pricing:
hourly: 1.24
monthly: null
annual: null
currency: CAD
priceOnRequest: false
available: true
purchasable: true
autoProvisioning: true
eligibility: deployable
- id: gpu-h200-sxm-x8
name: NVIDIA H200 SXM × 8
gpu: 8x NVIDIA H200 SXM (141 GB HBM3e)
gpuModel: NVIDIA H200 SXM
gpuCount: 8
spot: false
hourlyOnly: false
specs:
vcores: 176
ram: 1800
storage: 100
localStorage: 48000
storageType: NVMe
pricing:
hourly: 55.68
monthly: 40646.4
annual: 40646.4
currency: CAD
priceOnRequest: false
available: false
purchasable: true
autoProvisioning: true
eligibility: out_of_stock
- id: gpu-b200-x8
name: NVIDIA B200 × 8
gpu: 8x NVIDIA B200 (180 GB HBM3e)
gpuModel: NVIDIA B200
gpuCount: 8
spot: false
hourlyOnly: true
specs:
vcores: 252
ram: 2048
storage: 1000
localStorage: 40000
storageType: NVMe
pricing:
hourly: 83.73
monthly: null
annual: null
currency: CAD
priceOnRequest: false
available: false
purchasable: true
autoProvisioning: true
eligibility: out_of_stock
- id: gpu-h100-nvlink-spot-x8
name: NVIDIA H100 NVLink Spot × 8 (interruptible)
gpu: 8x NVIDIA H100 NVLink (80 GB HBM2e)
gpuModel: NVIDIA H100 NVLink
gpuCount: 8
spot: true
hourlyOnly: true
specs:
vcores: 252
ram: 1440
storage: 100
localStorage: 6500
storageType: NVMe
pricing: null
priceOnRequest: true
available: false
purchasable: false
autoProvisioning: false
eligibility: contact
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
security:
- BearerAuth: []
/v1/availability:
get:
summary: Public GPU availability
description: 'PUBLIC, no authentication. Aggregated availability per GPU model and machine size (available true / false), refreshed at most every 15 seconds (Cache-Control: max-age=15). Rate limited to 60 requests per minute per IP. No prices: see /v1/gpu or https://gpucloud.ca/llms.txt.'
operationId: getPublicAvailability
tags:
- GPU Plans
security: []
responses:
'200':
description: Availability per model and size
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/PublicAvailability'
example:
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: false
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
/v1/catalog:
get:
summary: Public GPU price catalog
description: 'PUBLIC, no authentication, read-only. Every GPU machine sold online at a public price, in the versioned price feed schema (same data as https://gpucloud.ca/feeds/gpu-prices.json, the CSV and RSS feeds and https://gpucloud.ca/llms.txt): prices in CAD, taxes extra, dated by catalogDate. `available` and `availabilityUpdatedAt` are present only when read from a fresh stock snapshot (less than 2 minutes old), otherwise omitted. Cached 15 seconds (Cache-Control: max-age=15). Rate limited to 60 requests per minute per IP (429 with Retry-After). CORS open for GET.'
operationId: getPublicPriceCatalog
tags:
- GPU Plans
security: []
responses:
'200':
description: Price catalog
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/PriceFeed'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
components:
schemas:
PriceFeed:
type: object
required:
- schemaVersion
- catalogDate
- currency
- region
- taxesIncluded
- items
- onRequest
properties:
schemaVersion:
type: string
description: Version of this schema (changes when a field changes).
catalogDate:
type: string
format: date
description: 'Date of the catalog data: the prices are valid from this date.'
currency:
type: string
enum:
- CAD
region:
type: string
description: Public region (canada-montreal, Montreal, Canada).
taxesIncluded:
type: boolean
enum:
- false
items:
type: array
items:
type: object
required:
- id
- model
- gpuCount
- vramGb
- vcpu
- ramGb
- diskGb
- localDiskGb
- hourlyCad
- monthlyCad
- hourlyCadPerGpu
- hourlyCadPerVramGb
- pageUrl
properties:
id:
type: string
description: Catalog product id (on-demand machine).
model:
type: string
description: GPU model, e.g. NVIDIA H100 PCIe.
gpuCount:
type: integer
vramGb:
type:
- number
- 'null'
description: GPU memory of one GPU, GB.
vcpu:
type: integer
ramGb:
type: integer
diskGb:
type: integer
description: System disk, GB.
localDiskGb:
type: integer
description: Local work disk, GB (0 when none).
hourlyCad:
type: number
description: Whole machine, CAD per hour, no commitment.
monthlyCad:
type:
- number
- 'null'
description: Whole machine, CAD per month, monthly term; null when the machine is sold by the hour only (schema 1.1).
hourlyCadPerGpu:
type: number
description: hourlyCad / gpuCount, 4 decimals.
hourlyCadPerVramGb:
type:
- number
- 'null'
description: hourlyCad / (gpuCount x vramGb), 5 decimals.
spotHourlyCad:
type: number
description: Spot machine of the same model and size (interruptible, hourly only), when sold online.
pageUrl:
type: string
format: uri
available:
type: boolean
description: Only when read from a fresh stock snapshot.
onRequest:
type: array
items:
type: string
description: GPU models sold on request only (no public price).
availabilityUpdatedAt:
type: string
format: date-time
description: Only with `available` on the items.
GpuPlan:
type: object
properties:
id:
type: string
example: gpu-l40-x2
name:
type: string
example: NVIDIA L40 × 2
gpu:
type: string
example: 2x NVIDIA L40 (48 GB GDDR6)
gpuModel:
type: string
example: NVIDIA L40
gpuCount:
type: integer
description: GPUs of the server (1, 2, 4 or 8)
example: 2
spot:
type: boolean
description: 'Spot server: interruptible without notice, hourly billing only'
hourlyOnly:
type: boolean
description: True when only hourly billing is offered (monthly and annual are refused with CYCLE_NOT_AVAILABLE)
specs:
type: object
properties:
vcores:
type: integer
example: 60
ram:
type: integer
description: RAM in GB
example: 116
storage:
type: integer
description: System disk in GB
example: 100
storageType:
type: string
example: NVMe
localStorage:
type: integer
description: Local (ephemeral) work disk in GB, 0 when none
example: 1550
pricing:
type:
- object
- 'null'
description: 'Prices billed to the caller, per server (all its GPUs). null when priceOnRequest is true: the plan has no public price and is not sold online (contact us for a quote).'
properties:
hourly:
type: number
description: On-demand hourly rate in CAD
example: 3.08
monthly:
type:
- number
- 'null'
description: 'Monthly committed rate in CAD (null: hourly only)'
example: 2248.4
annual:
type:
- number
- 'null'
description: 'Annual committed monthly rate in CAD (null: hourly only)'
example: 2248.4
currency:
type: string
example: CAD
priceOnRequest:
type: boolean
description: True when the plan is sold on request only (no public price, pricing is null, never purchasable online)
available:
type: boolean
description: Whether this server size is currently in stock
purchasable:
type: boolean
description: Whether this GPU plan can be purchased (may be false if plan is visible but not yet offered)
autoProvisioning:
type: boolean
description: Whether this GPU can be auto-deployed via API
eligibility:
type: string
enum:
- deployable
- contact
- out_of_stock
- disabled
description: Plan deployment eligibility status
AccountAction:
type: object
description: What to do to fix an account or payment problem, with the direct absolute link. Same object on every route and in the MCP tool errors (structuredContent.error.accountAction). The message is in French when Accept-Language asks for it, otherwise in English.
properties:
code:
type: string
enum:
- NO_API_KEY
- INVALID_API_KEY
- PAYMENT_REQUIRED
- BUDGET_CAP_REACHED
description: Stable machine code. NO_API_KEY and INVALID_API_KEY come with HTTP 401, PAYMENT_REQUIRED and BUDGET_CAP_REACHED with HTTP 402.
message:
type: string
description: Clear sentence telling what to do, including the link.
action:
type: object
properties:
label:
type: string
url:
type: string
format: uri
required:
- label
- url
links:
type: object
description: 'Absolute links: account creation, sign in, API keys page, billing, add credits (opens the credit window), payment card, budget or cap setting, documentation.'
properties:
signup:
type: string
format: uri
login:
type: string
format: uri
apiKeys:
type: string
format: uri
billing:
type: string
format: uri
addCredits:
type: string
format: uri
paymentMethod:
type: string
format: uri
budget:
type: string
format: uri
documentation:
type: string
format: uri
required:
- signup
- login
- apiKeys
- billing
- addCredits
- paymentMethod
- budget
- documentation
minimumCad:
type: number
description: 'PAYMENT_REQUIRED only, when known: credits (CAD) covering one hour of the GPU asked for, computed by the server from the same price as the deployment.'
minimumTopupCad:
type: number
description: Smallest credit purchase accepted (CAD), given with minimumCad.
balanceCad:
type: number
description: 'PAYMENT_REQUIRED and BUDGET_CAP_REACHED, when known: the account''s credit balance (CAD) when the request was refused.'
hibernationThresholdCad:
type: number
description: 'PAYMENT_REQUIRED, when a server is concerned: its hibernation threshold (CAD), the larger of 3 CAD and 2 hours of its hourly rate. A running hourly server is hibernated when the balance reaches its threshold (after the automatic reload was tried); it restarts automatically as soon as the balance is above the threshold. A server is never deleted while the account has credit left. When the balance covers only about 24 hours of what the account spends per hour, a first notice is sent while the servers still run, then two more about 24 hours and 1 hour before the deletion; a server is deleted with its data only once it is out of service (stopped or hibernated for lack of credit, or hibernated by the user for at least 72 hours), once the credit is exhausted (the balance no longer pays the next hour of the account''s servers), after the three notices and at least 24 hours after the first. Adding credits cancels the deletion. For the restart of such a server, minimumCad is the balance that restarts it (threshold + 0.01).'
capCad:
type: number
description: 'BUDGET_CAP_REACHED of an MCP key, for a money cap: the cap reached (CAD). The cap set by the customer is always respected: nothing is charged or reloaded beyond it.'
capRemainingCad:
type: number
description: 'BUDGET_CAP_REACHED of an MCP key, with capCad: what is left of that cap (CAD).'
required:
- code
- message
- action
- links
PublicAvailability:
type: object
description: 'Aggregated availability of the GPU catalog: per GPU model and machine size, only whether it can be deployed online right now.'
properties:
region:
type: string
example: canada-montreal
updatedAt:
type: string
format: date-time
models:
type: array
items:
type: object
properties:
slug:
type: string
description: 'Model page: https://gpucloud.ca/{fr|en}/gpu/{slug}'
example: h100
name:
type: string
example: NVIDIA H100 PCIe
sizes:
type: array
items:
type: object
properties:
id:
type: string
description: Catalog product id (as in /v1/gpu and POST /servers).
example: gpu-h100-x2
gpuCount:
type: integer
example: 2
spot:
type: boolean
description: Interruptible machine, hourly billing only.
available:
type: boolean
description: Deployable online right now.
priceOnRequest:
type: boolean
description: Sold on request only (never deployable online).
required:
- id
- gpuCount
- spot
- available
- priceOnRequest
required:
- slug
- name
- sizes
required:
- region
- updatedAt
- models
AccountActionError:
type: object
description: 'Error of an account or payment problem. Backward compatible: `error` keeps its previous string value (for example "Unauthorized" or "INSUFFICIENT_CREDITS"), `message` and the existing details stay; `accountAction` is added.'
properties:
error:
type: string
description: Previous error string or code, unchanged (backward compatibility).
message:
type: string
requiredCredits:
type: number
description: 'INSUFFICIENT_CREDITS: credits (CAD) the action needs.'
currentBalance:
type: number
accountAction:
$ref: '#/components/schemas/AccountAction'
required:
- error
- accountAction
Error:
type: object
properties:
error:
type: string
required:
- error
responses:
TooManyRequests:
description: Rate limit exceeded
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: Too many requests
Unauthorized:
description: 'No API key (accountAction.code NO_API_KEY) or an invalid, expired, revoked or read only key on a write (INVALID_API_KEY). Provide a valid API key as `Authorization: Bearer <key>`; accountAction gives the links to create an account and a key.'
headers:
WWW-Authenticate:
schema:
type: string
description: Bearer realm="gpucloud" (error="invalid_token" when a key was sent).
content:
application/json:
schema:
$ref: '#/components/schemas/AccountActionError'
examples:
noKey:
summary: No key sent
value:
error: Unauthorized. Use Bearer API key.
message: 'No API key was sent. Create a GPU Cloud account (https://gpucloud.ca/en/auth/register), then an API key in the console (https://gpucloud.ca/en/console/settings#api-keys), and send it in the header Authorization: Bearer gpu_...'
accountAction:
code: NO_API_KEY
message: 'No API key was sent. Create a GPU Cloud account (https://gpucloud.ca/en/auth/register), then an API key in the console (https://gpucloud.ca/en/console/settings#api-keys), and send it in the header Authorization: Bearer gpu_...'
action:
label: Create an account
url: https://gpucloud.ca/en/auth/register
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?addCredits=25#payment-method
budget: https://gpucloud.ca/en/console/billing#budget-limit
documentation: https://gpucloud.ca/en/developers#errors
invalidKey:
summary: Invalid, expired or revoked key
value:
error: Unauthorized
message: 'This API key is invalid, expired, revoked or lacks the required permission. Create a new API key in the console (https://gpucloud.ca/en/console/settings#api-keys) and send it in the header Authorization: Bearer gpu_... No account yet: https://gpucloud.ca/en/auth/register'
accountAction:
code: INVALID_API_KEY
message: 'This API key is invalid, expired, revoked or lacks the required permission. Create a new API key in the console (https://gpucloud.ca/en/console/settings#api-keys) and send it in the header Authorization: Bearer gpu_... No account yet: https://gpucloud.ca/en/auth/register'
action:
label: Create an API key
url: https://gpucloud.ca/en/console/settings#api-keys
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?addCredits=25#payment-method
budget: https://gpucloud.ca/en/console/billing#budget-limit
documentation: https://gpucloud.ca/en/developers#errors
InternalError:
description: Internal server error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: Internal server error
securitySchemes:
BearerAuth:
type: http
scheme: bearer
description: 'REST API key (prefix gpu_) created in the GPU Cloud console (Settings). Pass it as `Authorization: Bearer <your-api-key>`. Keys expire after 90 days; a read-only key may only call GET. Write requests (POST, PUT, DELETE) must also send `Origin: https://gpucloud.ca`.'