API reference · Storage / Volumes
Volumes
Data disks: create, attach, detach, grow and delete.
A volume is a data disk, separate from an instance's root disk. Attach it to a running instance in the same zone, then format and mount it from the instance. Volumes only grow.
The volume object
Fields
idstringrequirede.g.
vol_....namestringrequiredIts name.
size_gbintegerrequiredIts size in GB.
disk_offering_slugstringrequiredSee
GET /public/v1/disk-offerings.storage_typestring or nullThe storage class, e.g.
shared; null when not stated.regionstring or nullzonestring or nullattached_instance_idstring or nullThe instance it is attached to; null when detached.
attached_instance_namestring or nullThat instance's name; null when detached.
desired_instance_idstring or nullWhere an attach in progress is moving it.
mount_pointstring or nullWhere it is mounted, when mounted at create; null otherwise.
source_snapshot_idstring or nullSet when restored from a snapshot.
monthly_costobject or nullWhat it costs per month at its size; null when it cannot be priced.
Show 2 child fieldsHide child fields
currencystringrequiredamount_minorintegerrequired
desired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.encryptionobjectWhat the platform can truthfully say about this volume's encryption.
statusisnonefor a plain volume,requestedwhen you asked for encryption at creation and the disk has not been formatted yet, andencryptedonce the platform has confirmed the disk was formatted with a key from the volume key service.encryptedis set only by the platform, never from a claim.Show 1 child fieldsHide child fields
statusstringrequiredOne of
none,requested,encrypted.
created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
List an instance's volumes
The volumes attached to this instance.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
instance_idstringrequiredThe resource's id.
Query parameters
limitintegerItems per page, 1 to 100. Defaults to 50.
From 1 to 100. Defaults to
50.cursorstringThe previous page's
next_cursor, to get the next page. Leave out for the first page; keep the other parameters the same.qstringOnly items whose name contains this text (case-insensitive), at most 255 characters.
At most 255 characters.
desired_statestringOnly items with this
desired_state:presentordeleted.One of
present,deleted.observed_statestringOnly items with this
observed_state.One of
pending,provisioning,active,deleting,deleted,failed,unknown.
Response 200
A page of volumes.dataarray of VolumerequiredShow 18 child fieldsHide child fields
idstringrequirede.g.
vol_....namestringrequiredIts name.
size_gbintegerrequiredIts size in GB.
disk_offering_slugstringrequiredSee
GET /public/v1/disk-offerings.storage_typestring or nullThe storage class, e.g.
shared; null when not stated.regionstring or nullzonestring or nullattached_instance_idstring or nullThe instance it is attached to; null when detached.
attached_instance_namestring or nullThat instance's name; null when detached.
desired_instance_idstring or nullWhere an attach in progress is moving it.
mount_pointstring or nullWhere it is mounted, when mounted at create; null otherwise.
source_snapshot_idstring or nullSet when restored from a snapshot.
monthly_costobject or nullWhat it costs per month at its size; null when it cannot be priced.
Show 2 child fieldsHide child fields
currencystringrequiredamount_minorintegerrequired
desired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.encryptionobjectWhat the platform can truthfully say about this volume's encryption.
statusisnonefor a plain volume,requestedwhen you asked for encryption at creation and the disk has not been formatted yet, andencryptedonce the platform has confirmed the disk was formatted with a key from the volume key service.encryptedis set only by the platform, never from a claim.Show 1 child fieldsHide child fields
statusstringrequiredOne of
none,requested,encrypted.
created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
next_cursorstring or nullrequiredPass as
cursorfor the next page; null on the last page.
Errors
- 400
INVALID_PAGE:limitis not a whole number from 1 to 100. Send a value in that range, or leave it out for 50.INVALID_CURSOR:cursordoes not belong to this list with these filters. Start again without a cursor.INVALID_FILTER:qis longer than 255 characters, ordesired_stateorobserved_stateis not one of its listed values. Fix the parameter named indetail. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no instance with this id in your organization, or the id is not a instance id (vm_…). Check the id. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/instances/vm_06gk3x9tq7m2v8r4y1c5d0zp8w/volumes" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"id": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "data",
"size_gb": 100,
"disk_offering_slug": "medium-20gb",
"storage_type": "shared",
"region": "af-abj",
"zone": "af-abj-1",
"attached_instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"attached_instance_name": "web-1",
"desired_instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"mount_point": "/data",
"source_snapshot_id": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
"monthly_cost": {
"currency": "NGN",
"amount_minor": 1059200
},
"desired_state": "present",
"observed_state": "active",
"encryption": {
"status": "none"
},
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}
],
"next_cursor": "eyJhdCI6IjIwMjYtMTAtMDNUMDk6MzA6MDBaIiwiaWQiOiJ2bV8wNmdrIn0"
}List volumes
Your volumes, newest first, with what each costs per month. Filter by name with q, or by state.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Query parameters
limitintegerItems per page, 1 to 100. Defaults to 50.
From 1 to 100. Defaults to
50.cursorstringThe previous page's
next_cursor, to get the next page. Leave out for the first page; keep the other parameters the same.qstringOnly items whose name contains this text (case-insensitive), at most 255 characters.
At most 255 characters.
desired_statestringOnly items with this
desired_state:presentordeleted.One of
present,deleted.observed_statestringOnly items with this
observed_state.One of
pending,provisioning,active,deleting,deleted,failed,unknown.
Response 200
A page of volumes.dataarray of VolumerequiredShow 18 child fieldsHide child fields
idstringrequirede.g.
vol_....namestringrequiredIts name.
size_gbintegerrequiredIts size in GB.
disk_offering_slugstringrequiredSee
GET /public/v1/disk-offerings.storage_typestring or nullThe storage class, e.g.
shared; null when not stated.regionstring or nullzonestring or nullattached_instance_idstring or nullThe instance it is attached to; null when detached.
attached_instance_namestring or nullThat instance's name; null when detached.
desired_instance_idstring or nullWhere an attach in progress is moving it.
mount_pointstring or nullWhere it is mounted, when mounted at create; null otherwise.
source_snapshot_idstring or nullSet when restored from a snapshot.
monthly_costobject or nullWhat it costs per month at its size; null when it cannot be priced.
Show 2 child fieldsHide child fields
currencystringrequiredamount_minorintegerrequired
desired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.encryptionobjectWhat the platform can truthfully say about this volume's encryption.
statusisnonefor a plain volume,requestedwhen you asked for encryption at creation and the disk has not been formatted yet, andencryptedonce the platform has confirmed the disk was formatted with a key from the volume key service.encryptedis set only by the platform, never from a claim.Show 1 child fieldsHide child fields
statusstringrequiredOne of
none,requested,encrypted.
created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
next_cursorstring or nullrequiredPass as
cursorfor the next page; null on the last page.
Errors
- 400
INVALID_PAGE:limitis not a whole number from 1 to 100. Send a value in that range, or leave it out for 50.INVALID_CURSOR:cursordoes not belong to this list with these filters. Start again without a cursor.INVALID_FILTER:qis longer than 255 characters, ordesired_stateorobserved_stateis not one of its listed values. Fix the parameter named indetail. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/volumes" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"id": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "data",
"size_gb": 100,
"disk_offering_slug": "medium-20gb",
"storage_type": "shared",
"region": "af-abj",
"zone": "af-abj-1",
"attached_instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"attached_instance_name": "web-1",
"desired_instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"mount_point": "/data",
"source_snapshot_id": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
"monthly_cost": {
"currency": "NGN",
"amount_minor": 1059200
},
"desired_state": "present",
"observed_state": "active",
"encryption": {
"status": "none"
},
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}
],
"next_cursor": "eyJhdCI6IjIwMjYtMTAtMDNUMDk6MzA6MDBaIiwiaWQiOiJ2bV8wNmdrIn0"
}Create a volume
Creates a data disk of disk_offering_slug (see GET /public/v1/disk-offerings; send size_gb for a custom-size offering). Send instance_id to attach it at once to a running instance in the same zone, and mount_point to have it mounted there.
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason. The volume's id is the operation's resource_id.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Body
application/jsonnamestringrequired1 to 255 characters.
At most 255 characters.
disk_offering_slugstringrequiredThe volume type, from
GET /public/v1/disk-offerings.size_gbintegerSize in GB. Required for an offering with
custom_size: true; ignored otherwise.regionstringA region from
GET /public/v1/regions. Defaults to the platform's region.instance_idstringAttach the new volume at once to this running instance in the same zone.
mount_pointstringWith
instance_id: an absolute path to mount the volume at, e.g./data.encryptedbooleanOptional.
trueasks for an encrypted data volume. It is a request, not encryption yet: the volume reportsencryption.statusrequesteduntil its disk has been formatted with a key from Pantech, andencryptedonly once the platform has confirmed that. The format happens inside the instance, by the Pantech volume agent (pantech-vkey): attach the volume to an instance that runs the agent and it formats the new, empty disk for you as soon as it appears, so you only create a filesystem on/dev/mapper/pvk-...and mount it. Creating or attaching alone encrypts nothing, an instance without the agent cannot encrypt it, and a disk that already holds data is never formatted. Its key is released only to the instance of your organization the volume is attached to, so the volume can be used with any instance that runs the agent, an encrypted VM or a plain one. Refused withENCRYPTION_NOT_SUPPORTEDwhen encrypted volumes are not enabled for your organization, andENCRYPTED_VOLUMES_UNAVAILABLEwhile the service is off.falseor omitted creates a plain volume, as before.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value.INVALID_REQUEST_BODY: the body is not a single valid JSON object. Send one JSON object with the fields documented for this endpoint. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 409
ACCOUNT_SUSPENDED: an invoice is overdue, or the organization was suspended for non-payment. Pay the outstanding invoice in the console, then retry.PROVIDER_ACCOUNT_NOT_READY: your organization's cloud account is still being set up, which takes a few minutes after sign-up. Retry shortly.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED: a field is invalid. Each entry oferrorsnames thefieldand itscode:nameordisk_offering_slugREQUIRED: send both.nameNAME_TOO_LONG: at most 255 characters.disk_offering_slugDISK_OFFERING_NOT_FOUND: no active disk offering has this slug. Pick one fromGET /public/v1/disk-offerings.size_gbSIZE_REQUIRED: a custom-size offering needssize_gb.instance_idINSTANCE_NOT_FOUND: not one of your instances.instance_idINSTANCE_NOT_RUNNING: the instance must be running to attach a volume at create. Start it, or attach the volume later.instance_idINSTANCE_WRONG_ZONE: the instance is in another zone than the volume.mount_pointINVALID_MOUNT_POINT: send an absolute path such as/data.regionREGION_NOT_AVAILABLE: pick a region fromGET /public/v1/regions.encryptedENCRYPTION_NOT_SUPPORTED: encrypted volumes are not enabled for your organization yet. Create a plain volume, or sendencryptedasfalse.UNKNOWN_FIELD: the body has a field this endpoint does not take (named infield). Remove it or fix its spelling. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.ENCRYPTED_VOLUMES_UNAVAILABLE: you asked for an encrypted volume but the encrypted volume service is not available right now. Retry later, or create a plain volume.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/volumes" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "data",
"disk_offering_slug": "medium-20gb",
"size_gb": 100,
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Get a volume
One volume, with where it is attached and what it costs.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
volume_idstringrequiredThe resource's id.
Response 200
The volume.idstringrequirede.g.
vol_....namestringrequiredIts name.
size_gbintegerrequiredIts size in GB.
disk_offering_slugstringrequiredSee
GET /public/v1/disk-offerings.storage_typestring or nullThe storage class, e.g.
shared; null when not stated.regionstring or nullzonestring or nullattached_instance_idstring or nullThe instance it is attached to; null when detached.
attached_instance_namestring or nullThat instance's name; null when detached.
desired_instance_idstring or nullWhere an attach in progress is moving it.
mount_pointstring or nullWhere it is mounted, when mounted at create; null otherwise.
source_snapshot_idstring or nullSet when restored from a snapshot.
monthly_costobject or nullWhat it costs per month at its size; null when it cannot be priced.
Show 2 child fieldsHide child fields
currencystringrequiredamount_minorintegerrequired
desired_statestringrequiredWhat you asked for:
present, ordeletedonce you deleted it.One of
present,deleted.observed_statestringrequiredWhat the platform last observed:
pendingandprovisioningwhile it is being created,activeonce ready,deleting/deletedon the way out,failedif it could not be made,unknownwhen it could not be checked.One of
pending,provisioning,active,deleting,deleted,failed,unknown.encryptionobjectWhat the platform can truthfully say about this volume's encryption.
statusisnonefor a plain volume,requestedwhen you asked for encryption at creation and the disk has not been formatted yet, andencryptedonce the platform has confirmed the disk was formatted with a key from the volume key service.encryptedis set only by the platform, never from a claim.Show 1 child fieldsHide child fields
statusstringrequiredOne of
none,requested,encrypted.
created_atstring or nullWhen it was created (RFC 3339, UTC).
updated_atstring or nullWhen it last changed (RFC 3339, UTC).
Errors
- 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no volume with this id in your organization, or the id is not a volume id (vol_…). Check the id. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/volumes/vol_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"id": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "data",
"size_gb": 100,
"disk_offering_slug": "medium-20gb",
"storage_type": "shared",
"region": "af-abj",
"zone": "af-abj-1",
"attached_instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"attached_instance_name": "web-1",
"desired_instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
"mount_point": "/data",
"source_snapshot_id": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
"monthly_cost": {
"currency": "NGN",
"amount_minor": 1059200
},
"desired_state": "present",
"observed_state": "active",
"encryption": {
"status": "none"
},
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}Delete a volume
Deletes a volume and its data. Detach it first. Its snapshots are kept and stay billed until you delete them.
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Scope: write. Destructive: an AI app's key also needs delete.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
volume_idstringrequiredThe resource's id.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no volume with this id in your organization, or the id is not a volume id (vol_…). Check the id. - 409
INVALID_RESOURCE_STATE: the volume is still attached, or is already being deleted. Detach it first.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 422
VALIDATION_FAILEDwith noerrorsentry: the platform refused a value, for example a malformed CIDR or a name longer than 255 characters. Check the request against this page. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X DELETE "https://api.pantechdynamics.com/public/v1/volumes/vol_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Attach a volume
Attaches a detached volume to a running instance in the same zone. Mount it inside the instance afterwards.
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
volume_idstringrequiredThe resource's id.
Body
application/jsoninstance_idstringrequiredA running instance in the volume's zone, e.g.
vm_….
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value.INVALID_REQUEST_BODY: the body is not a single valid JSON object. Send one JSON object with the fields documented for this endpoint. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no volume with this id in your organization, or the id is not a volume id (vol_…). Check the id. - 409
INVALID_RESOURCE_STATE: the volume is already attached or changing, or the instance is not running. Detach it first, or start the instance.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED: a field is invalid. Each entry oferrorsnames thefieldand itscode:instance_idREQUIREDorINSTANCE_NOT_FOUND: send one of your instances.instance_idINSTANCE_NOT_RUNNING: the instance must be running.instance_idINSTANCE_WRONG_ZONE: the instance is in another zone than the volume. Volumes attach only within their zone.UNKNOWN_FIELD: the body has a field this endpoint does not take (named infield). Remove it or fix its spelling. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/volumes/vol_06gk3x9tq7m2v8r4y1c5d0zp8w/attach" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"instance_id": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Detach a volume
Detaches a volume from its instance. Unmount it inside the instance first, or data being written may be lost.
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
volume_idstringrequiredThe resource's id.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no volume with this id in your organization, or the id is not a volume id (vol_…). Check the id. - 409
INVALID_RESOURCE_STATE: the volume is not attached, or is changing. Wait for its current operation to finish.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 422
VALIDATION_FAILEDwith noerrorsentry: the platform refused the request, for example because the resource has already been deleted. Read the resource to check its state. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/volumes/vol_06gk3x9tq7m2v8r4y1c5d0zp8w/detach" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Grow a volume
Grows a volume to a bigger offering, or to a bigger size_gb of a custom-size offering. Volumes only grow. Extend the file system from inside the instance afterwards. No upfront charge: the larger size is billed hourly.
Returns 202 Accepted with an operation_id (also in the Location header). The change happens in the background: poll GET /public/v1/operations/{operation_id}, or stream /events, until status is succeeded or failed; a failed operation carries a stable failure.code and a readable failure.reason.
Send an Idempotency-Key. A retry with the same key returns the original operation instead of making the change twice.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….Idempotency-KeystringrequiredA new value, such as a UUID, for each change. Resend with the same value to retry safely.
At most 255 characters.
Path parameters
volume_idstringrequiredThe resource's id.
Body
application/jsondisk_offering_slugstringrequiredThe volume type after the resize, from
GET /public/v1/disk-offerings.size_gbintegerThe new size in GB, for a custom-size offering: larger than the current size. Volumes only grow.
Response 202
Accepted. Followoperation_id until it finishes.operation_idstringrequiredThe operation carrying out the change. Poll
GET /public/v1/operations/{operation_id}(also theLocationheader) untilstatusissucceededorfailed.resource_idstringrequiredThe resource being created or changed, e.g. the new snapshot's id for a snapshot create.
statusstringrequiredThe operation's status when the request was accepted, usually
submitting. Followoperation_idfor the outcome.
Errors
- 400
IDEMPOTENCY_KEY_REQUIRED: theIdempotency-Keyheader is missing. Send a new unique value, such as a UUID, with every write.INVALID_IDEMPOTENCY_KEY: theIdempotency-Keyheader is longer than 255 characters. Use a shorter value.INVALID_REQUEST_BODY: the body is not a single valid JSON object. Send one JSON object with the fields documented for this endpoint. - 401
UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. SendAuthorization: Bearer PAN_…with a valid key; create one in the console under Organization › API keys. - 403
INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (readfor GET,writefor changes; an AI app's key also needsdeletefor a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access.FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin.AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps. - 404
RESOURCE_NOT_FOUND: no volume with this id in your organization, or the id is not a volume id (vol_…). Check the id. - 409
ACCOUNT_SUSPENDED: an invoice is overdue, or the organization was suspended for non-payment. Pay the outstanding invoice in the console, then retry.INVALID_RESOURCE_STATE: the new size is not larger than the current one, or the volume is changing. Send a larger size, or wait.CONCURRENT_UPDATE: the resource changed while this request was being processed. Retry the request; if it repeats, read the resource first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED: a field is invalid. Each entry oferrorsnames thefieldand itscode:disk_offering_slugREQUIREDorDISK_OFFERING_NOT_FOUND: send an active offering's slug.size_gbSIZE_REQUIRED: a custom-size offering needssize_gb.UNKNOWN_FIELD: the body has a field this endpoint does not take (named infield). Remove it or fix its spelling. - 429
RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. WaitRetry-Afterseconds, then retry. For authenticated quota denials,RateLimit-Scopeidentifies the denying quota andRateLimit-Resetreports its remaining window in seconds. - 503
SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.PROVISIONING_UNAVAILABLE: the provisioning service is temporarily unavailable. Wait a few seconds, then retry with the sameIdempotency-Key.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/volumes/vol_06gk3x9tq7m2v8r4y1c5d0zp8w/resize" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"disk_offering_slug": "medium-20gb",
"size_gb": 20
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}