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.
Clone a volume
Creates a full, independent copy of the block volume volumeId in the active scope —
triggered by the "Clone" action in the volume detail header. The clone inherits the source's
size, type, encryption posture (including the KMS key) and content as of the point the clone
is taken; its provenance records the source volume. The new volume appears in the scoped
list in state CREATING and is billed at the same per-GB rate as the source type.
Validation: volumeId must reference an existing volume in the scope (unknown → 404
NOT_FOUND); the current state must permit cloning — CREATING or ERROR source volumes
cannot be cloned (→ 409 CONFLICT); the optional name must be unique within the resource
group when supplied (duplicate → 409 CONFLICT) and defaults to <source-name>-clone; the
subscription's block-storage quota must cover the clone size (→ 409 QUOTA_EXCEEDED); caller
needs owner|admin|contributor (→ 403 FORBIDDEN).
Async & state: Asynchronous — returns 202 with an Operation tracking the copy. The new
volume starts in CREATING and terminates in AVAILABLE (detached) or ERROR. Progress is
emitted as resource.updated SSE frames for the new volume (kind storage.volume, patch
{status, updatedAt}) followed by a terminal operation.completed frame carrying the new
volume id.
Errors: 401 unauthenticated; 403 caller lacks permission on the scope; 404 unknown
scopeId/volumeId; 409 CONFLICT source state does not permit clone or duplicate name;
409 QUOTA_EXCEEDED block-storage quota exhausted; 422 invalid override fields; 500
unexpected backend failure.
Idempotency/Concurrency: Idempotency-Key is required; replaying the same key returns
the original 202 Operation without creating a second clone.
bearerTokenAuthorizationBearer <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.
scopeId*stringOpaque ownership+authorization scope resolving to tenant + subscription + project.
volumeId*stringIdentifier of the source block volume.
Idempotency-Key*stringRequired: this operation creates a new resource asynchronously, so a retry without the key would create a second one. Same key+body within 24h replays the original result; the same key with a different body is 409 CONFLICT. Keys are unique per tenant (the same key in two tenants is two different requests). An API token or service-account (bearer) caller MUST send it -- a request without it is refused with 400 IDEMPOTENCY_KEY_REQUIRED (ErrIdempotencyKeyRequired); reuse the same key on every retry of one logical request. A console session gets one from the edge.
uuidapplication/json- body
Optional overrides when cloning a volume.
name?|Name for the clone; defaults to "-clone". Must be unique within the project.
availabilityZone?|Zone to place the clone in; defaults to the source volume's zone.
type?|Volume type for the clone; defaults to the source volume's type. A clone keeps its source's type (Cinder cannot clone across types): a DIFFERENT type is refused 422 VALIDATION_FAILED (field type) — retype the clone afterwards instead.
sizeGb?|Provisioned size of the clone in GB; defaults to the source volume's size. Must be at least the source's size (a smaller value is refused 422, field sizeGb); a larger value creates a larger clone.
1 <= value <= 16384Clone accepted; returns the tracking Operation (the result carries the new volume id).
application/json- response
A long-running operation record. GET /operations/{operationId} returns its current state.
id*stringOperation identifier, unique platform-wide.
action*stringCanonical action id that started this operation, e.g. compute.instance.create.
state*OperationStateState machine for long-running operations. PENDING and RUNNING are transitional; the rest are terminal.
"PENDING""RUNNING""SUCCEEDED""FAILED""CANCELLED"resourceKind?|Kind of the target resource (matches RealtimeEvent.kind), null for resource-less actions.
resourceId?|Identifier of the target resource; null until the resource is allocated.
resourceName?|Human-readable name of the target resource captured when the operation was opened; null when unknown or the resource has been deleted (clients fall back to resourceId).
principalId?|Subject id (user id/email or service-account id) of the actor that initiated this operation, captured at the create chokepoint; null on internal/worker paths with no request-scoped principal or for historical rows. This is the real actor the Activity feed renders.
sourceIp?|Source IP address of the request that initiated this operation; null when unavailable (internal/worker paths, historical rows).
progressPercent?|Best-effort progress; null when the action does not report progress.
0 <= value <= 100error?|nullPopulated only when state is FAILED (or CANCELLED with partial rollback notes).
warning?|nullNon-fatal degradation recorded on an operation that still SUCCEEDED - the primary action completed but something explicitly requested could not be delivered (e.g. publicIp was requested at instance create but no floating IP could be assigned). On a CANCELLED create it reports that the provider resource had already been created and was kept (live and billed until deleted; details.disposition = left_in_place). Same code+message shape as error so clients render both uniformly; null when the operation ran without degradation.
startedAt?|When the worker began executing; null while PENDING.
finishedAt?|When a terminal state was reached; null while transitional.
createdAt*stringupdatedAt*stringcurl -X POST "https://example.com/scopes/string/storage/volumes/string/actions/clone" \ -H "Idempotency-Key: 497f6eca-6276-4993-bfeb-53cbbbba6f08" \ -H "Content-Type: application/json" \ -d '{}'{ "id": "string", "action": "string", "state": "PENDING", "resourceKind": "string", "resourceId": "string", "resourceName": "string", "principalId": "string", "sourceIp": "string", "progressPercent": 0, "error": { "code": "string", "message": "string", "field": "string", "details": {}, "retryable": false }, "warning": { "code": "string", "message": "string", "field": "string", "details": {}, "retryable": false }, "startedAt": "string", "finishedAt": "string", "createdAt": "string", "updatedAt": "string"}