Console

Preview — pending review

This reference is generated from the platform API contract and is still under review. Operations, fields, and descriptions can change before publication.

Which block-storage tiers a region offers, and what each costs

GET
/regions/{region}/volume-types

Answers, for the selected platform region, which volume TYPES (the contract VolumeType tiers) a new volume may be created on, and the published per-GB-month price of each. Every create form that lets the customer pick a tier — the standalone volume create and the data disks of the instance wizard — offers only the tiers this read marks available, and prices the estimate from pricePerGbMonthMinor. A tier is available IFF the region's storage/volumes module is available AND either the tier is the default tier (Standard SSD, which lands on the region's default Cinder type) OR the deployment maps the tier to a Cinder volume type that discovery found — and that is public — in THIS region. A tier the region cannot provision is never offered: offering it would sell a tier the customer does not get. pricePerGbMonthMinor is the price the RATER resolves for the tier's rate-card SKU (storage.volume.<tier-slug>) — the SAME number usage metering bills the volume at — in TEN-THOUSANDTHS of currency. Null (with currency null) when nothing would be charged for that tier. With scopeId the quote is THAT subscription's own price: its tenant rate-card override or negotiated contract line, exactly as its usage is billed — but only when the caller may read the subscription's billing (the gate of GET /scopes/{scopeId}/billing/contracts: subscription-level billing READ plus the billing:read token scope). Anyone else — a plain project reader — gets the list price, never a 403, so the create screens keep working. Without scopeId the quote is the list price (region rate, else the global finance rate). Returns an entry for EVERY tier of VolumeType, always. WHAT THIS DELIBERATELY DOES NOT RETURN: no Cinder volume-type name, no backend, no provider or OpenStack region identity. available is NOT a reservation: the create paths enforce the same rule authoritatively (404 NOT_FOUND for a tier the region does not offer). Validation: region must resolve to a region bound to an ENABLED provider, else 404. scopeId, when given, must resolve to a scope the caller can reach, else 404. Async & state: Synchronous read; no state change. Errors: 401 unauthenticated; 404 region unknown, unbound, or its provider disabled (one answer for all three), or scopeId unknown/unreachable; 500 read-model failure. Idempotency/Concurrency: Safe. Sent Cache-Control: no-store — it is a gate and a price, both of which an operator can change at any moment.

Authorization

bearerToken
headerAuthorizationBearer <token>

An API token (pc_live_…) or a service-account key (sak_live_…), created in Identity & Access Management and sent as Authorization: Bearer <token>. Requests are rate limited per credential and per tenant: every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and a refused request gets 429 RATE_LIMITED with Retry-After.

Path Parameters

region*string

The platform region code whose volume tiers are being read.

Match^[a-z][a-z0-9-]{1,39}$

Query Parameters

scopeId?string

The caller's project scope. When given, tier prices are quoted at that subscription's own negotiated price (override / contract line) instead of the list price, for a caller allowed to see it.

Response Body

One availability + price entry per volume tier for the resolved region.

application/json
  1. response

Per-tier availability and price for one region. volumeTypes carries an entry for EVERY VolumeType tier, never a partial list.

region*RegionId

Platform region code (a DNS-label-shaped slug, e.g. ist-1). No longer a closed enum: the set of valid region codes is operator-managed in the platform-region registry, so this carries only a shape guard. The authoritative set of activated regions is read from GET /regions; invalid-shape codes are VALIDATION_FAILED and codes absent from the registry are rejected at the resolving endpoint.

Match^[a-z][a-z0-9-]{1,39}$
volumeTypes*array<>
curl -X GET "https://example.com/regions/string/volume-types"
{  "region": "string",  "volumeTypes": [    {      "type": "Standard SSD",      "available": true,      "encryptionSupported": true,      "pricePerGbMonthMinor": 0,      "currency": "string"    }  ]}