API reference · Kubernetes / Kubernetes
Kubernetes
Managed Kubernetes clusters whose nodes are VMs in your account: create, scale, upgrade, stop, start and delete them, and download a kubeconfig.
A cluster's nodes, control and worker, are VMs of one node_plan in your account, each billed as a VM of that plan; there is no separate control-plane fee. Pick a version from GET /kubernetes-versions in the zone you want. In a VPC zone the nodes go in a subnet; in a standard zone leave subnet_id out. control_nodes is 1, or 3 where the version list's ha_zone_ids offers it.
Every change returns an operation to follow. Scale to 1 to 10 workers with PATCH, and upgrade one step at a time to one of the cluster's available_upgrades; upgrades never happen on their own and never go down. Download the kubeconfig once the cluster is running: it is a POST that needs a write key, because it grants cluster-admin. A 503 KUBERNETES_UNAVAILABLE means managed Kubernetes is not open on the platform yet. See the Kubernetes guide.
The Kubernetes cluster object
Fields
idstringrequirede.g.
k8s_....namestringrequiredzone_idstringrequiredkubernetes_version_idstringrequiredkubernetes_versionstringrequirednetwork_idstring or nullrequiredThe private network (VPC) the nodes are in; null in a standard zone.
subnet_idstring or nullrequirednode_plan_idstringrequirednodeKubernetesNoderequiredShow 3 child fieldsHide child fields
vcpuintegerrequiredmemory_mbintegerrequireddisk_gbintegerrequired
control_nodesintegerrequiredworkersintegerrequirednodesintegerrequiredcontrol_nodes plus workers: the VMs billed.
desired_statestringrequiredOne of
running,stopped,deleted.observed_statestringrequiredupdatingwhile a scale or upgrade runs.One of
pending,provisioning,running,updating,stopping,stopped,retired,deleted,failed,unknown.in_syncbooleanrequiredFalse while a scale or upgrade has not finished.
failure_codestring or nullrequiredfailure_reasonstring or nullrequiredavailable_upgradesarray of KubernetesVersionrequiredVersions this cluster can be upgraded to now.
Show 6 child fieldsHide child fields
idstringrequirede.g.
k8sv_....zone_idstringrequiredversionstringrequiredstatusstringrequiredwithdrawnversions take no new clusters.One of
available,withdrawn.min_cpuintegerrequiredThe fewest vCPUs a node plan needs for this version.
min_memory_mbintegerrequiredThe least memory, in MB, a node plan needs for this version.
autoscalingKubernetesAutoscalingrequiredThe platform's autoscaler: about once a minute it adds a worker when a pod that a worker could run is waiting for room, and removes the newest worker once it has run nothing but DaemonSet pods for 10 minutes, one step at a time and always within min_workers and max_workers. You pay for the workers that run.
Show 3 child fieldsHide child fields
enabledbooleanrequiredThe cluster autoscaler adds and removes workers within the range as pods need them.
min_workersintegerrequired1 to 10 when enabled; 0 when not.
max_workersintegerrequiredmin_workers to 10 when enabled; 0 when not. Billing and your account limits are checked for the maximum.
api_allowed_cidrsarray of stringrequiredSources allowed to reach the API server; empty is any address.
endpointstring or nullrequiredThe API server's URL, once the cluster has one: the public address when the endpoint is public or dual and one is routed, else the private one.
public_ipstring or nullThe public address the API server is reachable on; null until one is routed, and for a private endpoint.
public_portinteger or nullThe public port the API server is reachable on; null until one is routed, and for a private endpoint.
volume_storage_gbintegerrequiredStorage your workloads' persistent volume claims use, billed with the nodes' disks.
kindstringrequiredCluster architecture kind, e.g.
appliance.cni_pluginstringrequiredCNI backend plugin (
flannel,wireguard, orcalico).pod_cidrstringrequiredIPv4 CIDR range allocated for cluster pods.
service_cidrstringrequiredIPv4 CIDR range allocated for cluster services.
endpoint_accessstringrequiredAPI server endpoint network access mode (
public,private, ordual).One of
public,private,dual.created_atstring or nullrequiredupdated_atstring or nullrequired
The Kubernetes version object
Fields
idstringrequirede.g.
k8sv_....zone_idstringrequiredversionstringrequiredstatusstringrequiredwithdrawnversions take no new clusters.One of
available,withdrawn.min_cpuintegerrequiredThe fewest vCPUs a node plan needs for this version.
min_memory_mbintegerrequiredThe least memory, in MB, a node plan needs for this version.
List Kubernetes versions
The Kubernetes versions you can create clusters with, newest first, each in one zone. ha_zone_ids are the zones where a highly available control plane (3 control nodes) can be created now. A version is withdrawn from new clusters before its upstream end of life; clusters already on it keep running it.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Query parameters
zone_idstringOnly versions in this zone.
Response 200
The versions.dataarray of KubernetesVersionrequiredShow 6 child fieldsHide child fields
idstringrequirede.g.
k8sv_....zone_idstringrequiredversionstringrequiredstatusstringrequiredwithdrawnversions take no new clusters.One of
available,withdrawn.min_cpuintegerrequiredThe fewest vCPUs a node plan needs for this version.
min_memory_mbintegerrequiredThe least memory, in MB, a node plan needs for this version.
ha_zone_idsarray of stringrequiredZones where a cluster can have 3 control nodes.
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. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/kubernetes-versions" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"id": "k8sv_06gk3x9tq7m2v8r4y1c5d0zp8w",
"zone_id": "af-abj-2",
"version": "1.31.2",
"status": "available",
"min_cpu": 2,
"min_memory_mb": 2048
}
],
"ha_zone_ids": [
"af-abj-2"
]
}List Kubernetes clusters
Your Kubernetes clusters, newest first. Deleted and failed clusters are left out.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Response 200
The clusters.dataarray of KubernetesClusterrequiredShow 31 child fieldsHide child fields
idstringrequirede.g.
k8s_....namestringrequiredzone_idstringrequiredkubernetes_version_idstringrequiredkubernetes_versionstringrequirednetwork_idstring or nullrequiredThe private network (VPC) the nodes are in; null in a standard zone.
subnet_idstring or nullrequirednode_plan_idstringrequirednodeKubernetesNoderequiredShow 3 child fieldsHide child fields
vcpuintegerrequiredmemory_mbintegerrequireddisk_gbintegerrequired
control_nodesintegerrequiredworkersintegerrequirednodesintegerrequiredcontrol_nodes plus workers: the VMs billed.
desired_statestringrequiredOne of
running,stopped,deleted.observed_statestringrequiredupdatingwhile a scale or upgrade runs.One of
pending,provisioning,running,updating,stopping,stopped,retired,deleted,failed,unknown.in_syncbooleanrequiredFalse while a scale or upgrade has not finished.
failure_codestring or nullrequiredfailure_reasonstring or nullrequiredavailable_upgradesarray of KubernetesVersionrequiredVersions this cluster can be upgraded to now.
Show 6 child fieldsHide child fields
idstringrequirede.g.
k8sv_....zone_idstringrequiredversionstringrequiredstatusstringrequiredwithdrawnversions take no new clusters.One of
available,withdrawn.min_cpuintegerrequiredThe fewest vCPUs a node plan needs for this version.
min_memory_mbintegerrequiredThe least memory, in MB, a node plan needs for this version.
autoscalingKubernetesAutoscalingrequiredThe platform's autoscaler: about once a minute it adds a worker when a pod that a worker could run is waiting for room, and removes the newest worker once it has run nothing but DaemonSet pods for 10 minutes, one step at a time and always within min_workers and max_workers. You pay for the workers that run.
Show 3 child fieldsHide child fields
enabledbooleanrequiredThe cluster autoscaler adds and removes workers within the range as pods need them.
min_workersintegerrequired1 to 10 when enabled; 0 when not.
max_workersintegerrequiredmin_workers to 10 when enabled; 0 when not. Billing and your account limits are checked for the maximum.
api_allowed_cidrsarray of stringrequiredSources allowed to reach the API server; empty is any address.
endpointstring or nullrequiredThe API server's URL, once the cluster has one: the public address when the endpoint is public or dual and one is routed, else the private one.
public_ipstring or nullThe public address the API server is reachable on; null until one is routed, and for a private endpoint.
public_portinteger or nullThe public port the API server is reachable on; null until one is routed, and for a private endpoint.
volume_storage_gbintegerrequiredStorage your workloads' persistent volume claims use, billed with the nodes' disks.
kindstringrequiredCluster architecture kind, e.g.
appliance.cni_pluginstringrequiredCNI backend plugin (
flannel,wireguard, orcalico).pod_cidrstringrequiredIPv4 CIDR range allocated for cluster pods.
service_cidrstringrequiredIPv4 CIDR range allocated for cluster services.
endpoint_accessstringrequiredAPI server endpoint network access mode (
public,private, ordual).One of
public,private,dual.created_atstring or nullrequiredupdated_atstring or nullrequired
next_cursorstring or nullrequiredAlways null: this list is returned whole.
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. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/kubernetes-clusters" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "prod-web",
"zone_id": "af-abj-2",
"kubernetes_version_id": "k8sv_06gk3x9tq7m2v8r4y1c5d0zp8w",
"kubernetes_version": "1.31.2",
"network_id": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
"subnet_id": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
"node_plan_id": "plan_06gk3x9tq7m2v8r4y1c5d0zp8w",
"node": {
"vcpu": 2,
"memory_mb": 4096,
"disk_gb": 80
},
"control_nodes": 1,
"workers": 2,
"nodes": 3,
"desired_state": "running",
"observed_state": "running",
"in_sync": true,
"failure_code": null,
"failure_reason": null,
"available_upgrades": [
{
"id": "k8sv_07hm4y0ur8n3w9s5z2d6e1aq9x",
"zone_id": "af-abj-2",
"version": "1.32.0",
"status": "available",
"min_cpu": 2,
"min_memory_mb": 2048
}
],
"autoscaling": {
"enabled": true,
"min_workers": 2,
"max_workers": 5
},
"api_allowed_cidrs": [
"api-allowed-cidrs"
],
"endpoint": "endpoint",
"public_ip": "203.0.113.20",
"public_port": 6443,
"volume_storage_gb": 1,
"kind": "appliance",
"cni_plugin": "flannel",
"pod_cidr": "10.42.0.0/16",
"service_cidr": "10.43.0.0/16",
"endpoint_access": "public",
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}
],
"next_cursor": null
}Create a Kubernetes cluster
Creates a managed Kubernetes cluster. Every node, control and worker, is a VM of node_plan in your account and is billed as one; there is no separate control-plane fee. In a VPC zone the nodes go in subnet_id; in a standard zone leave subnet_id out. control_nodes is 1, or 3 where the zone offers a highly available control plane (see ha_zone_ids on the versions list). Persistent volumes work out of the box. Download the kubeconfig once the cluster is running.
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. The cluster's id is the operation's resource_id.
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 40 lowercase letters, digits and hyphens, starting with a letter.
zone_idstringrequiredkubernetes_version_idstringrequiredFrom the Kubernetes versions list, in
zone_id.subnet_idstringRequired in a VPC zone: the subnet the nodes go in. Leave out in a standard zone.
node_planstringrequiredThe plan slug every node uses, from the plans list. In a zone where every node has one fixed size (af-abj-2: 2 vCPU, 4 GB), the plan must be that size:
422 KUBERNETES_PLAN_NOT_IN_ZONEonnode_plan.control_nodesinteger1, or 3 for a highly available control plane where the zone offers it.
One of
1,3. Defaults to1.workersintegerWorker nodes, 1 to 10. Required unless
autoscalingis enabled, when it defaults tomin_workersand must lie within the range.From 1 to 10.
autoscalingKubernetesAutoscalingThe platform's autoscaler: about once a minute it adds a worker when a pod that a worker could run is waiting for room, and removes the newest worker once it has run nothing but DaemonSet pods for 10 minutes, one step at a time and always within min_workers and max_workers. You pay for the workers that run.
Show 3 child fieldsHide child fields
enabledbooleanrequiredThe cluster autoscaler adds and removes workers within the range as pods need them.
min_workersintegerrequired1 to 10 when enabled; 0 when not.
max_workersintegerrequiredmin_workers to 10 when enabled; 0 when not. Billing and your account limits are checked for the maximum.
api_allowed_cidrsarray of stringVPC zone only: the IPv4 CIDRs allowed to reach the API server (at most 20). Leave out for any address.
kindstringCluster architecture. Only
appliance(the default) is offered: nodes are VMs in your account running k3s. Any other value is422 INVALID_KUBERNETES_KIND.One of
appliance.cni_pluginstringCNI backend plugin (
flannel,wireguard, orcalico). Defaults toflannel.pod_cidrstringIPv4 CIDR range allocated for cluster pods. Defaults to
10.42.0.0/16.service_cidrstringIPv4 CIDR range allocated for cluster services. Defaults to
10.43.0.0/16.endpoint_accessstringWho can reach the API server.
private(the default) is reachable only from inside the VPC.publicanddualgive the API server a public address of its own, billed as a VPC public IP for every hour it is held.One of
private,public,dual. Defaults toprivate.
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. - 402
INSUFFICIENT_CREDIT: your credit does not cover the first payment for every node. Top up or add a card, then try again. - 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
KUBERNETES_CLUSTER_NAME_TAKEN: you already have a cluster with this name.KUBERNETES_CLUSTER_LIMIT: your organization has reached its cluster limit. Delete a cluster, or contact support to raise it.CONCURRENT_UPDATE: the cluster changed while this request was being processed. Retry the request; if it repeats, read the cluster 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:name,zone_id,kubernetes_version_id,node_planorworkersREQUIRED: send them.nameINVALID_KUBERNETES_CLUSTER_NAME: 1 to 40 lowercase letters, digits and hyphens, starting with a letter.zone_idINVALID_KUBERNETES_ZONE: a zone your organization can use.kubernetes_version_idINVALID_KUBERNETES_VERSION: a version offered in this zone.node_planINVALID_KUBERNETES_NODE_PLAN: an active plan with at least the version's minimum vCPU and memory.workersINVALID_KUBERNETES_WORKER_COUNT: 1 to 10.control_nodesINVALID_KUBERNETES_CONTROL_NODESorKUBERNETES_HA_NOT_AVAILABLE: 1, or 3 where offered.autoscalingINVALID_KUBERNETES_AUTOSCALING: min_workers and max_workers 1 to 10, min no more than max, and workers within them.api_allowed_cidrsINVALID_API_ALLOWED_CIDRS(at most 20 IPv4 CIDRs) orAPI_ALLOWED_CIDRS_VPC_ONLY.subnet_idKUBERNETES_SUBNET_REQUIRED,KUBERNETES_SUBNET_NOT_ALLOWEDorKUBERNETES_SUBNET_NOT_FOUND: an active subnet in a VPC zone, and none in a standard zone.UNKNOWN_FIELD: the body has a field this endpoint does not take (named infield). - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.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/kubernetes-clusters" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "prod-web",
"zone_id": "af-abj-2",
"kubernetes_version_id": "k8sv_06gk3x9tq7m2v8r4y1c5d0zp8w",
"subnet_id": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
"node_plan": "s-2vcpu-4gb",
"control_nodes": 1
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Get a Kubernetes cluster
One cluster. in_sync is false while a change you made has not reached it yet; available_upgrades lists the versions it can move to now.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
cluster_idstringrequiredThe cluster's id (
k8s_…).
Response 200
The cluster.idstringrequirede.g.
k8s_....namestringrequiredzone_idstringrequiredkubernetes_version_idstringrequiredkubernetes_versionstringrequirednetwork_idstring or nullrequiredThe private network (VPC) the nodes are in; null in a standard zone.
subnet_idstring or nullrequirednode_plan_idstringrequirednodeKubernetesNoderequiredShow 3 child fieldsHide child fields
vcpuintegerrequiredmemory_mbintegerrequireddisk_gbintegerrequired
control_nodesintegerrequiredworkersintegerrequirednodesintegerrequiredcontrol_nodes plus workers: the VMs billed.
desired_statestringrequiredOne of
running,stopped,deleted.observed_statestringrequiredupdatingwhile a scale or upgrade runs.One of
pending,provisioning,running,updating,stopping,stopped,retired,deleted,failed,unknown.in_syncbooleanrequiredFalse while a scale or upgrade has not finished.
failure_codestring or nullrequiredfailure_reasonstring or nullrequiredavailable_upgradesarray of KubernetesVersionrequiredVersions this cluster can be upgraded to now.
Show 6 child fieldsHide child fields
idstringrequirede.g.
k8sv_....zone_idstringrequiredversionstringrequiredstatusstringrequiredwithdrawnversions take no new clusters.One of
available,withdrawn.min_cpuintegerrequiredThe fewest vCPUs a node plan needs for this version.
min_memory_mbintegerrequiredThe least memory, in MB, a node plan needs for this version.
autoscalingKubernetesAutoscalingrequiredThe platform's autoscaler: about once a minute it adds a worker when a pod that a worker could run is waiting for room, and removes the newest worker once it has run nothing but DaemonSet pods for 10 minutes, one step at a time and always within min_workers and max_workers. You pay for the workers that run.
Show 3 child fieldsHide child fields
enabledbooleanrequiredThe cluster autoscaler adds and removes workers within the range as pods need them.
min_workersintegerrequired1 to 10 when enabled; 0 when not.
max_workersintegerrequiredmin_workers to 10 when enabled; 0 when not. Billing and your account limits are checked for the maximum.
api_allowed_cidrsarray of stringrequiredSources allowed to reach the API server; empty is any address.
endpointstring or nullrequiredThe API server's URL, once the cluster has one: the public address when the endpoint is public or dual and one is routed, else the private one.
public_ipstring or nullThe public address the API server is reachable on; null until one is routed, and for a private endpoint.
public_portinteger or nullThe public port the API server is reachable on; null until one is routed, and for a private endpoint.
volume_storage_gbintegerrequiredStorage your workloads' persistent volume claims use, billed with the nodes' disks.
kindstringrequiredCluster architecture kind, e.g.
appliance.cni_pluginstringrequiredCNI backend plugin (
flannel,wireguard, orcalico).pod_cidrstringrequiredIPv4 CIDR range allocated for cluster pods.
service_cidrstringrequiredIPv4 CIDR range allocated for cluster services.
endpoint_accessstringrequiredAPI server endpoint network access mode (
public,private, ordual).One of
public,private,dual.created_atstring or nullrequiredupdated_atstring or nullrequired
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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "prod-web",
"zone_id": "af-abj-2",
"kubernetes_version_id": "k8sv_06gk3x9tq7m2v8r4y1c5d0zp8w",
"kubernetes_version": "1.31.2",
"network_id": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
"subnet_id": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
"node_plan_id": "plan_06gk3x9tq7m2v8r4y1c5d0zp8w",
"node": {
"vcpu": 2,
"memory_mb": 4096,
"disk_gb": 80
},
"control_nodes": 1,
"workers": 2,
"nodes": 3,
"desired_state": "running",
"observed_state": "running",
"in_sync": true,
"failure_code": null,
"failure_reason": null,
"available_upgrades": [
{
"id": "k8sv_07hm4y0ur8n3w9s5z2d6e1aq9x",
"zone_id": "af-abj-2",
"version": "1.32.0",
"status": "available",
"min_cpu": 2,
"min_memory_mb": 2048
}
],
"autoscaling": {
"enabled": true,
"min_workers": 2,
"max_workers": 5
},
"api_allowed_cidrs": [
"api-allowed-cidrs"
],
"endpoint": "endpoint",
"public_ip": "203.0.113.20",
"public_port": 6443,
"volume_storage_gb": 1,
"kind": "appliance",
"cni_plugin": "flannel",
"pod_cidr": "10.42.0.0/16",
"service_cidr": "10.43.0.0/16",
"endpoint_access": "public",
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}Change a Kubernetes cluster
Sets a fixed number of worker nodes (1 to 10), turns the cluster autoscaler on or off and sets its range, or replaces the list of addresses allowed to reach the API server (VPC zone). Send any of them; the rest stay as they are. The cluster must be running. The operation finishes once every added worker has joined the cluster and is ready. Added workers, and an autoscaler maximum above today's count, are checked against your credit and account limits; workers are billed as VMs of the node plan while they run. A change that changes nothing returns an empty operation_id.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
Body
application/jsonworkersintegerA fixed worker count, 1 to 10. Not with autoscaling enabled: the autoscaler sets it.
From 1 to 10.
autoscalingKubernetesAutoscalingThe platform's autoscaler: about once a minute it adds a worker when a pod that a worker could run is waiting for room, and removes the newest worker once it has run nothing but DaemonSet pods for 10 minutes, one step at a time and always within min_workers and max_workers. You pay for the workers that run.
Show 3 child fieldsHide child fields
enabledbooleanrequiredThe cluster autoscaler adds and removes workers within the range as pods need them.
min_workersintegerrequired1 to 10 when enabled; 0 when not.
max_workersintegerrequiredmin_workers to 10 when enabled; 0 when not. Billing and your account limits are checked for the maximum.
api_allowed_cidrsarray of stringVPC zone only: the whole new list of IPv4 CIDRs allowed to reach the API server. Send
[]to allow any address.
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. - 402
INSUFFICIENT_CREDIT: your credit does not cover the added nodes. - 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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 409
KUBERNETES_CLUSTER_NOT_RUNNING: start the cluster first.KUBERNETES_CLUSTER_BUSY: the cluster is already changing. Wait until it is running or stopped.KUBERNETES_CLUSTER_NOT_CHANGEABLE: the cluster cannot make this change now (stopped, being deleted, or failed).CONCURRENT_UPDATE: the cluster changed while this request was being processed. Retry the request; if it repeats, read the cluster first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED:workersREQUIRED(send at least one field) orINVALID_KUBERNETES_WORKER_COUNT(1 to 10);autoscalingINVALID_KUBERNETES_AUTOSCALING;api_allowed_cidrsINVALID_API_ALLOWED_CIDRSorAPI_ALLOWED_CIDRS_VPC_ONLY. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.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 PATCH "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Delete a Kubernetes cluster
Deletes the cluster. It disappears from your lists and stops billing at once, and no longer counts toward your cluster limit; its nodes are stopped and destroyed with their disks within minutes and cannot be recovered. Volumes your workloads created through persistent volume claims are deleted with it. Deleting a cluster already being deleted returns an empty operation_id.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 409
CONCURRENT_UPDATE: the cluster changed while this request was being processed. Retry the request; if it repeats, read the cluster first. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.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/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Upgrade a Kubernetes cluster
Moves the cluster to a newer Kubernetes version: one of its available_upgrades (the next patch, or the next minor version). Upgrades never happen on their own and never go down. The cluster must be running; nodes are replaced one at a time.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
Body
application/jsonkubernetes_version_idstringrequiredOne of the cluster's
available_upgrades.
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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 409
KUBERNETES_CLUSTER_NOT_RUNNING: start the cluster first.KUBERNETES_CLUSTER_BUSY: the cluster is already changing. Wait until it is running or stopped.KUBERNETES_CLUSTER_NOT_CHANGEABLE: the cluster cannot make this change now (stopped, being deleted, or failed).CONCURRENT_UPDATE: the cluster changed while this request was being processed. Retry the request; if it repeats, read the cluster first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED:kubernetes_version_idREQUIRED,INVALID_KUBERNETES_VERSIONorKUBERNETES_UPGRADE_NOT_ALLOWED(pick one ofavailable_upgrades). - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.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/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/upgrade" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"kubernetes_version_id": "k8sv_07hm4y0ur8n3w9s5z2d6e1aq9x"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Resize worker node compute plan
Resizes the compute plan of worker nodes in the cluster via zero-downtime rolling replacement. A new worker node with the updated plan is provisioned, joins the cluster, workloads migrate, and the old node is retired.
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.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
Body
application/jsonnode_planstringrequiredThe new node plan slug, from the plans list. In a zone with one fixed node size the plan must be that size (
422 KUBERNETES_PLAN_NOT_IN_ZONE).
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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 409
KUBERNETES_CLUSTER_NOT_RUNNING: start the cluster first.KUBERNETES_CLUSTER_BUSY: the cluster is already changing. Wait until it is running or stopped.KUBERNETES_CLUSTER_NOT_CHANGEABLE: the cluster cannot make this change now (stopped, being deleted, or failed).CONCURRENT_UPDATE: the cluster changed while this request was being processed. Retry the request; if it repeats, read the cluster first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED:node_planREQUIREDorINVALID_KUBERNETES_NODE_PLAN. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.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/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/resize-plan" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"node_plan": "s-2vcpu-4gb"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Start a Kubernetes cluster
Starts a stopped cluster. Its nodes are billed for compute again once it runs.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 409
KUBERNETES_CLUSTER_BUSY: the cluster is already changing. Wait until it is running or stopped.KUBERNETES_CLUSTER_NOT_CHANGEABLE: the cluster cannot make this change now (stopped, being deleted, or failed).CONCURRENT_UPDATE: the cluster changed while this request was being processed. Retry the request; if it repeats, read the cluster first. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.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/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/start" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Upgrade Kubernetes cluster networking
Reconfigures the CNI plugin (flannel, wireguard, calico), Pod CIDR, Service CIDR, or API allowed CIDR ranges for the cluster.
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.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
Body
application/jsoncni_pluginstringThe new CNI plugin (
flannel,wireguard, orcalico).pod_cidrstringThe new IPv4 CIDR range allocated for cluster pods.
service_cidrstringThe new IPv4 CIDR range allocated for cluster services.
api_allowed_cidrsarray of stringThe new allowed IPv4 CIDRs reaching the API server.
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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 409
KUBERNETES_CLUSTER_NOT_RUNNING: start the cluster first.KUBERNETES_CLUSTER_BUSY: the cluster is already changing. Wait until it is running or stopped.KUBERNETES_CLUSTER_NOT_CHANGEABLE: the cluster cannot make this change now (stopped, being deleted, or failed).CONCURRENT_UPDATE: the cluster changed while this request was being processed. Retry the request; if it repeats, read the cluster first. - 413
REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request. - 422
VALIDATION_FAILED:INVALID_KUBERNETES_CNI_PLUGINorINVALID_KUBERNETES_CIDR. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.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/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/upgrade-network" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Stop a Kubernetes cluster
Stops a running cluster. While stopped only its disks are billed.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 409
KUBERNETES_CLUSTER_BUSY: the cluster is already changing. Wait until it is running or stopped.KUBERNETES_CLUSTER_NOT_CHANGEABLE: the cluster cannot make this change now (stopped, being deleted, or failed).CONCURRENT_UPDATE: the cluster changed while this request was being processed. Retry the request; if it repeats, read the cluster first. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.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/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/stop" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Download a kubeconfig
The cluster's admin kubeconfig, for kubectl. It holds a long-lived cluster-admin credential: store it like a password. It is fetched fresh on each call and is not kept by the platform. Available while the cluster is running. It is a POST that needs a write key so that a read-only key can never fetch a cluster-admin credential; the response is Cache-Control: no-store.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
Response 200
The kubeconfig.kubeconfigstringrequiredA kubeconfig file (YAML). Secret: it grants cluster-admin.
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
KUBERNETES_CLUSTER_NOT_FOUND: no cluster with this id in your organization. Check the id.RESOURCE_NOT_FOUND: the id is not a cluster id (k8s_…). - 409
KUBECONFIG_UNAVAILABLE: the cluster is not running yet. Wait until it is, then try again. - 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.KUBERNETES_UNAVAILABLE: managed Kubernetes is not open on this platform yet.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/kubeconfig" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"kubeconfig": "apiVersion: v1\nkind: Config\nclusters:\n- name: prod-web\n cluster:\n server: https://…:6443\n certificate-authority-data: …\n…"
}List a cluster's nodes
The cluster's nodes as Kubernetes reports them right now, read from the cluster's own API server. vcpu and memory_mb are each node's capacity; disk_gb is the cluster's node plan.
Errors: 404 KUBERNETES_CLUSTER_NOT_FOUND; 409 KUBERNETES_CLUSTER_NOT_RUNNING (start the cluster first); 503 KUBERNETES_API_UNREACHABLE (the API server did not answer: it may still be starting, or its endpoint may be private; retry).
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
cluster_idstringrequired
Response 200
The cluster's nodes.nodesarray of objectrequiredShow 10 child fieldsHide child fields
idstringrequiredThe node's name, which is its id inside Kubernetes.
namestringrequiredrolestringrequiredOne of
control,worker.statusstringrequiredOne of
Ready,NotReady.ip_addressstringrequiredThe node's internal address.
vcpuintegerrequiredmemory_mbintegerrequireddisk_gbintegerrequiredkubelet_versionstringrequiredcreated_atstring or nullrequired
Errors
- 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
KUBERNETES_CLUSTER_NOT_FOUND. - 409
KUBERNETES_CLUSTER_NOT_RUNNING. - 503
KUBERNETES_API_UNREACHABLE: retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/nodes" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"nodes": [
{
"id": "id",
"name": "web-1",
"role": "control",
"status": "Ready",
"ip_address": "ip-address",
"vcpu": 2,
"memory_mb": 4096,
"disk_gb": 80,
"kubelet_version": "v1.31.2+k3s1",
"created_at": "2026-10-03T09:30:00Z"
}
]
}Get a cluster's services and pods
Every Service and pod in the cluster, in every namespace, read live from its API server. A cluster you have not deployed anything to shows only what Kubernetes itself runs. A service you exposed (see Expose a Kubernetes service) has public_port and external_url, the address it is reached on from the internet.
Errors: 404 KUBERNETES_CLUSTER_NOT_FOUND; 409 KUBERNETES_CLUSTER_NOT_RUNNING; 503 KUBERNETES_API_UNREACHABLE (retry).
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
cluster_idstringrequired
Response 200
The cluster's services and pods.cluster_idstringrequiredpublic_ipstring or nullrequiredThe public address exposed services and the API server are reached on; null until routing has been synced.
api_portinteger or nullrequiredThe cluster's API server port on
public_ip; null for a private endpoint or before routing is synced.servicesarray of objectrequiredShow 9 child fieldsHide child fields
namestringrequirednamespacestringrequiredtypestringrequiredcluster_ipstringrequiredexternal_ipstring or nullrequiredportsarray of objectrequiredShow 5 child fieldsHide child fields
namestringrequiredprotocolstringrequiredportintegerrequiredtarget_portintegerLeft out when the target is a named container port.
node_portinteger
public_portinteger or nullrequiredThe public port routed to this service; null when it is not exposed.
external_urlstring or nullrequiredcreated_atstring or nullrequired
podsarray of objectrequiredShow 9 child fieldsHide child fields
namestringrequirednamespacestringrequiredstatusstringrequiredreadystringrequiredReady containers over all containers.
restartsintegerrequirednode_namestringrequiredpod_ipstringrequiredagestringrequiredAs kubectl's AGE column.
created_atstring or nullrequired
Errors
- 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
KUBERNETES_CLUSTER_NOT_FOUND. - 409
KUBERNETES_CLUSTER_NOT_RUNNING. - 503
KUBERNETES_API_UNREACHABLE: retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/workloads" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"cluster_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"public_ip": "public-ip",
"api_port": 1,
"services": [
{
"name": "web-1",
"namespace": "namespace",
"type": "ClusterIP",
"cluster_ip": "cluster-ip",
"external_ip": "external-ip",
"ports": [
{
"name": "web-1",
"protocol": "protocol",
"port": 22,
"target_port": 1,
"node_port": 1
}
],
"public_port": 1,
"external_url": "http://203.0.113.10:8088",
"created_at": "2026-10-03T09:30:00Z"
}
],
"pods": [
{
"name": "web-1",
"namespace": "namespace",
"status": "Running",
"ready": "1/1",
"restarts": 1,
"node_name": "node-name",
"pod_ip": "pod-ip",
"age": "3h",
"created_at": "2026-10-03T09:30:00Z"
}
]
}Apply a manifest to a cluster
Applies a YAML manifest (one or more documents, up to 512 KB and 100 objects) to the cluster with server-side apply, as kubectl apply --server-side --force-conflicts would, in order. Namespaced objects without a namespace go in namespace (default default). Applying the same manifest again changes nothing, so a retry is safe. If the cluster refuses an object, the objects before it stay applied and the error names the one it refused.
Errors: 422 VALIDATION_FAILED with errors[].field = manifest and code INVALID_KUBERNETES_MANIFEST, whose message is the cluster's own reason (for example a missing field); 404 KUBERNETES_CLUSTER_NOT_FOUND; 409 KUBERNETES_CLUSTER_NOT_RUNNING; 503 KUBERNETES_API_UNREACHABLE (retry).
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
cluster_idstringrequired
Body
application/jsonmanifeststringrequiredAt most 524288 characters.
namespacestringWhere namespaced objects without one go; default
default.
Response 200
What was applied.appliedbooleanrequiredcluster_idstringrequiredoutputstringrequiredOne line per object, as kubectl prints it.
resourcesarray of objectrequiredShow 4 child fieldsHide child fields
kindstringrequirednamestringrequirednamespacestringrequiredEmpty for a cluster-wide object.
statusstringrequiredOne of
created,configured,unchanged.
Errors
- 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
KUBERNETES_CLUSTER_NOT_FOUND. - 409
KUBERNETES_CLUSTER_NOT_RUNNING. - 422
VALIDATION_FAILED:INVALID_KUBERNETES_MANIFESTonmanifest, orREQUIRED. - 503
KUBERNETES_API_UNREACHABLE: retry.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/apply-manifest" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"manifest": "manifest"
}'{
"applied": true,
"cluster_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"output": "deployment.apps/web created",
"resources": [
{
"kind": "create_instance",
"name": "web-1",
"namespace": "namespace",
"status": "created"
}
]
}Export a cluster's workloads as YAML
Your objects as they run in the cluster now, as one multi-document YAML stream you can edit and apply back: Namespaces, ConfigMaps, Services, Deployments, StatefulSets, DaemonSets, CronJobs and Ingresses outside the kube-* namespaces. Fields the cluster fills in (status, resource versions, cluster IPs) are left out. Objects a controller made (a Deployment's ReplicaSets and pods) are left out, since their owner is exported. Secrets are never exported.
Errors: 404 KUBERNETES_CLUSTER_NOT_FOUND; 409 KUBERNETES_CLUSTER_NOT_RUNNING; 503 KUBERNETES_API_UNREACHABLE (retry).
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
cluster_idstringrequired
Response 200
The exported objects.cluster_idstringrequiredmanifeststringrequiredEmpty when you have deployed nothing.
resource_countintegerrequiredretrieved_atstringrequired
Errors
- 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
KUBERNETES_CLUSTER_NOT_FOUND. - 409
KUBERNETES_CLUSTER_NOT_RUNNING. - 503
KUBERNETES_API_UNREACHABLE: retry.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/live-manifests" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"cluster_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"manifest": "manifest",
"resource_count": 1,
"retrieved_at": "2026-10-03T09:30:00Z"
}Expose a Kubernetes service
Routes public_port on the cluster's public address to a Service. The Service's port becomes a NodePort (node_port, or the one it has, or one the cluster picks), the Service records the public port in its pantechdynamics.com/public-port annotation, and routing is synced. The cluster is the record of what is exposed: removing the annotation with kubectl and syncing routing takes the route away. Your subnet's firewall rules must allow the public port.
Public routing needs a cluster in a VPC subnet: it uses the VPC's public address. Port 22 and the cluster's API port are reserved.
Errors: 404 KUBERNETES_CLUSTER_NOT_FOUND; 404 KUBERNETES_SERVICE_NOT_FOUND (apply the Service first); 409 PORT_IN_USE (another service, cluster or resource uses that public port; choose another); 409 KUBERNETES_ROUTING_UNAVAILABLE (a cluster with no VPC address); 409 KUBERNETES_CLUSTER_NOT_RUNNING; 422 VALIDATION_FAILED (service_name, public_port or node_port; or INVALID_KUBERNETES_MANIFEST when the cluster refused the change); 503 KUBERNETES_API_UNREACHABLE (retry).
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
cluster_idstringrequired
Body
application/jsonservice_namestringrequirednamespacestringDefault
default.public_portintegerrequiredFrom 1 to 65535.
node_portintegerLeave out to keep the Service's own NodePort, or let the cluster choose one.
From 30000 to 32767.
protocolstringOne of
TCP,UDP. Defaults toTCP.
Response 200
The service is routed.successbooleanrequiredcluster_idstringrequiredservice_namestringrequirednamespacestringrequiredpublic_ipstringrequiredpublic_portintegerrequirednode_portintegerrequiredprotocolstringrequiredexternal_urlstringrequiredstatusstringrequiredOne of
active.
Errors
- 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
KUBERNETES_CLUSTER_NOT_FOUNDorKUBERNETES_SERVICE_NOT_FOUND. - 409
PORT_IN_USE,KUBERNETES_ROUTING_UNAVAILABLEorKUBERNETES_CLUSTER_NOT_RUNNING. - 422
VALIDATION_FAILED. - 503
KUBERNETES_API_UNREACHABLE: retry.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/expose-service" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"service_name": "service-name",
"public_port": 1
}'{
"success": true,
"cluster_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"service_name": "service-name",
"namespace": "namespace",
"public_ip": "public-ip",
"public_port": 1,
"node_port": 1,
"protocol": "protocol",
"external_url": "http://203.0.113.10:8088",
"status": "active"
}Sync a cluster's public routing
Reconciles the port forwards on the cluster's public address with what the cluster exposes now: its API server (unless its endpoint is private), on the cluster's own API port, and every Service carrying the pantechdynamics.com/public-port annotation. Routes to services no longer exposed are removed. Only the cluster's own routes are ever changed: other clusters and your own port forwards on the same address are left alone.
Every cluster on a shared address gets its own API port: the first 6443, the next 6444, and so on. A new cluster's API port is routed automatically once it is running; call this after exposing or unexposing services with kubectl. If the API server does not answer, only its own route is ensured and no service route is removed.
Errors: 404 KUBERNETES_CLUSTER_NOT_FOUND; 409 PORT_IN_USE; 409 KUBERNETES_ROUTING_UNAVAILABLE (a cluster with no VPC address); 409 KUBERNETES_CLUSTER_NOT_RUNNING.
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
cluster_idstringrequired
Response 200
The routes now in place.successbooleanrequiredcluster_idstringrequiredpublic_ipstringrequiredapi_portinteger or nullrequiredNull for a private endpoint.
synced_portsarray of objectrequiredShow 6 child fieldsHide child fields
purposestringrequiredOne of
kubernetes-api,service.public_portintegerrequiredprivate_portintegerrequiredprotocolstringrequiredtargetstringrequiredcontrol node, or the service as namespace/name.statusstringrequiredOne of
active.
messagestringrequired
Errors
- 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
KUBERNETES_CLUSTER_NOT_FOUND. - 409
PORT_IN_USE,KUBERNETES_ROUTING_UNAVAILABLEorKUBERNETES_CLUSTER_NOT_RUNNING.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/sync-routing" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"success": true,
"cluster_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"public_ip": "public-ip",
"api_port": 1,
"synced_ports": [
{
"purpose": "kubernetes-api",
"public_port": 1,
"private_port": 1,
"protocol": "protocol",
"target": "target",
"status": "active"
}
],
"message": "message"
}List node pools
Lists the cluster's node pools.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
cluster_idstringrequiredThe cluster's id (
k8s_…).
Response 200
The node pools.dataarray of KubernetesNodePoolrequiredShow 14 child fieldsHide child fields
statusstringrequiredprovisioning(workers being built),ready(every worker has joined),updating(a scale in progress),deleting, orunavailable(a pool made while node pools were a preview, with no node size: delete it and create it again).One of
provisioning,ready,updating,deleting,unavailable.observed_workersintegerrequiredThe pool's workers that have joined the cluster. This is what is billed, never
workersalone.idstringrequirede.g.
k8spool_....cluster_idstringrequirednamestringrequirednode_plan_idstringrequiredworkersintegerrequiredautoscaling_enabledbooleanrequiredmin_workersintegerrequiredmax_workersintegerrequiredlabelsobjectrequiredtaintsarray of KubernetesNodePoolTaintrequiredShow 3 child fieldsHide child fields
keystringrequiredvaluestringrequiredeffectstringrequiredOne of
NoSchedule,PreferNoSchedule,NoExecute.
created_atstring or nullrequiredupdated_atstring or nullrequired
next_cursorstring or nullrequired
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. - 404Cluster not found.
- 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. - 503Service unavailable.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/node-pools" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"status": "provisioning",
"observed_workers": 1,
"id": "id",
"cluster_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "web-1",
"node_plan_id": "plan_06gk3x9tq7m2v8r4y1c5d0zp8w",
"workers": 1,
"autoscaling_enabled": true,
"min_workers": 1,
"max_workers": 1,
"labels": {},
"taints": [
{
"key": "key",
"value": "value",
"effect": "NoSchedule"
}
],
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}
],
"next_cursor": "eyJhdCI6IjIwMjYtMTAtMDNUMDk6MzA6MDBaIiwiaWQiOiJ2bV8wNmdrIn0"
}Create a node pool
Adds a node pool: workers of their own plan, joined with the pool's labels, the label pantech.io/node-pool=<name> and the pool's taints, so workloads choose it with a nodeSelector and tolerations. Each worker is billed as a VM of the pool's plan once it has joined (observed_workers). With autoscaling on, the platform adds a worker when a pod the pool could run is waiting for room, and removes the newest one after 10 idle minutes. A pool's name is unique in its cluster: sending the same pool again is answered as a replay, another pool under a taken name is 409 NODE_POOL_NAME_TAKEN. In a zone with one fixed node size (af-abj-2), the plan must be that size (422 KUBERNETES_PLAN_NOT_IN_ZONE).
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
Body
application/jsonnamestringrequiredUnique name for the node pool.
plan_idstringrequiredCompute plan ID or slug for the worker VMs.
workersintegerWorker nodes, 1 to 10. Required unless autoscaling_enabled, when it defaults to min_workers.
autoscaling_enabledbooleanDefaults to
false.min_workersintegerWith autoscaling_enabled: fewest workers, 1 to 10.
max_workersintegerWith autoscaling_enabled: most workers, min_workers to 10. Your credit and limits are checked for this many.
labelsobjecttaintsarray of KubernetesNodePoolTaintShow 3 child fieldsHide child fields
keystringrequiredvaluestringrequiredeffectstringrequiredOne of
NoSchedule,PreferNoSchedule,NoExecute.
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
- 400Bad request.
- 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. - 404Cluster not found.
- 409Cluster busy or duplicate node pool name.
- 422Validation error.
- 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. - 503Service unavailable.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/node-pools" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "cpu-workers",
"plan_id": "standard-2"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Scale a node pool
Changes a node pool's worker count and autoscaling. The body is the pool's whole size.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).pool_idstringrequiredThe node pool's id (
k8spool_…).
Body
application/jsonworkersintegerWorker nodes, 1 to 10. Always send the pool's whole size: autoscaling_enabled left out turns autoscaling off.
autoscaling_enabledbooleanmin_workersintegermax_workersinteger
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
- 400Bad request.
- 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. - 404Cluster or node pool not found.
- 409Cluster busy.
- 422Validation error.
- 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. - 503Service unavailable.
Every code is explained in Errors.
curl -X PATCH "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/node-pools/id_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Delete a node pool
Removes a node pool: its workers leave the cluster (their pods move to other nodes that can run them) and are destroyed, then the pool goes. 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
cluster_idstringrequiredThe cluster's id (
k8s_…).pool_idstringrequiredThe node pool's id (
k8spool_…).
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
- 400Bad request.
- 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. - 404Cluster or node pool not found.
- 409Cluster busy.
- 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. - 503Service unavailable.
Every code is explained in Errors.
curl -X DELETE "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/node-pools/id_06gk3x9tq7m2v8r4y1c5d0zp8w" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}List cluster add-ons
Lists the cluster's managed add-ons and what the cluster runs of each: status is active, installing, removing, disabled or unavailable. metrics-server gives kubectl top and the Horizontal Pod Autoscaler; csi-driver is persistent volumes on the node's own disk (StorageClass local-path; the data stays on that node); ingress-controller is ingress-nginx, the default IngressClass, served on 80 and 443 of the cluster's public address in a VPC zone. A cluster starts with metrics-server and csi-driver on.
Headers
AuthorizationstringrequiredBearerand your API key:Bearer PAN_….
Path parameters
cluster_idstringrequiredThe cluster's id (
k8s_…).
Response 200
The cluster add-ons.dataarray of KubernetesClusterAddonrequiredShow 9 child fieldsHide child fields
idstringrequirede.g.
k8saddon_....cluster_idstringrequirednamestringrequiredversionstringrequiredstatusstringrequiredenabledbooleanrequiredconfigurationstringrequiredJSON-encoded add-on configuration.
created_atstring or nullrequiredupdated_atstring or nullrequired
next_cursorstring or nullrequired
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. - 404Cluster not found.
- 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. - 503Service unavailable.
Every code is explained in Errors.
curl "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/addons" \
-H "Authorization: Bearer $PANTECH_API_KEY"{
"data": [
{
"id": "id",
"cluster_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"name": "web-1",
"version": "version",
"status": "active",
"enabled": true,
"configuration": "configuration",
"created_at": "2026-10-03T09:30:00Z",
"updated_at": "2026-10-03T09:30:00Z"
}
],
"next_cursor": "eyJhdCI6IjIwMjYtMTAtMDNUMDk6MzA6MDBaIiwiaWQiOiJ2bV8wNmdrIn0"
}Toggle a cluster add-on
Turns a managed add-on on or off: metrics-server, csi-driver or ingress-controller. The platform applies it within moments and keeps it that way (a change made with kubectl is put back); the add-on's status shows when it has taken effect. Asking for the state it is already in changes nothing (empty operation_id).
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
cluster_idstringrequiredThe cluster's id (
k8s_…).addon_namestringrequiredThe add-on:
metrics-server,csi-driveroringress-controller. Any other name is422 INVALID_CLUSTER_ADDON.
Body
application/jsonenabledbooleanrequiredWhether the add-on should be enabled or disabled.
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
- 400Bad request.
- 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. - 404Cluster or add-on not found.
- 409Cluster busy.
- 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. - 503Service unavailable.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/addons/id_06gk3x9tq7m2v8r4y1c5d0zp8w/toggle" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"enabled": true
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}Configure API server endpoint access
Changes where the API server can be reached from: private (your VPC only, no public address), public (the internet) or dual (both), and optionally replaces the allow-list. A new cluster is private unless you send endpoint_access when you create it. A public or dual cluster holds a public address of its own (public_ip, with the API server on public_port), billed as a static IP for every hour it holds it. Switching to private releases it: the operation finishes only once the API server and the exposed services are no longer reachable from the internet. The allow-list is enforced on the cluster's control node against the address a connection comes from; traffic from inside the VPC always gets through. Clusters created before 22 October 2026 cannot take an allow-list.
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
cluster_idstringrequiredThe cluster's id (
k8s_…).
Body
application/jsonendpoint_accessstringrequiredEndpoint access mode.
One of
public,private,dual.api_allowed_cidrsarray of stringIPv4 CIDRs allowed to connect to the cluster API.
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
- 400Bad request.
- 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. - 404Cluster not found.
- 409Cluster busy.
- 422Validation error.
- 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. - 503Service unavailable.
Every code is explained in Errors.
curl -X POST "https://api.pantechdynamics.com/public/v1/kubernetes-clusters/k8s_06gk3x9tq7m2v8r4y1c5d0zp8w/endpoint-access" \
-H "Authorization: Bearer $PANTECH_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"endpoint_access": "public"
}'{
"operation_id": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
"resource_id": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
"status": "submitting"
}