---
title: "Find cheaper volumes"
method: POST
path: "/v1/recommendations/disks"
tags: ["recommendations"]
---

# Find cheaper volumes

`POST /v1/recommendations/disks`

## Request

- Base URL: `https://pricing.baselinehq.cloud`
- URL: `https://pricing.baselinehq.cloud/v1/recommendations/disks`
- Auth: one of:
  - API key in header `X-API-Key`
  - API key in header `Authorization`
- TypeScript: <https://skmtc.dev/baselinehq/apis/costgraph-pricing-api/docs/v1/recommendations/disks/post.ts> (a function with typed inputs; its response is checked against the schema)

Return the cheapest volume per provider that still meets the requested capacity and performance, with the saving against the volume you asked about.

## Request body

- DiskRecommendationRequest
  - `include_metadata` boolean
  - `instance` TypesDisk
    - `availability_zone` string
    - `capacity_gb` number
    - `fallback_to_base_pricing` boolean
    - `id` string
    - `iops` number
    - `provider` 'GCP' | 'AWS' | 'DigitalOcean' | 'Azure' | 'Hetzner' | 'OVHCloud' | 'PlanetScale' | 'STACKIT' | 'Linode' | 'Base' | 'Akash' | 'Alibaba' | 'Baseten' | 'Beam' | 'Cerebrium' | 'CIRunners' | 'Civo' | 'Clore' | 'CoreWeave' | 'Crusoe' | 'CUDO' | 'DataCrunch' | 'DeepInfra' | 'Denvr' | 'E2ENetworks' | 'Exoscale' | 'Fal' | 'HotAisle' | 'Hyperbolic' | 'Hyperstack' | 'IBM' | 'Lambda' | 'Latitude' | 'MassedCompute' | 'Modal' | 'Nebius' | 'Novita' | 'Oblivus' | 'OCI' | 'OpenTelekom' | 'PrimeIntellect' | 'Replicate' | 'RunPod' | 'Salad' | 'Scaleway' | 'Sesterce' | 'Shadeform' | 'ThunderCompute' | 'UpCloud' | 'Vast' | 'Vultr'
    - `region` string
    - `service` 'ComputeEngine' | 'AmazonEC2' | 'Droplet' | 'AzureCompute' | 'AzureManagedDisks' | 'HetznerCompute' | 'OVHPublicCloud' | 'BaseCompute' | 'BaseDisks' | 'AmazonEBS' | 'AmazonRDS' | 'AuroraDSQL' | 'CloudSQL' | 'AlloyDB' | 'CloudSpanner' | 'AzureDatabaseForPostgreSQL' | 'AzureDatabaseForMySQL' | 'AzureSQLDatabase' | 'AzureSQLManagedInstance' | 'PlanetScale' | 'ComputeEnginePersistentDisk' | 'STACKITCompute' | 'STACKITBlockStorage' | 'STACKITDatabase' | 'AkamaiLinode' | 'AkamaiBlockStorage' | 'AkamaiDatabase' | 'AkashCompute' | 'AlibabaCompute' | 'AlibabaBlockStorage' | 'BasetenCompute' | 'BeamCompute' | 'CerebriumCompute' | 'CivoCompute' | 'CivoBlockStorage' | 'CloreCompute' | 'CoreWeaveCompute' | 'CrusoeCompute' | 'CUDOCompute' | 'DataCrunchCompute' | 'DeepInfraCompute' | 'DenvrCompute' | 'E2ENetworksCompute' | 'ExoscaleCompute' | 'ExoscaleBlockStorage' | 'FalCompute' | 'HotAisleCompute' | 'HyperbolicCompute' | 'HyperstackCompute' | 'IBMCompute' | 'IBMBlockStorage' | 'LambdaCompute' | 'LatitudeCompute' | 'MassedComputeCompute' | 'ModalCompute' | 'NebiusCompute' | 'NovitaCompute' | 'OblivusCompute' | 'OCICompute' | 'OCIBlockStorage' | 'OpenTelekomCompute' | 'PrimeIntellectCompute' | 'ReplicateCompute' | 'RunPodCompute' | 'SaladCompute' | 'ScalewayCompute' | 'ScalewayBlockStorage' | 'SesterceCompute' | 'ShadeformCompute' | 'ThunderComputeCompute' | 'UpCloudCompute' | 'UpCloudBlockStorage' | 'VastCompute' | 'VultrCompute' | 'VultrBlockStorage'
    - `throughput_mbps` number
    - `type` string
    - `usage_type` 'SPOT_PREEMPTIBLE' | 'ONDEMAND' | 'RESERVED' | 'ONDEMAND_CUSTOM' | 'SPOT_PREEMPTIBLE_CUSTOM' | 'RESERVED_CUSTOM' | 'SOLE_TENANCY' | 'CUSTOM' | 'EXTENDED'
  - `predicates` TypesPredicates
    - `availability_zones` string[]
    - `disk_types` string[]
    - `instance_types` string[]
    - `operating_systems` string[]
    - `providers` string[]
    - `regions` string[]
    - `services` string[]
    - `usage_types` string[]
  - `usage` TypesDisk
    - `availability_zone` string
    - `capacity_gb` number
    - `fallback_to_base_pricing` boolean
    - `id` string
    - `iops` number
    - `provider` 'GCP' | 'AWS' | 'DigitalOcean' | 'Azure' | 'Hetzner' | 'OVHCloud' | 'PlanetScale' | 'STACKIT' | 'Linode' | 'Base' | 'Akash' | 'Alibaba' | 'Baseten' | 'Beam' | 'Cerebrium' | 'CIRunners' | 'Civo' | 'Clore' | 'CoreWeave' | 'Crusoe' | 'CUDO' | 'DataCrunch' | 'DeepInfra' | 'Denvr' | 'E2ENetworks' | 'Exoscale' | 'Fal' | 'HotAisle' | 'Hyperbolic' | 'Hyperstack' | 'IBM' | 'Lambda' | 'Latitude' | 'MassedCompute' | 'Modal' | 'Nebius' | 'Novita' | 'Oblivus' | 'OCI' | 'OpenTelekom' | 'PrimeIntellect' | 'Replicate' | 'RunPod' | 'Salad' | 'Scaleway' | 'Sesterce' | 'Shadeform' | 'ThunderCompute' | 'UpCloud' | 'Vast' | 'Vultr'
    - `region` string
    - `service` 'ComputeEngine' | 'AmazonEC2' | 'Droplet' | 'AzureCompute' | 'AzureManagedDisks' | 'HetznerCompute' | 'OVHPublicCloud' | 'BaseCompute' | 'BaseDisks' | 'AmazonEBS' | 'AmazonRDS' | 'AuroraDSQL' | 'CloudSQL' | 'AlloyDB' | 'CloudSpanner' | 'AzureDatabaseForPostgreSQL' | 'AzureDatabaseForMySQL' | 'AzureSQLDatabase' | 'AzureSQLManagedInstance' | 'PlanetScale' | 'ComputeEnginePersistentDisk' | 'STACKITCompute' | 'STACKITBlockStorage' | 'STACKITDatabase' | 'AkamaiLinode' | 'AkamaiBlockStorage' | 'AkamaiDatabase' | 'AkashCompute' | 'AlibabaCompute' | 'AlibabaBlockStorage' | 'BasetenCompute' | 'BeamCompute' | 'CerebriumCompute' | 'CivoCompute' | 'CivoBlockStorage' | 'CloreCompute' | 'CoreWeaveCompute' | 'CrusoeCompute' | 'CUDOCompute' | 'DataCrunchCompute' | 'DeepInfraCompute' | 'DenvrCompute' | 'E2ENetworksCompute' | 'ExoscaleCompute' | 'ExoscaleBlockStorage' | 'FalCompute' | 'HotAisleCompute' | 'HyperbolicCompute' | 'HyperstackCompute' | 'IBMCompute' | 'IBMBlockStorage' | 'LambdaCompute' | 'LatitudeCompute' | 'MassedComputeCompute' | 'ModalCompute' | 'NebiusCompute' | 'NovitaCompute' | 'OblivusCompute' | 'OCICompute' | 'OCIBlockStorage' | 'OpenTelekomCompute' | 'PrimeIntellectCompute' | 'ReplicateCompute' | 'RunPodCompute' | 'SaladCompute' | 'ScalewayCompute' | 'ScalewayBlockStorage' | 'SesterceCompute' | 'ShadeformCompute' | 'ThunderComputeCompute' | 'UpCloudCompute' | 'UpCloudBlockStorage' | 'VastCompute' | 'VultrCompute' | 'VultrBlockStorage'
    - `throughput_mbps` number
    - `type` string
    - `usage_type` 'SPOT_PREEMPTIBLE' | 'ONDEMAND' | 'RESERVED' | 'ONDEMAND_CUSTOM' | 'SPOT_PREEMPTIBLE_CUSTOM' | 'RESERVED_CUSTOM' | 'SOLE_TENANCY' | 'CUSTOM' | 'EXTENDED'
  - `workload_class` string: WorkloadClass selects which accelerator gates a compute recommendation applies: inference_single, inference_multi or training_distributed. Empty means inference_multi, which is what the recommender did before the classes existed. Disk requests do not carry one.

## Response `200`

The cheapest candidate per provider

- DiskRecommendation[]
  - `pricing` DiskPrice
    - `availability_zone` string
    - `cost_per_gb_hour` number
    - `cost_per_iops_hour` number
    - `cost_per_throughput_mbps_hour` number
    - `created_at` string
    - `currency` string: Currency the provider published this price in. Cost columns are always normalized USD.
    - `id` string
    - `max_capacity_gb` number: Provisioning upper bound the disk type supports at this price (validation range), not an actual disk size.
    - `max_iops` number
    - `max_throughput_mbps` number
    - `min_capacity_gb` number: Provisioning lower bound the disk type supports at this price (validation range), not an actual disk size.
    - `min_iops` number
    - `min_throughput_mbps` number
    - `native_cost_per_gb_hour` number
    - `native_cost_per_iops_hour` number
    - `native_cost_per_throughput_mbps_hour` number
    - `period_billing_hours` number
    - `provider` string
    - `raw_pricing_data` object
    - `region` string
    - `service` string
    - `tags` object
    - `type` string
    - `updated_at` string
    - `usage_type` string
  - `savings` TypesSavings
    - `amount_per_hour` number
    - `amount_per_month` number
    - `amount_per_year` number
    - `percentage` number

## Other responses

- `400`: Invalid request body
- `401`: Unauthenticated
- `404`: No candidate matches the volume
- `422`: Validation failed
- `500`: Internal server error

## Changes

- **2026-10-05** `506d14bb78ca`: 2 info
  - added the new `CIRunners` enum value to the request property `instance/provider`
  - added the new `CIRunners` enum value to the request property `usage/provider`
- **2026-10-05** `a60168add03d`: 5 info
  - added the optional property `affected` to the response with the `400` status
  - added the optional property `affected` to the response with the `401` status
  - added the optional property `affected` to the response with the `404` status
  - added the optional property `affected` to the response with the `422` status
  - …1 more
- **2026-10-05** `baaed9359752`: 2 breaking, 2 info
  - removed the enum value `Akamai` of the request property `instance/provider`
  - removed the enum value `Akamai` of the request property `usage/provider`
  - added the new `Linode` enum value to the request property `instance/provider`
  - added the new `Linode` enum value to the request property `usage/provider`
- **2026-10-04** `73c38af41209`: 32 info
  - added the new `Alibaba` enum value to the request property `instance/provider`
  - added the new `Alibaba` enum value to the request property `usage/provider`
  - added the new `AlibabaBlockStorage` enum value to the request property `instance/service`
  - added the new `AlibabaBlockStorage` enum value to the request property `usage/service`
  - …28 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/baselinehq/apis/costgraph-pricing-api/changes/v1/recommendations/disks/post.md)

---

[API](https://skmtc.dev/baselinehq/apis/costgraph-pricing-api.md) - [All operations](https://skmtc.dev/baselinehq/apis/costgraph-pricing-api/llms.txt) - [OpenAPI document](https://skmtc.dev/baselinehq/apis/costgraph-pricing-api/revisions/506d14bb78ca?raw)
