---
title: "Preview the whole-machine hourly price"
method: POST
path: "/v1/research-workspaces/quote"
tags: ["Research workspaces"]
---

# Preview the whole-machine hourly price

`POST /v1/research-workspaces/quote`

## Request

- Base URL: `/` (relative, and the document was published on a file host, not at the API’s origin)
- URL: `/v1/research-workspaces/quote`
- Auth: HTTP bearer

Read-only estimate for the supplied configuration, including CPU or GPU requirements and runtime storage. Send the same configuration used for workspace creation. For a saved workspace, include workspace_id to account for the additional disk needed to restore its files. A successful estimate does not reserve capacity, lock the price or start compute. Refresh expired estimates before starting. Launch checks price, capacity and account funding again.

## Query parameters

- `workspace_id` string

## Request body

- ResearchWorkspaceConfiguration
  - `kind` '' | 'workspace' | 'instance': Omission or an empty value preserves a saved workspace. instance creates standalone compute with SSH and local disk only. The kind cannot change after creation. An existing SSH workspace remains a workspace.
  - `name` string, required: Unique workspace name within the authenticated account. The names . and .. are not accepted.
  - `environment` 'pytorch-cuda' | 'pytorch-rocm' | 'pytorch-cpu' | 'custom-cuda' | 'custom-rocm' | 'custom-cpu', required: Qualified software environment for NVIDIA, AMD or CPU compute. Custom environments require a team-visible runtime_id.
  - `runtime_id` string: Optional immutable image identity from capabilities.runtimes. Selects the workspace Linux distribution and software. Must match environment and remain qualified and visible to the team. Omission preserves the existing managed environment. The selected runtime cannot be changed when editing a saved project.
  - `gpu` string, required: GPU model, not a supplier SKU. Use an empty string for CPU instances. Launch requires an exact qualified configuration and eligible capacity.
  - `gpu_count` 0 | 1 | 2 | 4 | 8, required: Exact GPU count on one machine. Use zero for CPU instances. These accepted request values do not establish hardware qualification or current availability.
  - `gpu_memory_gb` number, required: Minimum required memory per GPU in GB, not the sum across devices. Positive for GPU instances and zero for CPU instances.
  - `compute_class` 'accelerator' | 'vm': Omission retains GPU execution. vm requests a CPU-only workspace and requires capabilities.cpu_instances, a CPU environment, empty gpu, zero gpu_count and zero gpu_memory_gb.
  - `gpu_form_factor` '' | 'pcie' | 'sxm' | 'nvl': Optional required GPU form factor. Omission permits any form factor. Requires direct workspace compute and cannot be set for CPU instances. A selected form factor is enforced during quoting and placement.
  - `vcpus` integer: Minimum vCPUs on a GPU machine. Omission or zero keeps its included resources. CPU instances require exactly 2, 4, 8, 16 or 32 vCPUs.
  - `host_memory_gb` number: Minimum system RAM in GB, separate from GPU memory. Omission or zero keeps included RAM on GPU machines. CPU instances require a positive value. Custom RAM requires direct workspace compute.
  - `disk_gb` union: Runtime storage in decimal GB. Omission or zero preserves the existing 80 GB floor. Explicit sizes from 80 through 2048 are accepted. This is separate from the saved project capacity in size_gb. Restoring saved files can require additional allocation.
    - 0
    - integer
  - `size_gb` number: Instances require zero and have no saved project storage. For workspaces, omit to use the deployment capacity, or send a positive capacity within capabilities.storage_limit_bytes. With storage_policy_version included-10gb-v1 or r2-standard-10gb-account-v1, send exactly 10 for the 10,000,000,000-byte per-workspace capacity. The account policy shares its free allowance across workspaces. Other deployments use GiB and their displayed capacity limit.
  - `ssh_authorized_key` string: Plain SSH public keys, one per line, up to 20. Private keys, certificates and authorized_keys options are rejected. Machines also admit every SSH key saved by a team member. Instances and SSH-only workspaces on direct compute may omit this field. SSH is then unavailable until a key exists, and a running machine admits newly saved team keys within seconds. Deployments without direct compute still require it and return 400 invalid_ssh_authorized_key when it is missing.

## Response `200`

Current exact-configuration estimate

- WorkspacePricePreview: Read-only availability check with the public price-sheet reference when listed. Does not allocate compute, reserve capacity or lock a price. Actual compute expenditure is published as one final aggregate charge after the session.
  - `hourly_usd` number: Public price-sheet reference in USD per hour for the entire machine. Omitted when that configuration has no published rate. This is not the final compute charge. Do not multiply by gpu_count.
  - `public_price_available` boolean, required: Whether the public sheet lists an hourly rate for this configuration. A missing public rate does not block starting available compute.
  - `currency` 'USD', required
  - `gpu_count` 0 | 1 | 2 | 4 | 8, required
  - `observed_at` string, date-time, required
  - `expires_at` string, date-time, required: Refresh the estimate after this timestamp.
  - `estimate_only` true, required

## Other responses

- `503`: quote_unavailable when a current eligible price cannot be confirmed. No compute is allocated.
- `default`: 400 for invalid configuration. Authentication, rate limits and transient failures apply.

## Changes

- **2026-10-01** `ba84c74aeec8`: 5 breaking, 7 warning, 18 info
  - added `subschema #1` to the request body `allOf` list
  - added 'else' subschema to the request body
  - added 'if' subschema to the request body
  - added 'then' subschema to the request body
  - …26 more
- **2026-10-01** `544fef290a54`: 11 breaking, 10 warning, 9 info
  - added the new required request property `max_hours`
  - the request property `size_gb` became required
  - removed the enum value `0.00` of the request property `gpu_count`
  - removed the enum value `custom-cpu` of the request property `environment`
  - …26 more
- **2026-09-28** `128d6a9bda80`: 8 warning, 1 info
  - removed the request property `allOf[subschema #1]/then/editor`
  - removed the request property `allOf[subschema #1]/then/ref`
  - removed the request property `allOf[subschema #1]/then/repository`
  - removed the request property `budget_usd`
  - …5 more
- **2026-09-28** `21f923b806f1`: 3 breaking, 6 info
  - added the new required request property `allOf[subschema #1]/then/editor`
  - added the new required request property `max_hours`
  - the request property `size_gb` became required
  - added the new optional request property `allOf[subschema #1]/then/ref`
  - …5 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/nodus-compute/apis/nodus-infrastructure-execution-api/changes/v1/research-workspaces/quote/post.md)

---

[API](https://skmtc.dev/nodus-compute/apis/nodus-infrastructure-execution-api.md) - [All operations](https://skmtc.dev/nodus-compute/apis/nodus-infrastructure-execution-api/llms.txt) - [OpenAPI document](https://skmtc.dev/nodus-compute/apis/nodus-infrastructure-execution-api/revisions/a59210899d95?raw)
