{
  "info": {
    "_postman_id": "5b0e2c3e-7a51-4f8e-9c2d-6e1f0a9d4b37",
    "name": "Pantech Dynamics public API",
    "description": "Every endpoint of the Pantech Dynamics public API (https://docs.pantechdynamics.com/api).\n\n1. Set the collection variable `apiKey` to an API key from the console (Organization → API keys). Keep it in the Current value so it is not synced.\n2. Send **Account → Describe this API key** to check it.\n\nWrites send a fresh `Idempotency-Key` ({{$guid}}). Ids in the example URLs are placeholders: replace them with your own.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.pantechdynamics.com/public/v1",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Account",
      "description": "Call `GET /me` first: it confirms the key works, and tells you its scopes before you try anything they do not allow.",
      "item": [
        {
          "name": "Describe this API key",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "me"
              ]
            },
            "description": "The organization and project the key acts in, its scopes and when it expires. Call it to check that a key works before using it.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/account#describe-this-api-key"
          },
          "response": []
        },
        {
          "name": "Revoke this API key",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/me",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "me"
              ]
            },
            "description": "Revokes the API key that sends this request, at once and for good. This is how an AI app disconnects itself and how `pantech auth logout` ends its key. Other keys are untouched.\n\nIt needs no `Idempotency-Key`: once the key is revoked, repeating the call gets `401 UNAUTHENTICATED`, because the key no longer works. It works even while the organization has AI app access turned off.\n\n**Scope:** `read` (any key may revoke itself).\n\nDocs: https://docs.pantechdynamics.com/api/account#revoke-this-api-key"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Catalogue",
      "description": "Read the catalogue to find the slugs you create resources with: a plan's `slug` is an instance's `plan_slug`, an image's `slug` its `image_slug`, a disk offering's `slug` a volume's `disk_offering_slug`. Prices are integers in minor units (kobo for NGN, cents for USD).",
      "item": [
        {
          "name": "List regions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/regions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "regions"
              ]
            },
            "description": "Regions and their zones, and whether each zone can take standard instances or VPC networks right now (`available`, with an `unavailable_reason` when not). Use a zone as `zone_id` for a database, or a region as `region` elsewhere.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/catalogue#list-regions"
          },
          "response": []
        },
        {
          "name": "List plans",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/plans",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "plans"
              ],
              "query": [
                {
                  "key": "placement",
                  "value": "",
                  "description": "Price for standard instances or VPC instances.",
                  "disabled": true
                }
              ]
            },
            "description": "Instance sizes (vCPU, memory and disk), priced in your organization's currency. Use a `slug` as `plan_slug` for an instance or a database. Send `placement=vpc` to price a VPC instance (no public address of its own), or leave it out for a standard instance.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/catalogue#list-plans"
          },
          "response": []
        },
        {
          "name": "List images",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/images",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "images"
              ]
            },
            "description": "Operating systems you can install on an instance, and the zones each runs in. Use a `slug` as `image_slug` in *Create an instance* or *Rebuild an instance*.\n\nEncrypted images (`encrypted: true`) appear only for organizations they are enabled for; elsewhere their slug is refused as `IMAGE_NOT_FOUND`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/catalogue#list-images"
          },
          "response": []
        },
        {
          "name": "List disk offerings",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/disk-offerings",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "disk-offerings"
              ]
            },
            "description": "Volume types and their hourly prices. Use a `slug` as `disk_offering_slug` in *Create a volume*; for an offering with `custom_size: true`, also send `size_gb`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/catalogue#list-disk-offerings"
          },
          "response": []
        },
        {
          "name": "Price a volume",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/disk-offerings/:slug/quote",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "disk-offerings",
                ":slug",
                "quote"
              ],
              "query": [
                {
                  "key": "size_gb",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "slug",
                  "value": "medium-20gb",
                  "description": "The disk offering's slug."
                }
              ]
            },
            "description": "The monthly price of one volume of this offering. `size_gb` is required for a custom-size offering and ignored otherwise. Use it to show a price before *Create a volume*.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/catalogue#price-a-volume"
          },
          "response": []
        },
        {
          "name": "Estimate a monthly bill",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/pricing/estimate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "pricing",
                "estimate"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"currency\": \"NGN\",\n  \"machines\": [\n    {\n      \"plan_slug\": \"starter\",\n      \"quantity\": 2,\n      \"running_hours\": 730,\n      \"placement\": \"standard\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Prices a whole configuration before you build it: machines by plan and running hours, extra storage, VPC networks and snapshot storage. Nothing is created and nothing is charged, so no `Idempotency-Key` is needed.\n\n`pricing_complete` is false when any line could not be priced; that line has `priced: false` and an `unpriced_reason`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/catalogue#estimate-a-monthly-bill"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Instances",
      "description": "An instance is a virtual machine. A **standard** instance gets its own public IPv4 address and a security group. An instance created with a `subnet_id` lives in a [VPC](/api/networks) instead: it has a private address, and is reached through a [public IP](/api/public-ips). A standard instance can also be given a second interface on its zone's private database network, to reach [managed databases](/databases/standard-vps).\n\nEvery change is asynchronous. Creating one returns an [order](/api/instance-orders); every other change returns an [operation](/api/operations) to follow.",
      "item": [
        {
          "name": "List instances",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instances",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `running`, `stopped` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ]
            },
            "description": "Your instances, newest first, with addresses and state. Filter by name with `q`, or by state.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#list-instances"
          },
          "response": []
        },
        {
          "name": "Create an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"web-1\",\n  \"plan_slug\": \"starter\",\n  \"image_slug\": \"ubuntu-24-04\",\n  \"ssh_key_id\": \"sshk_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Orders a new instance (VPS). Choose a plan (`GET /public/v1/plans`), an image (`GET /public/v1/images`) and an SSH key (`GET /public/v1/ssh-keys`), which is required: images have no password login.\n\n**Placement.** Leave out `subnet_id` for a standard instance with its own public IPv4, protected by a security group (your organization's default group unless you send `security_group_id`). Send `subnet_id` (and optionally its `network_id`) to place it in a VPC subnet, with a private address only; reach it through a public IP.\n\n**Paid first.** Returns `202 Accepted` with an order (`order_id`, also the `Location` header). The initial payment is taken from credit, or else from the organization's default card, and then the instance is provisioned. Follow `GET /public/v1/instance-orders/{order_id}` until `status` is `provisioned`, then read the instance; `payment_failed` and `failed` are final, and any payment taken is returned to your credit.\n\n**Idempotency.** Send an `Idempotency-Key`. A retry with the same key returns the original order instead of ordering a second instance.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#create-an-instance"
          },
          "response": []
        },
        {
          "name": "Get an instance",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One instance: its plan, image, addresses (including `private_network_ip` once a private database network interface is attached), and current state. A change is complete when `observed_state` matches `desired_state`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#get-an-instance"
          },
          "response": []
        },
        {
          "name": "Start an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/start",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "start"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Starts a stopped instance. A running instance is billed for its plan again.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#start-an-instance"
          },
          "response": []
        },
        {
          "name": "Stop an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/stop",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "stop"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Shuts the instance down. A stopped instance keeps its disks and addresses and is billed for storage only.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\nFor the first 5 minutes after a new instance is created, this returns `409` with code `INSTANCE_POWER_LOCKED` while first boot finishes. Wait the `Retry-After` header's seconds, then try again. Pending, provisioning, or uncertain instances also return this 409 before the first run is recorded, without `Retry-After`; wait for the instance to reach running first.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#stop-an-instance"
          },
          "response": []
        },
        {
          "name": "Reboot an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/reboot",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "reboot"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Restarts the instance (a clean reboot of the operating system). It must be running.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\nFor the first 5 minutes after a new instance is created, this returns `409` with code `INSTANCE_POWER_LOCKED` while first boot finishes. Wait the `Retry-After` header's seconds, then try again. Pending, provisioning, or uncertain instances also return this 409 before the first run is recorded, without `Retry-After`; wait for the instance to reach running first.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#reboot-an-instance"
          },
          "response": []
        },
        {
          "name": "Rename an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/rename",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "rename"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"web-2\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Changes the instance's name (1 to 255 characters, unique among your instances).\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#rename-an-instance"
          },
          "response": []
        },
        {
          "name": "Resize an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/resize",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "resize"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"plan_slug\": \"starter\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Moves the instance to a bigger plan. The instance is stopped, resized and started again. Instances only grow: the new plan must be bigger than the current one. No upfront charge: the bigger plan is billed hourly from the change.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#resize-an-instance"
          },
          "response": []
        },
        {
          "name": "Rebuild an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/rebuild",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "rebuild"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Reinstalls the operating system from `image_slug`, or from the instance's current image when it is left out. **Everything on the root disk is erased**; attached volumes, addresses and the plan are kept. Take a snapshot first if you may need the data.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#rebuild-an-instance"
          },
          "response": []
        },
        {
          "name": "Restore an instance from a snapshot",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/restore",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "restore"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"snapshot_id\": \"snap_06gk3x9tq7m2v8r4y1c5d0zp8w\",\n  \"confirm_name\": \"web-1\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Rolls the instance's root disk back to one of its own snapshots and reboots it. **Everything written to the root disk since the snapshot is lost**, so `confirm_name` must repeat the instance's current name. Attached volumes are not changed.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#restore-an-instance-from-a-snapshot"
          },
          "response": []
        },
        {
          "name": "Change an instance's SSH key",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/change-ssh-key",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "change-ssh-key"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"ssh_key_id\": \"sshk_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Replaces the SSH key you log in to the instance with by another key on your account, for example after losing the private key. The instance must be running: it is stopped, given the new key and started again, which takes about two minutes. The previous key stops working once the instance is back. Keys you added to the server yourself are left as they are.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#change-an-instances-ssh-key"
          },
          "response": []
        },
        {
          "name": "Change an instance's security group",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/security-group",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "security-group"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"security_group_id\": \"sg_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Moves a standard instance to another of your security groups. The instance must be stopped; the new group applies when it starts again.\n\nIf the instance has a private database network interface, the new group must allow nothing from the private network's range (`10.250.0.0/20` in `af-abj-1`): a group with any ingress rule whose source overlaps it, `0.0.0.0/0` included, is refused.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#change-an-instances-security-group"
          },
          "response": []
        },
        {
          "name": "Open the browser console",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/console",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "console"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Returns a short-lived URL to the instance's browser console. **The console gives a logged-in shell; treat the URL as a password** and never log or share it. The instance must be running.\n\n**Idempotency:** each request opens a new console URL; a retry is not replayed. Opening one changes nothing else, so retrying is safe.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#open-the-browser-console"
          },
          "response": []
        },
        {
          "name": "Issue a volume key credential",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/volume-key-credential",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "volume-key-credential"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Gives an instance the **credential** it uses to ask Pantech for the key of an encrypted data volume. Put the credential on the instance, in the volume agent's configuration, and attach the volume to any instance of your organization: that instance can unlock the volume, whether it runs an encrypted image or a plain one. A volume's key is released only to an instance of the same organization that the volume is attached to.\n\n**The credential is a secret: it is shown once.** Pantech keeps only a hash of it, so it cannot be shown again. Treat it like a password and never log or share it. Each request issues a new credential and **ends the previous one** for that instance, so use it to rotate a credential too, and update the agent on that instance. The credential also ends when the instance is deleted.\n\n**Idempotency:** each request issues a new credential; a retry is not replayed.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#issue-a-volume-key-credential"
          },
          "response": []
        },
        {
          "name": "Grant temporary SSH access",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/ssh-access",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "ssh-access"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Opens port 22 of a standard instance to the address this request comes from, for 15 minutes, so you can SSH in without leaving the port open. The instance must be running and be the only one using its security group.\n\nReturns `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`. Then read the grant (`GET /public/v1/instances/{instance_id}/ssh-access/{grant_id}`, the operation's `resource_id` is the grant id) for the `host` and `port` to connect to once `status` is `active`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#grant-temporary-ssh-access"
          },
          "response": []
        },
        {
          "name": "Get an SSH access grant",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/ssh-access/:grant_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "ssh-access",
                ":grant_id"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                },
                {
                  "key": "grant_id",
                  "value": "sshg_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "A temporary SSH access grant: its `status`, and the `host` and `port` to connect to once it is `active`. It expires by itself at `expires_at`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#get-an-ssh-access-grant"
          },
          "response": []
        },
        {
          "name": "Revoke SSH access",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/ssh-access/:grant_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "ssh-access",
                ":grant_id"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                },
                {
                  "key": "grant_id",
                  "value": "sshg_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Closes the port opened by a grant before it expires.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#revoke-ssh-access"
          },
          "response": []
        },
        {
          "name": "Delete an instance",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Deletes the instance. It is stopped, a safety snapshot of its root disk is kept for 24 hours, and then it is removed. Attached volumes are detached, not deleted. Release its public IP and delete port forwarding rules that point at it first.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#delete-an-instance"
          },
          "response": []
        },
        {
          "name": "Get instance metrics",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/metrics",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "metrics"
              ],
              "query": [
                {
                  "key": "interval",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "CPU, memory, network and disk activity over `interval` (`1h`, `24h`, `7d` or `30d`), one point per bucket. `available` is false when no samples exist yet, for example just after creation.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#get-instance-metrics"
          },
          "response": []
        },
        {
          "name": "Add a private database network interface to an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/private-network",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "private-network"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Adds a second network interface on the zone's private database network to a standard instance, so it can reach your managed databases there by their private address. Only in a zone with a private database network (`af-abj-1`); a VPC instance already reaches databases in its own VPC. The interface is free.\n\nWhen the operation succeeds, the instance's `private_network_state` is `attached` and `private_network_ip` is the interface's address: allow it on each database as a `/32` access rule (*Replace access rules*).\n\n**The instance's security group must allow nothing from the private network's range** (`10.250.0.0/20`; the zone's `private_network_cidr` in `GET /public/v1/regions`). A security group applies to every interface of an instance, so any ingress rule whose source overlaps that range, whatever its protocol or ports, would let every database and every other customer's private interface on the network reach this instance. That includes `0.0.0.0/0` and `10.0.0.0/8`, and the ICMP-from-anywhere rule of your organization's default security group. Such a group is refused, naming the rules to change: replace `0.0.0.0/0` with the addresses you actually need, or with ranges that leave out `10.250.0.0/20`, or move the instance to a group without such rules. While the instance has the interface, rule changes and group moves that would allow the range are refused too.\n\nThe instance must be running or stopped with no other change in progress. A running instance gets the interface without a restart.\n\n**In the guest** the interface stays down until you configure it. On Ubuntu add it to netplan with DHCP only, never the default route or DNS: `dhcp4: true` with `dhcp4-overrides: {use-routes: false, use-dns: false}` for the new interface (often `ens4` or `eth1`), then run `netplan apply`.\n\nReturns `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`. If the operation fails, its `failure.code` says why: `SECURITY_GROUP_ALLOWS_PRIVATE_NETWORK` (a rule allowing the range was added meanwhile; nothing was attached), `INSTANCE_BUSY` (the instance kept changing; retry when it has settled), or `INSTANCE_PRIVATE_NETWORK_ATTACH_FAILED` (retry later, or contact support). The instance itself is never marked failed for it.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#add-a-private-database-network-interface-to-an-instance"
          },
          "response": []
        },
        {
          "name": "Remove an instance's private database network interface",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/private-network",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "private-network"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Removes the instance's interface on the private database network. The instance must be running or stopped with no other change in progress; a running instance keeps running. `private_network_ip` stays readable until the operation succeeds; then remove any database access rule for it, and the interface from the guest's network configuration.\n\nReturns `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`. A detach that cannot complete fails with `INSTANCE_PRIVATE_NETWORK_DETACH_FAILED`; retry later.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/instances#remove-an-instances-private-database-network-interface"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Instance orders",
      "description": "Creating an instance places an order. The order takes the initial payment, from credit or else the organization's default card, and then provisions the instance. Poll the order until its `status` is `provisioned` (the instance is ready to read), `failed` or `payment_failed`.",
      "item": [
        {
          "name": "List instance orders",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instance-orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instance-orders"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                }
              ]
            },
            "description": "Your instance orders, newest first, one per *Create an instance* call. An order shows whether the initial payment was taken and whether provisioning started.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/instance-orders#list-instance-orders"
          },
          "response": []
        },
        {
          "name": "Get an instance order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instance-orders/:order_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instance-orders",
                ":order_id"
              ],
              "variable": [
                {
                  "key": "order_id",
                  "value": "ord_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Payment and provisioning progress for one new instance. Poll it after *Create an instance* until `status` is `provisioned` (then read the instance), or `payment_failed` or `failed` (final: any payment taken is returned to your credit, and `failure_code` says why).\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/instance-orders#get-an-instance-order"
          },
          "response": []
        }
      ]
    },
    {
      "name": "VPC networks",
      "description": "A VPC is a private network of your own. Create one, add subnets inside its CIDR, then create instances with a `subnet_id`. Each subnet has numbered firewall rules, evaluated lowest number first; the first match decides. To reach a VPC instance from the internet, give it a [public IP](/api/public-ips).",
      "item": [
        {
          "name": "List VPC networks",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/networks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "networks"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ]
            },
            "description": "Your VPC networks, newest first. Filter by name with `q`, or by state.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#list-vpc-networks"
          },
          "response": []
        },
        {
          "name": "Create a VPC network",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/networks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "networks"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"prod\",\n  \"cidr\": \"10.0.0.0/16\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a VPC: a private network of your own, with a CIDR such as `10.0.0.0/16`. Then add subnets to it, and instances or databases to the subnets. A VPC is billed monthly: see *Price a VPC network*.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The network's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#create-a-vpc-network"
          },
          "response": []
        },
        {
          "name": "Price a VPC network",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/networks/quote",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "networks",
                "quote"
              ]
            },
            "description": "What one more VPC network costs per month, in your organization's currency. `priced` is false, with an `unpriced_reason`, when no price applies.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#price-a-vpc-network"
          },
          "response": []
        },
        {
          "name": "Get a VPC network",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/networks/:network_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "networks",
                ":network_id"
              ],
              "variable": [
                {
                  "key": "network_id",
                  "value": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One VPC network, with the number of instances in it.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#get-a-vpc-network"
          },
          "response": []
        },
        {
          "name": "Delete a VPC network",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/networks/:network_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "networks",
                ":network_id"
              ],
              "variable": [
                {
                  "key": "network_id",
                  "value": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Deletes a VPC network. It must hold no instances (in any of its subnets) and no public IPs.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#delete-a-vpc-network"
          },
          "response": []
        },
        {
          "name": "List subnets",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/networks/:network_id/subnets",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "networks",
                ":network_id",
                "subnets"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "network_id",
                  "value": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "The VPC's subnets.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#list-subnets"
          },
          "response": []
        },
        {
          "name": "Create a subnet",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/networks/:network_id/subnets",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "networks",
                ":network_id",
                "subnets"
              ],
              "variable": [
                {
                  "key": "network_id",
                  "value": "net_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"app\",\n  \"cidr\": \"10.0.1.0/24\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a subnet inside the VPC's CIDR, such as `10.0.1.0/24`. Instances and databases are placed in subnets; each subnet has its own firewall rules.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The subnet's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#create-a-subnet"
          },
          "response": []
        },
        {
          "name": "Get a subnet",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/subnets/:subnet_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "subnets",
                ":subnet_id"
              ],
              "variable": [
                {
                  "key": "subnet_id",
                  "value": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One subnet, with the number of instances in it.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#get-a-subnet"
          },
          "response": []
        },
        {
          "name": "Delete a subnet",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/subnets/:subnet_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "subnets",
                ":subnet_id"
              ],
              "variable": [
                {
                  "key": "subnet_id",
                  "value": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Deletes a subnet. It must hold no instances or databases.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#delete-a-subnet"
          },
          "response": []
        },
        {
          "name": "List a subnet's firewall rules",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/subnets/:subnet_id/firewall-rules",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "subnets",
                ":subnet_id",
                "firewall-rules"
              ],
              "variable": [
                {
                  "key": "subnet_id",
                  "value": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "The subnet's firewall rules, in evaluation order, and the platform's fixed rules around them (`system_rules`), which always apply.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#list-a-subnets-firewall-rules"
          },
          "response": []
        },
        {
          "name": "Add a firewall rule",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/subnets/:subnet_id/firewall-rules",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "subnets",
                ":subnet_id",
                "firewall-rules"
              ],
              "variable": [
                {
                  "key": "subnet_id",
                  "value": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"number\": 100,\n  \"protocol\": \"tcp\",\n  \"cidr\": \"203.0.113.0/24\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Adds a rule to the subnet's firewall. Rules are evaluated by `number`, lowest first, and the first match decides; traffic no rule allows is dropped. A rule applies to the whole subnet. Defaults: `direction` `ingress`, `action` `allow`, `port_end` equal to `port_start`.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The rule's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#add-a-firewall-rule"
          },
          "response": []
        },
        {
          "name": "Get a firewall rule",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/subnets/:subnet_id/firewall-rules/:rule_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "subnets",
                ":subnet_id",
                "firewall-rules",
                ":rule_id"
              ],
              "variable": [
                {
                  "key": "subnet_id",
                  "value": "snet_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                },
                {
                  "key": "rule_id",
                  "value": "aclr_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The rule's id (`aclr_...` for a firewall rule, `pfr_...` for a port forwarding rule)."
                }
              ]
            },
            "description": "One firewall rule on the subnet.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#get-a-firewall-rule"
          },
          "response": []
        },
        {
          "name": "Delete a firewall rule",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/firewall-rules/:rule_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "firewall-rules",
                ":rule_id"
              ],
              "variable": [
                {
                  "key": "rule_id",
                  "value": "aclr_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The rule's id (`aclr_...` for a firewall rule, `pfr_...` for a port forwarding rule)."
                }
              ]
            },
            "description": "Deletes one subnet firewall rule. Traffic it allowed is dropped once the operation succeeds, unless another rule allows it.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/networks#delete-a-firewall-rule"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Public IPs",
      "description": "A public IP belongs to a VPC. With purpose `static_nat` every port of the address maps to one instance. With `port_forwarding` the address carries rules, each forwarding a port or range to an instance in the VPC. With `load_balancer` it carries [load balancers](/api/load-balancers), one per public port.",
      "item": [
        {
          "name": "List public IPs",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/public-ips",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips"
              ],
              "query": [
                {
                  "key": "network_id",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "Your VPC public IPs, or one VPC's with `network_id`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#list-public-ips"
          },
          "response": []
        },
        {
          "name": "Allocate a public IP",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/public-ips",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"network_id\": \"net_06gk3x9tq7m2v8r4y1c5d0zp8w\",\n  \"instance_id\": \"vm_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Allocates a public IPv4 address for a VPC. `static_nat` (the default) maps every port of the address to one instance in `network_id`, sent as `instance_id`; `port_forwarding`, where offered, carries per-port rules instead (add them with *Add a port forwarding rule*). The network must be active. A public IP is billed monthly: see *Price a public IP*.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The address is in the public IP's `address` once it succeeds.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#allocate-a-public-ip"
          },
          "response": []
        },
        {
          "name": "Price a public IP",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/public-ips/quote",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips",
                "quote"
              ]
            },
            "description": "What one more public IP costs per month, in your organization's currency.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#price-a-public-ip"
          },
          "response": []
        },
        {
          "name": "Get a public IP",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/public-ips/:public_ip_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips",
                ":public_ip_id"
              ],
              "variable": [
                {
                  "key": "public_ip_id",
                  "value": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One public IP, with the instance it maps to.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#get-a-public-ip"
          },
          "response": []
        },
        {
          "name": "Release a public IP",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/public-ips/:public_ip_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips",
                ":public_ip_id"
              ],
              "variable": [
                {
                  "key": "public_ip_id",
                  "value": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Releases a public IP. The address is returned to the pool and may be given to someone else; billing stops when the operation succeeds. Delete its port forwarding rules first.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#release-a-public-ip"
          },
          "response": []
        },
        {
          "name": "Attach a public IP to an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/public-ips/:public_ip_id/attach",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips",
                ":public_ip_id",
                "attach"
              ],
              "variable": [
                {
                  "key": "public_ip_id",
                  "value": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"instance_id\": \"vm_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Points a static NAT public IP at an instance in the same private network (VPC), keeping the address. Use it to move an address from one instance to another without releasing it: you keep the same IP and pay for it once. If the address is attached elsewhere it moves; the instance must not already have a static NAT address of its own.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). Poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`. While it runs the address shows `in_sync: false`. Send an `Idempotency-Key`; a change that changes nothing returns an empty `operation_id`.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#attach-a-public-ip-to-an-instance"
          },
          "response": []
        },
        {
          "name": "List port forwarding rules",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/public-ips/:public_ip_id/port-forwarding-rules",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips",
                ":public_ip_id",
                "port-forwarding-rules"
              ],
              "variable": [
                {
                  "key": "public_ip_id",
                  "value": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "The address's port forwarding rules.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#list-port-forwarding-rules"
          },
          "response": []
        },
        {
          "name": "Detach a public IP from its instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/public-ips/:public_ip_id/detach",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips",
                ":public_ip_id",
                "detach"
              ],
              "variable": [
                {
                  "key": "public_ip_id",
                  "value": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Unmaps a static NAT public IP from its instance. The address stays yours (and is billed once, as before) until you attach it to another instance or release it. The instance keeps running and can then be deleted.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). Poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`. While it runs the address shows `in_sync: false`. Send an `Idempotency-Key`; a change that changes nothing returns an empty `operation_id`.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#detach-a-public-ip-from-its-instance"
          },
          "response": []
        },
        {
          "name": "Add a port forwarding rule",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/public-ips/:public_ip_id/port-forwarding-rules",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips",
                ":public_ip_id",
                "port-forwarding-rules"
              ],
              "variable": [
                {
                  "key": "public_ip_id",
                  "value": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"instance_id\": \"vm_06gk3x9tq7m2v8r4y1c5d0zp8w\",\n  \"protocol\": \"tcp\",\n  \"public_port_start\": 443\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Forwards a port or range of a `port_forwarding` public IP to an instance in its VPC. Defaults: `public_port_end` equals `public_port_start`, and the private range equals the public one (or starts at `private_port_start` with the same width).\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The rule's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#add-a-port-forwarding-rule"
          },
          "response": []
        },
        {
          "name": "Get a port forwarding rule",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/public-ips/:public_ip_id/port-forwarding-rules/:rule_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "public-ips",
                ":public_ip_id",
                "port-forwarding-rules",
                ":rule_id"
              ],
              "variable": [
                {
                  "key": "public_ip_id",
                  "value": "pip_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                },
                {
                  "key": "rule_id",
                  "value": "pfr_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The rule's id (`aclr_...` for a firewall rule, `pfr_...` for a port forwarding rule)."
                }
              ]
            },
            "description": "One port forwarding rule on the address.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#get-a-port-forwarding-rule"
          },
          "response": []
        },
        {
          "name": "Delete a port forwarding rule",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/port-forwarding-rules/:rule_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "port-forwarding-rules",
                ":rule_id"
              ],
              "variable": [
                {
                  "key": "rule_id",
                  "value": "pfr_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The rule's id (`aclr_...` for a firewall rule, `pfr_...` for a port forwarding rule)."
                }
              ]
            },
            "description": "Deletes one port forwarding rule. Traffic to those ports stops once the operation succeeds.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/public-ips#delete-a-port-forwarding-rule"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Load balancers",
      "description": "A load balancer distributes incoming network connections across multiple instances. Pantech supports two kinds of load balancers: `vpc_native` for instances in a private VPC subnet (using a reserved public IP with purpose `load_balancer`), and `appliance` for standard security group zones (with dedicated public IP allocation and HTTP/HTTPS/TCP support). The ports, zone, kind, and network settings are fixed once created; the name, algorithm, and backend targets can change. See the [load balancers guide](/networking/load-balancers).",
      "item": [
        {
          "name": "List load balancers",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/load-balancers",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "load-balancers"
              ],
              "query": [
                {
                  "key": "network_id",
                  "value": "",
                  "description": "Only load balancers in this private network (`net_…`).",
                  "disabled": true
                },
                {
                  "key": "public_ip_id",
                  "value": "",
                  "description": "Only load balancers on this public IP (`pip_…`).",
                  "disabled": true
                }
              ]
            },
            "description": "Your load balancers, newest first, each with its targets. Deleted and failed ones are left out. Narrow it with `network_id` or `public_ip_id`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/load-balancers#list-load-balancers"
          },
          "response": []
        },
        {
          "name": "Create a load balancer",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/load-balancers",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "load-balancers"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"web\",\n  \"public_port\": 443,\n  \"private_port\": 8443,\n  \"instance_ids\": [\n    \"vm_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Spreads one TCP port of a `load_balancer` public IP across instances in one subnet of that IP's private network (VPC). The public IP must be active and have `purpose` `load_balancer`; one public IP can carry several load balancers, one per public port. `private_port` defaults to `public_port`, and `algorithm` to `roundrobin`. `cidr_list` limits which source addresses may connect (default: anywhere). The subnet's firewall rules must allow the port.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice. The load balancer's id is the operation's `resource_id`.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/load-balancers#create-a-load-balancer"
          },
          "response": []
        },
        {
          "name": "Get a load balancer",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/load-balancers/:load_balancer_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "load-balancers",
                ":load_balancer_id"
              ],
              "variable": [
                {
                  "key": "load_balancer_id",
                  "value": "lb_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The load balancer's id (`lb_…`)."
                }
              ]
            },
            "description": "One load balancer, with its targets. `in_sync` is false while a change you made has not reached it yet.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/load-balancers#get-a-load-balancer"
          },
          "response": []
        },
        {
          "name": "Change a load balancer",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/load-balancers/:load_balancer_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "load-balancers",
                ":load_balancer_id"
              ],
              "variable": [
                {
                  "key": "load_balancer_id",
                  "value": "lb_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The load balancer's id (`lb_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"instance_ids\": [\n    \"vm_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Renames it, changes its `algorithm`, or replaces its targets: `instance_ids`, when sent (even empty), is the whole new set. Fields you leave out stay as they are. The ports, the public IP, the subnet and `cidr_list` cannot change: create a new load balancer for those. A change that changes nothing returns an empty `operation_id`.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/load-balancers#change-a-load-balancer"
          },
          "response": []
        },
        {
          "name": "Delete a load balancer",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/load-balancers/:load_balancer_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "load-balancers",
                ":load_balancer_id"
              ],
              "variable": [
                {
                  "key": "load_balancer_id",
                  "value": "lb_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The load balancer's id (`lb_…`)."
                }
              ]
            },
            "description": "Deletes the load balancer. Traffic to its port stops once the operation succeeds; the instances and the public IP are kept.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/load-balancers#delete-a-load-balancer"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Security groups",
      "description": "A security group is a set of rules shared by every standard instance that uses it. Inbound traffic no rule allows is dropped. Each organization has a default group, used when an instance names none. VPC instances use their subnet's [firewall rules](/api/networks) instead.",
      "item": [
        {
          "name": "List security groups",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/security-groups",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "security-groups"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ]
            },
            "description": "Your security groups, newest first, with their rules. Filter by name with `q`, or by state.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/security-groups#list-security-groups"
          },
          "response": []
        },
        {
          "name": "Create a security group",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/security-groups",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "security-groups"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"web\",\n  \"rules\": [\n    {\n      \"direction\": \"ingress\",\n      \"protocol\": \"tcp\",\n      \"port_range\": \"443\",\n      \"cidr\": \"0.0.0.0/0\"\n    },\n    {\n      \"direction\": \"ingress\",\n      \"protocol\": \"tcp\",\n      \"port_range\": \"22\",\n      \"cidr\": \"203.0.113.4/32\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a reusable firewall for standard instances in a security-group zone (`af-abj-1`). Each rule has a `direction`, a `protocol` (`tcp`, `udp`, `icmp` or `all`), a `port_range` for `tcp`/`udp` and one IPv4 `cidr`. Inbound traffic no rule allows is dropped. A group needs at least one rule.\n\nThe name is unique among your live security groups; a deleted group frees its name. Attach the group to an instance at create (`security_group_id`) or with *Change an instance's security group*, or to a database as a source of allowed address ranges.\n\nPrefer narrow sources: a rule from `0.0.0.0/0` stops an instance from attaching a private database network interface.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The group's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/security-groups#create-a-security-group"
          },
          "response": []
        },
        {
          "name": "Get a security group",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/security-groups/:security_group_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "security-groups",
                ":security_group_id"
              ],
              "variable": [
                {
                  "key": "security_group_id",
                  "value": "sg_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One security group and its rules.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/security-groups#get-a-security-group"
          },
          "response": []
        },
        {
          "name": "Replace a security group's rules",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/security-groups/:security_group_id/rules",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "security-groups",
                ":security_group_id",
                "rules"
              ],
              "variable": [
                {
                  "key": "security_group_id",
                  "value": "sg_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"rules\": [\n    {\n      \"direction\": \"ingress\",\n      \"protocol\": \"tcp\",\n      \"port_range\": \"22\",\n      \"cidr\": \"203.0.113.4/32\"\n    },\n    {\n      \"direction\": \"ingress\",\n      \"protocol\": \"tcp\",\n      \"port_range\": \"5432\",\n      \"cidr\": \"10.0.1.0/24\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Replaces the group's complete rule list, for every instance using it. Each rule has a `direction`, a `protocol` (`tcp`, `udp`, `icmp` or `all`), a `port_range` for `tcp`/`udp` and one IPv4 `cidr`. Inbound traffic no rule allows is dropped. A group needs at least one rule.\n\nDatabases the group is attached to are updated automatically; a list that would give one of them more than 1024 address ranges is refused. While an instance using the group has a private database network interface, an ingress rule whose source overlaps the private network's range (`10.250.0.0/20`), `0.0.0.0/0` included, is refused.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/security-groups#replace-a-security-groups-rules"
          },
          "response": []
        },
        {
          "name": "Delete a security group",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/security-groups/:security_group_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "security-groups",
                ":security_group_id"
              ],
              "variable": [
                {
                  "key": "security_group_id",
                  "value": "sg_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Deletes a security group. It must not be used by any instance. The organization's default group cannot be deleted. A group attached to a database cannot be deleted either: detach it with `PUT /public/v1/databases/{database_id}/security-groups` first.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/security-groups#delete-a-security-group"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Volumes",
      "description": "A volume is a data disk, separate from an instance's root disk. Attach it to a running instance in the same zone, then format and mount it from the instance. Volumes only grow.",
      "item": [
        {
          "name": "List an instance's volumes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/volumes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "volumes"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "The volumes attached to this instance.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/volumes#list-an-instances-volumes"
          },
          "response": []
        },
        {
          "name": "List volumes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/volumes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ]
            },
            "description": "Your volumes, newest first, with what each costs per month. Filter by name with `q`, or by state.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/volumes#list-volumes"
          },
          "response": []
        },
        {
          "name": "Create a volume",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/volumes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"data\",\n  \"disk_offering_slug\": \"medium-20gb\",\n  \"size_gb\": 100,\n  \"instance_id\": \"vm_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a data disk of `disk_offering_slug` (see `GET /public/v1/disk-offerings`; send `size_gb` for a custom-size offering). Send `instance_id` to attach it at once to a running instance in the same zone, and `mount_point` to have it mounted there.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The volume's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/volumes#create-a-volume"
          },
          "response": []
        },
        {
          "name": "Get a volume",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One volume, with where it is attached and what it costs.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/volumes#get-a-volume"
          },
          "response": []
        },
        {
          "name": "Delete a volume",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Deletes a volume and its data. Detach it first. Its snapshots are kept and stay billed until you delete them.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/volumes#delete-a-volume"
          },
          "response": []
        },
        {
          "name": "Attach a volume",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id/attach",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id",
                "attach"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"instance_id\": \"vm_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Attaches a detached volume to a running instance in the same zone. Mount it inside the instance afterwards.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/volumes#attach-a-volume"
          },
          "response": []
        },
        {
          "name": "Detach a volume",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id/detach",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id",
                "detach"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Detaches a volume from its instance. Unmount it inside the instance first, or data being written may be lost.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/volumes#detach-a-volume"
          },
          "response": []
        },
        {
          "name": "Grow a volume",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id/resize",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id",
                "resize"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"disk_offering_slug\": \"medium-20gb\",\n  \"size_gb\": 20\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Grows a volume to a bigger offering, or to a bigger `size_gb` of a custom-size offering. Volumes only grow. Extend the file system from inside the instance afterwards. No upfront charge: the larger size is billed hourly.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/volumes#grow-a-volume"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Databases",
      "description": "A database is a single-node PostgreSQL, MySQL or MariaDB server that the platform runs and patches for you, on its own VM sized by a [plan](/api/catalogue). It never has a public address: connect to its `hostname` from your own network, through the CIDRs its access rules allow. See [Managed databases](/databases/overview) for the guide.\n\nCreating one places an [order](/api/database-orders), paid for like an instance. Every other change returns an [operation](/api/operations) to follow. The admin password is never stored or returned, except once: in the response that generated it.\n\nThe data disk starts at the plan's size, or `storage_gb`, and [grows later](/databases/storage) without a restart. [Snapshots](/databases/snapshots) of it are crash-consistent copies, listed under the database and in the account's [snapshots](/api/snapshots). [Database error codes](/databases/errors) explains every refusal.",
      "item": [
        {
          "name": "List database engines",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/database-engines",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "database-engines"
              ]
            },
            "description": "The engines and version lines you can create a managed database with: PostgreSQL, MySQL and MariaDB, long-term-support lines only. A version appears only while it is offered for new databases, and `zones` lists the zones it can be created in. An engine with no offered version has an empty `versions` list.\n\nUse `engine` and a `version` from here, and a zone from that version's `zones`, in *Create a database*.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#list-database-engines"
          },
          "response": []
        },
        {
          "name": "List databases",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/databases",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `running`, `stopped` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ]
            },
            "description": "Your managed databases, oldest first, with each one's hostname, state and access rules. Filter by name with `q`, or by state. Never includes a password.\n\nDatabases whose create failed are hidden by default; list them with `observed_state=failed` (their failure is in `failure_code`), and delete them to clean up.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#list-databases"
          },
          "response": []
        },
        {
          "name": "Create a database",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"orders-db\",\n  \"engine\": \"postgresql\",\n  \"version\": \"18\",\n  \"plan_slug\": \"starter\",\n  \"zone_id\": \"af-abj-2\",\n  \"subnet_id\": \"snet_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a single-node PostgreSQL, MySQL or MariaDB database on its own server, sized by a plan (vCPU and memory), with its own data disk, and never on a public address. You connect to it by its `hostname` from your own network.\n\n**Placement.** Pick a zone where your engine version is offered (`GET /public/v1/database-engines`). In a VPC zone (`af-abj-2`) `subnet_id` is required, and unless you send `access_rules` the database starts allowing the subnet's VPC CIDR. In a standard zone (`af-abj-1`) leave out `subnet_id`; the database starts allowing nobody until you add access rules or attach security groups, and your instances reach it after *Add a private database network interface*.\n\n**Paid first, like an instance.** The request records an order and returns `202 Accepted` with it (`order_id`, also the `Location` header). The initial payment is then taken from credit, or else from the organization's default card, and the database is provisioned. It costs exactly what an instance of the same plan with no public address costs, with `storage_gb` as its disk (`amount_minor` is the upfront payment). Follow `GET /public/v1/database-orders/{order_id}` until `status` is `provisioned`, then read the database; `payment_failed` and `failed` are final, and any payment taken is returned to your credit.\n\n**Admin login.** Send `admin_username` to name the database's admin login, or leave it out for `dbadmin`. It is not a superuser: on PostgreSQL and MySQL it can create further users and databases; on MariaDB it is the only login.\n\n**Admin password.** Send `password` to choose it (16 to 128 printable ASCII characters, with no spaces, quotes or backslashes); it is never returned. Leave it out and a 32-character password is generated and **returned once, in this response** (`password`). Until provisioning starts the password is held only encrypted, then erased: it cannot be read again (use *Reset the password* for a new one). Every response is `Cache-Control: no-store`. Infrastructure-as-code tools should keep the password out of state (for Terraform, a write-only attribute).\n\n**Storage.** Leave out `storage_gb` for the plan's `disk_gb`, or ask for more: at most 2000 GB, and above the plan's size a multiple of 10 GB. Read each zone's allowed sizes and price from `storage` in `GET /public/v1/database-engines` rather than hard-coding them. It can be grown later with *Grow a database's storage*, never shrunk.\n\n**Idempotency.** Send an `Idempotency-Key`. A retry with the same key returns the original order with `password_returned: false` and a null `password`: a generated password is shown only on the first response.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#create-a-database"
          },
          "response": []
        },
        {
          "name": "Get a database",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "description": "One database: its connection `hostname` and `port`, `admin_username`, state, data disk size, access rules, attached security groups and the allow-list it applies (`effective_access_rules`). Never includes a password.\n\nA change you requested is in effect once `observed_generation` equals `generation`. Connect as `admin_username` to `hostname`:`port` from an address its allow-list includes.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#get-a-database"
          },
          "response": []
        },
        {
          "name": "Delete a database",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "description": "Deletes the database. Its hostname is removed first, then its server is retired. Its data disk and a safety snapshot of it are kept for a short retention period (12 and 24 hours) and then destroyed; nothing is billed for them during retention. Snapshots you took yourself are kept and stay billed until you delete them.\n\nOnce the delete succeeds, the part of the database's upfront payment that no invoice has drawn yet goes back to your organization's credit balance, never to the card. Usage up to the delete is invoiced as usual. A delete that fails returns nothing.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#delete-a-database"
          },
          "response": []
        },
        {
          "name": "Start a database",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/start",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "start"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "description": "Starts a stopped database. Its hostname, data and access rules are unchanged. A running database is billed for its plan again.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#start-a-database"
          },
          "response": []
        },
        {
          "name": "Stop a database",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/stop",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "stop"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "description": "Shuts the database down cleanly. A stopped database keeps its data, hostname and access rules, refuses connections, and is billed for its storage only. Start it again with *Start a database*.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#stop-a-database"
          },
          "response": []
        },
        {
          "name": "Replace access rules",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/access-rules",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "access-rules"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"rules\": [\n    {\n      \"cidr\": \"10.0.1.0/24\"\n    },\n    {\n      \"cidr\": \"10.250.3.17/32\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Replaces the database's whole allow-list. Each rule allows TCP to the engine's port (5432 for PostgreSQL, 3306 for MySQL and MariaDB) from one IPv4 CIDR. Send `[]` to remove every rule. To let one instance in, allow its address as a `/32`: in a standard zone, use the instance's `private_network_ip` after *Add a private database network interface*.\n\nLimits: an IPv4 CIDR with a prefix of `/8` or longer (host bits are masked, so `10.0.1.7/24` becomes `10.0.1.0/24`); never `0.0.0.0/0`; at most 50 rules; no range twice. These rules plus the ranges added by attached security groups may total at most 1024.\n\nRemoving a rule also ends connections already open from that range. Returns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The new list is in effect once the database's `observed_generation` equals its `generation`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#replace-access-rules"
          },
          "response": []
        },
        {
          "name": "Set the password",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/password",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "password"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"password\": \"c0rrect-H0rse-battery-St4ple\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Sets the admin login's password to one you choose: 16 to 128 printable ASCII characters, with no spaces, single or double quotes, or backslashes. It is applied inside the database and never stored or returned. The database must be running. Existing connections stay open; new ones need the new password once the operation succeeds.\n\nUse this from infrastructure-as-code to rotate a password you manage; use *Reset the password* to have one generated instead. The response is `Cache-Control: no-store`.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#set-the-password"
          },
          "response": []
        },
        {
          "name": "Reset the password",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/reset-password",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "reset-password"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "description": "Replaces the admin login's password with a generated one (32 letters and digits), returned once in this response (`password`) with `Cache-Control: no-store`, and never stored. The database must be running. Use this when the password is lost: support cannot recover it.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The new password works once the operation succeeds.\n\n**Idempotency.** Send an `Idempotency-Key`. A retry with the same key returns the original operation with `password_returned: false` and a null `password`: if the first response was lost, reset again with a new key.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#reset-the-password"
          },
          "response": []
        },
        {
          "name": "Attach security groups",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/security-groups",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "security-groups"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"security_group_ids\": [\n    \"sg_06gk3x9tq7m2v8r4y1c5d0zp8w\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Replaces the set of your security groups attached to the database; `[]` detaches every group. At most 5, each one of your own security groups in the database's zone that is not being deleted or failed. Another organization's group is reported as not found.\n\nA group is only a **source of address ranges** for the database: each of its **ingress** rules whose protocol is `tcp` or `all`, whose ports include the engine's port (5432 or 3306; a range such as `3000-4000`, or all ports, counts) and whose CIDR is IPv4 with a prefix of `/8` or longer adds its CIDR to the database's allow-list, beside its own access rules. Every other rule (other ports, egress, `udp`, `icmp`, `0.0.0.0/0` and anything wider than `/8`, IPv6) is ignored for the database and listed in `ignored_security_group_rules` with the reason. The group itself is never applied to the database server, and SSH to it is never opened. The database's access rules plus the ranges its groups add may total at most 1024.\n\nWhen an attached group's rules change, the database is updated automatically. A group cannot be deleted while a database uses it (`409 SECURITY_GROUP_ATTACHED_TO_DATABASE`); detach it here first.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#attach-security-groups"
          },
          "response": []
        },
        {
          "name": "Grow a database's storage",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/resize-storage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "resize-storage"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"storage_gb\": 200\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Grows the database's data disk to `storage_gb`. vCPU and memory stay the plan's. The disk only grows: `storage_gb` must be larger than the current `data_volume_size_gb`, at most 2000 GB and a multiple of 10 GB (read the zone's limits from `storage` in `GET /public/v1/database-engines` rather than hard-coding them). The database must be running; the filesystem grows online, without a restart. One resize at a time.\n\nNo upfront charge, as for an instance resize: storage is billed hourly, at the new size only once the resize has completed. While it runs, `pending_data_volume_size_gb` shows the size in flight; `data_volume_size_gb` changes when it succeeds. A failed resize leaves the size and the bill unchanged.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#grow-a-databases-storage"
          },
          "response": []
        },
        {
          "name": "List a database's snapshots",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/snapshots",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "snapshots"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "description": "Snapshots of the database's data disk, oldest first. Each is also listed in `GET /public/v1/snapshots`, with `database_id` set.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#list-a-databases-snapshots"
          },
          "response": []
        },
        {
          "name": "Snapshot a database",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/snapshots",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "snapshots"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"pre-upgrade\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Takes a snapshot of the database's data disk. The engine keeps running, so the snapshot is **crash-consistent only**: what the disk held at that instant, as after a power cut, which the engine recovers from on start. It is not an engine-level backup; stop the database first for a quiesced copy. The database must be running or stopped.\n\nBilled like every snapshot: the storage rate on its physical size, for every started hour until it is deleted. A snapshot outlives its database and stays billed until you delete it. Restoring a database from a snapshot is not available yet.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The new snapshot's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#snapshot-a-database"
          },
          "response": []
        },
        {
          "name": "Get a database's snapshot",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/snapshots/:snapshot_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "snapshots",
                ":snapshot_id"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                },
                {
                  "key": "snapshot_id",
                  "value": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The snapshot's id, e.g. `snap_...`."
                }
              ]
            },
            "description": "One snapshot of the database's data disk.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#get-a-databases-snapshot"
          },
          "response": []
        },
        {
          "name": "Delete a database's snapshot",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/databases/:database_id/snapshots/:snapshot_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "databases",
                ":database_id",
                "snapshots",
                ":snapshot_id"
              ],
              "variable": [
                {
                  "key": "database_id",
                  "value": "db_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The database's id, e.g. `db_...`."
                },
                {
                  "key": "snapshot_id",
                  "value": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The snapshot's id, e.g. `snap_...`."
                }
              ]
            },
            "description": "Deletes one snapshot of the database's data disk. It is billed until the deletion completes.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/databases#delete-a-databases-snapshot"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Database orders",
      "description": "Creating a database places an order. The order takes the initial payment, from credit or else the organization's default card, and then provisions the database. Poll the order until its `status` is `provisioned` (the database is ready to read), `failed` or `payment_failed`. An order never includes the password.",
      "item": [
        {
          "name": "List database orders",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/database-orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "database-orders"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                }
              ]
            },
            "description": "Your database orders, newest first, one per *Create a database* call. An order shows whether the initial payment was taken and whether provisioning started. Never includes a password.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/database-orders#list-database-orders"
          },
          "response": []
        },
        {
          "name": "Get a database order",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/database-orders/:order_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "database-orders",
                ":order_id"
              ],
              "variable": [
                {
                  "key": "order_id",
                  "value": "ord_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Payment and provisioning progress for one new database. Poll it after *Create a database* until `status` is `provisioned` (then read the database at `GET /public/v1/databases/{database_id}`), or `payment_failed` or `failed` (final: any payment taken is returned to your credit, and `failure_code` says why). Once `operation_id` is set you can also follow that operation. Never includes a password.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/database-orders#get-a-database-order"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Kubernetes",
      "description": "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](/api/networks); in a standard zone leave `subnet_id` out. `control_nodes` is 1, or 3 where the version list's `ha_zone_ids` offers it.\n\nEvery change returns an [operation](/api/operations) 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](/kubernetes/overview).",
      "item": [
        {
          "name": "List Kubernetes versions",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-versions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-versions"
              ],
              "query": [
                {
                  "key": "zone_id",
                  "value": "",
                  "description": "Only versions in this zone.",
                  "disabled": true
                }
              ]
            },
            "description": "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.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#list-kubernetes-versions"
          },
          "response": []
        },
        {
          "name": "List Kubernetes clusters",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters"
              ]
            },
            "description": "Your Kubernetes clusters, newest first. Deleted and failed clusters are left out.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#list-kubernetes-clusters"
          },
          "response": []
        },
        {
          "name": "Create a Kubernetes cluster",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"prod-web\",\n  \"zone_id\": \"af-abj-2\",\n  \"kubernetes_version_id\": \"k8sv_06gk3x9tq7m2v8r4y1c5d0zp8w\",\n  \"subnet_id\": \"snet_06gk3x9tq7m2v8r4y1c5d0zp8w\",\n  \"node_plan\": \"s-2vcpu-4gb\",\n  \"control_nodes\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "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`.\n\nReturns `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`.\n\nSend 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`.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#create-a-kubernetes-cluster"
          },
          "response": []
        },
        {
          "name": "Get a Kubernetes cluster",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "description": "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.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#get-a-kubernetes-cluster"
          },
          "response": []
        },
        {
          "name": "Change a Kubernetes cluster",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "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. 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`.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#change-a-kubernetes-cluster"
          },
          "response": []
        },
        {
          "name": "Delete a Kubernetes cluster",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "description": "Deletes the cluster. It stops at once, disappears from your lists and stops billing; its nodes and disks are destroyed 12 hours later 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`.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#delete-a-kubernetes-cluster"
          },
          "response": []
        },
        {
          "name": "Upgrade a Kubernetes cluster",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/upgrade",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "upgrade"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"kubernetes_version_id\": \"k8sv_07hm4y0ur8n3w9s5z2d6e1aq9x\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "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.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#upgrade-a-kubernetes-cluster"
          },
          "response": []
        },
        {
          "name": "Resize worker node compute plan",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/resize-plan",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "resize-plan"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"node_plan\": \"s-2vcpu-4gb\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Resizes the compute plan of worker nodes in the cluster via zero-downtime rolling replacement.\nA new worker node with the updated plan is provisioned, joins the cluster, workloads migrate, and the old node is retired.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#resize-worker-node-compute-plan"
          },
          "response": []
        },
        {
          "name": "Start a Kubernetes cluster",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/start",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "start"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "description": "Starts a stopped cluster. Its nodes are billed for compute again once it runs.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#start-a-kubernetes-cluster"
          },
          "response": []
        },
        {
          "name": "Upgrade Kubernetes cluster networking",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/upgrade-network",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "upgrade-network"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Reconfigures the CNI plugin (`flannel`, `wireguard`, `calico`), Pod CIDR, Service CIDR, or API allowed CIDR ranges for the cluster.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#upgrade-kubernetes-cluster-networking"
          },
          "response": []
        },
        {
          "name": "Stop a Kubernetes cluster",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/stop",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "stop"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "description": "Stops a running cluster. While stopped only its disks are billed.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#stop-a-kubernetes-cluster"
          },
          "response": []
        },
        {
          "name": "Download a kubeconfig",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/kubeconfig",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "kubeconfig"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "description": "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`.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#download-a-kubeconfig"
          },
          "response": []
        },
        {
          "name": "List a cluster's nodes",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/nodes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "nodes"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": ""
                }
              ]
            },
            "description": "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.\n\nErrors: `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).\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#list-a-clusters-nodes"
          },
          "response": []
        },
        {
          "name": "Get a cluster's services and pods",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/workloads",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "workloads"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": ""
                }
              ]
            },
            "description": "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.\n\nErrors: `404 KUBERNETES_CLUSTER_NOT_FOUND`; `409 KUBERNETES_CLUSTER_NOT_RUNNING`; `503 KUBERNETES_API_UNREACHABLE` (retry).\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#get-a-clusters-services-and-pods"
          },
          "response": []
        },
        {
          "name": "Apply a manifest to a cluster",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/apply-manifest",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "apply-manifest"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": ""
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"manifest\": \"manifest\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "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.\n\nErrors: `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).\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#apply-a-manifest-to-a-cluster"
          },
          "response": []
        },
        {
          "name": "Export a cluster's workloads as YAML",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/live-manifests",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "live-manifests"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": ""
                }
              ]
            },
            "description": "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.\n\nErrors: `404 KUBERNETES_CLUSTER_NOT_FOUND`; `409 KUBERNETES_CLUSTER_NOT_RUNNING`; `503 KUBERNETES_API_UNREACHABLE` (retry).\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#export-a-clusters-workloads-as-yaml"
          },
          "response": []
        },
        {
          "name": "Expose a Kubernetes service",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/expose-service",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "expose-service"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": ""
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"service_name\": \"service-name\",\n  \"public_port\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "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.\n\nPublic 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.\n\nErrors: `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).\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#expose-a-kubernetes-service"
          },
          "response": []
        },
        {
          "name": "Sync a cluster's public routing",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/sync-routing",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "sync-routing"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": ""
                }
              ]
            },
            "description": "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.\n\nEvery 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.\n\nErrors: `404 KUBERNETES_CLUSTER_NOT_FOUND`; `409 PORT_IN_USE`; `409 KUBERNETES_ROUTING_UNAVAILABLE` (a cluster with no VPC address); `409 KUBERNETES_CLUSTER_NOT_RUNNING`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#sync-a-clusters-public-routing"
          },
          "response": []
        },
        {
          "name": "List node pools",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/node-pools",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "node-pools"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "description": "Lists the cluster's node pools.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#list-node-pools"
          },
          "response": []
        },
        {
          "name": "Create a node pool",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/node-pools",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "node-pools"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"cpu-workers\",\n  \"plan_id\": \"standard-2\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "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`).\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#create-a-node-pool"
          },
          "response": []
        },
        {
          "name": "Scale a node pool",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/node-pools/:pool_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "node-pools",
                ":pool_id"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                },
                {
                  "key": "pool_id",
                  "value": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The node pool's id (`k8spool_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Changes a node pool's worker count and autoscaling. The body is the pool's whole size.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#scale-a-node-pool"
          },
          "response": []
        },
        {
          "name": "Delete a node pool",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/node-pools/:pool_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "node-pools",
                ":pool_id"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                },
                {
                  "key": "pool_id",
                  "value": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The node pool's id (`k8spool_…`)."
                }
              ]
            },
            "description": "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`.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#delete-a-node-pool"
          },
          "response": []
        },
        {
          "name": "List cluster add-ons",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/addons",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "addons"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "description": "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.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#list-cluster-add-ons"
          },
          "response": []
        },
        {
          "name": "Toggle a cluster add-on",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/addons/:addon_name/toggle",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "addons",
                ":addon_name",
                "toggle"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                },
                {
                  "key": "addon_name",
                  "value": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The add-on: `metrics-server`, `csi-driver` or `ingress-controller`. Any other name is `422 INVALID_CLUSTER_ADDON`."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"enabled\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "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`).\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#toggle-a-cluster-add-on"
          },
          "response": []
        },
        {
          "name": "Configure API server endpoint access",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/kubernetes-clusters/:cluster_id/endpoint-access",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "kubernetes-clusters",
                ":cluster_id",
                "endpoint-access"
              ],
              "variable": [
                {
                  "key": "cluster_id",
                  "value": "k8s_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The cluster's id (`k8s_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"endpoint_access\": \"public\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Updates the cluster API endpoint access mode (`public`, `private`, or `dual`) and authorized CIDRs.\n\nDocs: https://docs.pantechdynamics.com/api/kubernetes#configure-api-server-endpoint-access"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Snapshots",
      "description": "A snapshot copies an instance's root disk, a volume or a [database's data disk](/databases/snapshots) at the moment it is taken; exactly one of `instance_id`, `volume_id` and `database_id` is set. Restore an instance's own snapshot with `POST /instances/{instance_id}/restore`, or turn any snapshot into a new volume with `POST /snapshots/{snapshot_id}/restore`. A schedule takes snapshots automatically and keeps the newest `retention_count`.",
      "item": [
        {
          "name": "List an instance's snapshots",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/snapshots",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "snapshots"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Snapshots of this instance's root disk, oldest first.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#list-an-instances-snapshots"
          },
          "response": []
        },
        {
          "name": "Snapshot an instance",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/snapshots",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "snapshots"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"pre-upgrade\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Takes a snapshot of the instance's root disk, named `name` (unique among this instance's snapshots). A snapshot of a running instance is crash-consistent: what the disk held at that instant. Billed on its physical size, hourly, until deleted.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The new snapshot's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#snapshot-an-instance"
          },
          "response": []
        },
        {
          "name": "Get an instance's snapshot schedule",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/snapshot-schedule",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "snapshot-schedule"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "The instance's automatic snapshot schedule: how often a snapshot of its root disk is taken, how many are kept, and when the next one runs.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#get-an-instances-snapshot-schedule"
          },
          "response": []
        },
        {
          "name": "Set an instance's snapshot schedule",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/snapshot-schedule",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "snapshot-schedule"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"frequency\": \"daily\",\n  \"retention_count\": 7\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Turns automatic snapshots of the root disk on, changes them, or pauses them with `enabled: false`. `frequency` is `daily`, `weekly` or `monthly`; `retention_count` (1 to 168, default 7) successful snapshots are kept and older automatic ones are deleted. Automatic snapshots are billed like manual ones.\n\nReturns the schedule at once (`200`); no operation to follow. Send an `Idempotency-Key`: a retry with the same key and settings returns the same schedule.\n\n**Scope:** `write`. Lowering `retention_count` deletes the oldest copies, so an AI app's key also needs `delete` for that (`403 INSUFFICIENT_SCOPE` otherwise).\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#set-an-instances-snapshot-schedule"
          },
          "response": []
        },
        {
          "name": "List a volume's snapshots",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id/snapshots",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id",
                "snapshots"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Snapshots of this volume, oldest first.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#list-a-volumes-snapshots"
          },
          "response": []
        },
        {
          "name": "Snapshot a volume",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id/snapshots",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id",
                "snapshots"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"pre-upgrade\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Takes a snapshot of the volume, named `name`. A snapshot of an attached volume is crash-consistent. Billed on its physical size, hourly, until deleted.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The new snapshot's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#snapshot-a-volume"
          },
          "response": []
        },
        {
          "name": "Get a volume's snapshot schedule",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id/snapshot-schedule",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id",
                "snapshot-schedule"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "The volume's automatic snapshot schedule: how often a snapshot of its volume is taken, how many are kept, and when the next one runs.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#get-a-volumes-snapshot-schedule"
          },
          "response": []
        },
        {
          "name": "Set a volume's snapshot schedule",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id/snapshot-schedule",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id",
                "snapshot-schedule"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"frequency\": \"daily\",\n  \"retention_count\": 7\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Turns automatic snapshots of the volume on, changes them, or pauses them with `enabled: false`. `frequency` is `daily`, `weekly` or `monthly`; `retention_count` (1 to 168, default 7) successful snapshots are kept and older automatic ones are deleted. Automatic snapshots are billed like manual ones.\n\nReturns the schedule at once (`200`); no operation to follow. Send an `Idempotency-Key`: a retry with the same key and settings returns the same schedule.\n\n**Scope:** `write`. Lowering `retention_count` deletes the oldest copies, so an AI app's key also needs `delete` for that (`403 INSUFFICIENT_SCOPE` otherwise).\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#set-a-volumes-snapshot-schedule"
          },
          "response": []
        },
        {
          "name": "List snapshots",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/snapshots",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "snapshots"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Only items whose name contains this text (case-insensitive), at most 255 characters.",
                  "disabled": true
                },
                {
                  "key": "desired_state",
                  "value": "",
                  "description": "Only items with this `desired_state`: `present` or `deleted`.",
                  "disabled": true
                },
                {
                  "key": "observed_state",
                  "value": "",
                  "description": "Only items with this `observed_state`.",
                  "disabled": true
                }
              ]
            },
            "description": "Every snapshot in your organization: of instances' root disks, of volumes, and of databases' data disks. `instance_id`, `volume_id` or `database_id` says which.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#list-snapshots"
          },
          "response": []
        },
        {
          "name": "Price a snapshot",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/snapshots/quote?size_gb=20",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "snapshots",
                "quote"
              ],
              "query": [
                {
                  "key": "size_gb",
                  "value": "20",
                  "description": "",
                  "disabled": false
                }
              ]
            },
            "description": "What a snapshot of `size_gb` GB costs per month, in your organization's currency. A snapshot is billed on its physical size.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#price-a-snapshot"
          },
          "response": []
        },
        {
          "name": "Get a snapshot",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/snapshots/:snapshot_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "snapshots",
                ":snapshot_id"
              ],
              "variable": [
                {
                  "key": "snapshot_id",
                  "value": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One snapshot.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#get-a-snapshot"
          },
          "response": []
        },
        {
          "name": "Delete a snapshot",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/snapshots/:snapshot_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "snapshots",
                ":snapshot_id"
              ],
              "variable": [
                {
                  "key": "snapshot_id",
                  "value": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Deletes a snapshot of an instance, volume or database. It is billed until the deletion completes.\n\nReturns `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`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#delete-a-snapshot"
          },
          "response": []
        },
        {
          "name": "Restore a snapshot to a new volume",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/snapshots/:snapshot_id/restore",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "snapshots",
                ":snapshot_id",
                "restore"
              ],
              "variable": [
                {
                  "key": "snapshot_id",
                  "value": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"data-restored\",\n  \"disk_offering_slug\": \"medium-20gb\",\n  \"size_gb\": 20\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a new volume from an instance or volume snapshot, of `disk_offering_slug` and at least the snapshot's size. A database snapshot cannot be restored yet. To roll an instance's root disk back to its snapshot instead, use *Restore an instance from a snapshot*.\n\nReturns `202 Accepted` with an `operation_id` (also in the `Location` header). The change happens in the background: poll `GET /public/v1/operations/{operation_id}`, or stream `/events`, until `status` is `succeeded` or `failed`; a failed operation carries a stable `failure.code` and a readable `failure.reason`. The new volume's id is the operation's `resource_id`.\n\nSend an `Idempotency-Key`. A retry with the same key returns the original operation instead of making the change twice.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/snapshots#restore-a-snapshot-to-a-new-volume"
          },
          "response": []
        }
      ]
    },
    {
      "name": "SSH keys",
      "description": "Images have no password login, so give every new instance an SSH key. Register your own public key, or have a key pair generated. Its private key is returned once and never again.",
      "item": [
        {
          "name": "List SSH keys",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/ssh-keys",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "ssh-keys"
              ]
            },
            "description": "The SSH keys you can install on new instances.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/ssh-keys#list-ssh-keys"
          },
          "response": []
        },
        {
          "name": "Add or generate an SSH key",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/ssh-keys",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "ssh-keys"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"deploy\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Send `public_key` to register your own OpenSSH public key. Leave it out to have a key pair generated: the private key is returned in this response only and never stored. Returns `201` at once; there is no operation to follow.\n\n**Idempotency:** a retry with the same `Idempotency-Key` is not replayed yet. If a request may have gone through, list your SSH keys before retrying: a second attempt with the same name returns `409 SSH_KEY_NAME_TAKEN`, and a generated private key is never shown again.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/ssh-keys#add-or-generate-an-ssh-key"
          },
          "response": []
        },
        {
          "name": "Get an SSH key",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/ssh-keys/:ssh_key_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "ssh-keys",
                ":ssh_key_id"
              ],
              "variable": [
                {
                  "key": "ssh_key_id",
                  "value": "sshk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One SSH key.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/ssh-keys#get-an-ssh-key"
          },
          "response": []
        },
        {
          "name": "Delete an SSH key",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/ssh-keys/:ssh_key_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "ssh-keys",
                ":ssh_key_id"
              ],
              "variable": [
                {
                  "key": "ssh_key_id",
                  "value": "sshk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Deletes an SSH key. Instances that already have it keep it in their `authorized_keys`; remove it there yourself.\n\n**Idempotency:** a retry is not replayed. Once the key is deleted, a repeat returns `404`; treat that as done.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/ssh-keys#delete-an-ssh-key"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks",
      "description": "A webhook is an `https` URL that Pantech `POST`s a signed JSON event to whenever something it subscribes to happens: an [operation](/api/operations) finishing or failing, an invoice, a payment, credit running low. Subscribe to exact types from `GET /webhook-event-types`, to one resource with `<resource>.*`, or to everything with `*`. The signing secret (`whsec_…`) is returned only when the webhook is created and when its secret is rotated.\n\nVerify every delivery's `Pantech-Signature` before trusting it, and deduplicate on the event `id`: delivery is at least once and unordered. See the [webhooks guide](/webhooks/overview), [verifying signatures](/webhooks/verify-signatures) and the [event types](/webhooks/event-types).",
      "item": [
        {
          "name": "List webhook event types",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhook-event-types",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhook-event-types"
              ]
            },
            "description": "Every event type a webhook can subscribe to, with what it means. Subscribe to an exact type, to every type of one resource with `<resource>.*` (for example `instance.*`), or to everything with `*`.\n\nInfrastructure events are named `<resource>.<past tense>` when a change finished (`instance.created`, `volume.attached`) and `<resource>.<verb>_failed` when it failed (`instance.create_failed`).\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#list-webhook-event-types"
          },
          "response": []
        },
        {
          "name": "List webhooks",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "description": "Your organization's webhooks: the URLs Pantech sends events to. The signing secret is never part of a webhook; it is shown once, when the webhook is created and when its secret is rotated.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#list-webhooks"
          },
          "response": []
        },
        {
          "name": "Create a webhook",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com/hooks/pantech\",\n  \"events\": [\n    \"instance.*\",\n    \"invoice.paid\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Adds a URL Pantech sends events to. Every delivery is a JSON `POST` signed with the webhook's secret, which is in this response only: store it now.\n\n**Verifying a delivery.** Each request carries `Pantech-Signature: t=<unix seconds>,v1=<hex>`. Compute HMAC-SHA256 of `<t>.<raw body>` with the secret and compare it, in constant time, with any `v1` value; reject a `t` more than five minutes old. During the 24 hours after a rotation there are two `v1` values, one per secret. `Pantech-Event-Id`, `Pantech-Event-Type` and `Pantech-Delivery-Id` name what was sent.\n\n**Delivery.** Any `2xx` within 10 seconds is success. Anything else, including a redirect, is retried after 1 minute, 5 minutes, 30 minutes, 2 hours, 5 hours, 10 hours and 10 hours, then marked failed. A webhook that has failed for three days without a single success is disabled. Events can arrive more than once and out of order: deduplicate on the event `id`.\n\nAt most 10 webhooks per organization. Owners and admins only.\n\n**Idempotency:** a retry with the same `Idempotency-Key` returns the webhook the first request made, with `secret: null`: the secret is never shown again. The same key with a different request returns `409 IDEMPOTENCY_CONFLICT`.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#create-a-webhook"
          },
          "response": []
        },
        {
          "name": "Get a webhook",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:webhook_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":webhook_id"
              ],
              "variable": [
                {
                  "key": "webhook_id",
                  "value": "whk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The webhook's id (`whk_…`)."
                }
              ]
            },
            "description": "One webhook. `failing_since` is when its deliveries started failing without a success since; null while they succeed.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#get-a-webhook"
          },
          "response": []
        },
        {
          "name": "Change a webhook",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:webhook_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":webhook_id"
              ],
              "variable": [
                {
                  "key": "webhook_id",
                  "value": "whk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The webhook's id (`whk_…`)."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"enabled\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Changes the URL, description, events or `enabled`; fields you leave out keep their value. Enabling a disabled webhook clears its failure history. Deliveries still waiting for a disabled webhook are cancelled when they come due.\n\n**Idempotency:** the same request applied twice leaves the webhook the same.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#change-a-webhook"
          },
          "response": []
        },
        {
          "name": "Delete a webhook",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:webhook_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":webhook_id"
              ],
              "variable": [
                {
                  "key": "webhook_id",
                  "value": "whk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The webhook's id (`whk_…`)."
                }
              ]
            },
            "description": "Deletes a webhook and its delivery history. Nothing more is sent to it.\n\n**Idempotency:** a retry is not replayed. Once the webhook is deleted, a repeat returns `404`; treat that as done.\n\n**Scope:** `write`. Destructive: an AI app's key also needs `delete`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#delete-a-webhook"
          },
          "response": []
        },
        {
          "name": "Send a test event",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:webhook_id/test",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":webhook_id",
                "test"
              ],
              "variable": [
                {
                  "key": "webhook_id",
                  "value": "whk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The webhook's id (`whk_…`)."
                }
              ]
            },
            "description": "Queues a `webhook.test` event to this webhook, whatever it subscribes to, and returns the delivery. It is sent within a few seconds and retried like any other.\n\n**Idempotency:** a retry is not replayed: each request sends another test event.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#send-a-test-event"
          },
          "response": []
        },
        {
          "name": "Rotate a webhook's secret",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:webhook_id/rotate-secret",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":webhook_id",
                "rotate-secret"
              ],
              "variable": [
                {
                  "key": "webhook_id",
                  "value": "whk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The webhook's id (`whk_…`)."
                }
              ]
            },
            "description": "Replaces the signing secret, which is in this response only. For 24 hours every delivery is signed with both the new and the old secret, so you can update your receiver without dropping events.\n\n**Idempotency:** a retry is not replayed: each request rotates again, and only the latest secret and the one before it sign.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#rotate-a-webhooks-secret"
          },
          "response": []
        },
        {
          "name": "List a webhook's deliveries",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:webhook_id/deliveries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":webhook_id",
                "deliveries"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                }
              ],
              "variable": [
                {
                  "key": "webhook_id",
                  "value": "whk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The webhook's id (`whk_…`)."
                }
              ]
            },
            "description": "Every event sent or waiting to be sent to this webhook, newest first, kept for 30 days: its status, attempts, and how the last attempt went.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#list-a-webhooks-deliveries"
          },
          "response": []
        },
        {
          "name": "Get a delivery",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:webhook_id/deliveries/:delivery_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":webhook_id",
                "deliveries",
                ":delivery_id"
              ],
              "variable": [
                {
                  "key": "webhook_id",
                  "value": "whk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The webhook's id (`whk_…`)."
                },
                {
                  "key": "delivery_id",
                  "value": "whd_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The delivery's id (`whd_…`)."
                }
              ]
            },
            "description": "One delivery, with `payload`: the exact body sent.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#get-a-delivery"
          },
          "response": []
        },
        {
          "name": "Send a delivery again",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:webhook_id/deliveries/:delivery_id/redeliver",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":webhook_id",
                "deliveries",
                ":delivery_id",
                "redeliver"
              ],
              "variable": [
                {
                  "key": "webhook_id",
                  "value": "whk_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The webhook's id (`whk_…`)."
                },
                {
                  "key": "delivery_id",
                  "value": "whd_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The delivery's id (`whd_…`)."
                }
              ]
            },
            "description": "Queues a delivery that succeeded, failed or was cancelled to be sent again from its first attempt, with the same event `id`.\n\n**Idempotency:** a retry while it is being sent returns `409 WEBHOOK_DELIVERY_IN_PROGRESS`; treat that as done.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/webhooks#send-a-delivery-again"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Operations",
      "description": "Every asynchronous write returns `202` with an `operation_id`. Poll the operation until its `status` is `succeeded` or `failed`, or open its event stream and wait. Polling every 2–5 seconds is plenty.",
      "item": [
        {
          "name": "Get an operation",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/operations/:operation_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "operations",
                ":operation_id"
              ],
              "variable": [
                {
                  "key": "operation_id",
                  "value": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "One asynchronous operation. Every write that returns `202` gives you its `operation_id`: poll this until `status` is `succeeded` or `failed` (wait a second or two between polls), or use *Stream an operation* instead.\n\nA failed operation has `failure.code`, a stable code to branch on, and `failure.reason`, a readable sentence safe to show to your users.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/operations#get-an-operation"
          },
          "response": []
        },
        {
          "name": "Stream an operation",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/operations/:operation_id/events",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "operations",
                ":operation_id",
                "events"
              ],
              "variable": [
                {
                  "key": "operation_id",
                  "value": "op_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Server-Sent Events for one operation: an `operation` event (data: the Operation) each time it changes, ending when it succeeds or fails. A `: keepalive` comment is sent while it is idle. Use it instead of polling.\n\nIf the stream stops before the operation finishes, its last event is `error`, with data `{\"code\", \"detail\", \"request_id\"}`: `OPERATION_STREAM_UNAVAILABLE` after 30 seconds of failing to read the operation, `UNAUTHENTICATED` within 30 seconds of the key being revoked or expiring, or `OPERATION_STREAM_TIMEOUT` after 15 minutes open. Reconnect, or poll `GET /public/v1/operations/{operation_id}`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/operations#stream-an-operation"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Usage",
      "description": "Usage is measured per resource and rated into cost. `GET /usage/by-resource` answers \"what did each thing cost\"; the other endpoints return the measured quantities.",
      "item": [
        {
          "name": "Get an instance's usage",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/instances/:instance_id/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "instances",
                ":instance_id",
                "usage"
              ],
              "variable": [
                {
                  "key": "instance_id",
                  "value": "vm_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Measured usage for this instance in the current billing period: running hours, storage, memory and network.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/usage#get-an-instances-usage"
          },
          "response": []
        },
        {
          "name": "Get a volume's usage",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/volumes/:volume_id/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "volumes",
                ":volume_id",
                "usage"
              ],
              "variable": [
                {
                  "key": "volume_id",
                  "value": "vol_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Measured storage usage for this volume in the current billing period.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/usage#get-a-volumes-usage"
          },
          "response": []
        },
        {
          "name": "Get a snapshot's usage",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/snapshots/:snapshot_id/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "snapshots",
                ":snapshot_id",
                "usage"
              ],
              "variable": [
                {
                  "key": "snapshot_id",
                  "value": "snap_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The resource's id."
                }
              ]
            },
            "description": "Measured storage usage for this snapshot in the current billing period.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/usage#get-a-snapshots-usage"
          },
          "response": []
        },
        {
          "name": "Get usage",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "usage"
              ]
            },
            "description": "Measured usage for the whole organization in the current billing period.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/usage#get-usage"
          },
          "response": []
        },
        {
          "name": "Get cost by resource",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/usage/by-resource",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "usage",
                "by-resource"
              ],
              "query": [
                {
                  "key": "period",
                  "value": "",
                  "description": "",
                  "disabled": true
                }
              ]
            },
            "description": "What each resource cost over `period`: the last `30d` or `7d`, this `month` or `last_month`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/usage#get-cost-by-resource"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Billing",
      "description": "Check your credit before creating resources from automation, or poll it so you can top up in time. `standing` tells you at a glance: `covered`, `low` or `empty`. Owners and admins are also emailed once when credit becomes low and once when it runs out.\n\nTo add credit, create a purchase and send its `checkout_url` to whoever pays. The link opens Flutterwave for organizations billed in NGN and Stripe for everyone else, so card details never pass through your systems or ours. Nothing is charged until the link is paid.",
      "item": [
        {
          "name": "Get credit",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/billing/credit",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "billing",
                "credit"
              ]
            },
            "description": "Your organization's credit, and how it compares with your next invoice.\n\n`estimated_next_invoice_minor` is usage so far this billing period plus the recent daily rate for the days left, plus 7.5% VAT on that (VAT applies only to the monthly invoice, never to credit purchases). It is an estimate: the invoice issued at `next_invoice_at` is the real figure. `standing` is `covered` when credit and prepaid instance payments cover the estimate, `low` when they don't, and `empty` when no credit is left. Anything credit doesn't cover is charged to your default payment method.\n\nCheck this before creating resources from automation, or poll it to top up in time. Owners and admins are also emailed once when credit becomes `low` and once when it becomes `empty`. To add credit, see *Buy credit*.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/billing#get-credit"
          },
          "response": []
        },
        {
          "name": "Buy credit",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A new value per change. To retry safely, resend with the same value."
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/billing/credit/purchases",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "billing",
                "credit",
                "purchases"
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount_minor\": 1059200\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "description": "Creates a payment link to add credit to your organization. Send `checkout_url` to whoever pays: it opens the payment provider's own secure page, so no card details ever pass through your systems or ours. Organizations pay in NGN or USD. The currency follows your organization's country and can't be chosen.\n\nNothing is charged until someone pays the link. The credit is added once the provider confirms the payment, usually within a minute: follow the purchase with `GET /public/v1/billing/credit/purchases/{purchase_id}` until `status` is `settled`, and the owners and admins get a receipt by email. A link that isn't paid expires at `checkout_expires_at`; create a new purchase after that.\n\nOne purchase is between NGN 500 and NGN 500,000 (`50000` to `50000000` kobo), or between USD 5 and USD 2,000 (`500` to `200000` cents).\n\nSend an `Idempotency-Key`: a retry with the same key returns the same purchase and the same link. The member who created the key must be an owner or admin with a verified email.\n\n**Scope:** `write`.\n\nDocs: https://docs.pantechdynamics.com/api/billing#buy-credit"
          },
          "response": []
        },
        {
          "name": "Get a credit purchase",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/billing/credit/purchases/:purchase_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "billing",
                "credit",
                "purchases",
                ":purchase_id"
              ],
              "variable": [
                {
                  "key": "purchase_id",
                  "value": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The purchase's id, e.g. `cpr_...`."
                }
              ]
            },
            "description": "One credit purchase: whether it has been paid. `checkout_url` is shown only while the purchase can still be paid. Poll this after *Buy credit* until `status` is `settled` (credit added), or `failed` or `expired` (nothing charged; create a new purchase).\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/billing#get-a-credit-purchase"
          },
          "response": []
        },
        {
          "name": "List receipts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/billing/receipts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "billing",
                "receipts"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "",
                  "description": "Items per page, 1 to 100. Defaults to 50.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "The previous page's `next_cursor`, to get the next page. Leave out for the first page; keep the other parameters the same.",
                  "disabled": true
                }
              ]
            },
            "description": "Every receipt issued to your organization, newest first. A receipt is issued, numbered `PTD-RCT-<year>-<number>`, whenever money moves: a card payment, a credit top-up, an invoice paid by card or from credit, a debit from your credit (for example a new instance's first charges), and a refund. A payment's receipt usually appears within a minute of it settling.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/billing#list-receipts"
          },
          "response": []
        },
        {
          "name": "Get a receipt",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/billing/receipts/:receipt_id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "billing",
                "receipts",
                ":receipt_id"
              ],
              "variable": [
                {
                  "key": "receipt_id",
                  "value": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The receipt's id, e.g. `rcp_...`."
                }
              ]
            },
            "description": "One receipt: what it was for, the amount, who issued it and the details printed on it. Download it as a PDF with `GET /public/v1/billing/receipts/{receipt_id}/pdf`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/billing#get-a-receipt"
          },
          "response": []
        },
        {
          "name": "Download a receipt",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/billing/receipts/:receipt_id/pdf",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "billing",
                "receipts",
                ":receipt_id",
                "pdf"
              ],
              "variable": [
                {
                  "key": "receipt_id",
                  "value": "id_06gk3x9tq7m2v8r4y1c5d0zp8w",
                  "description": "The receipt's id, e.g. `rcp_...`."
                }
              ]
            },
            "description": "The receipt as a PDF, the same document that was emailed. The file name is the receipt number, e.g. `PTD-RCT-2026-000123.pdf`.\n\n**Scope:** `read`.\n\nDocs: https://docs.pantechdynamics.com/api/billing#download-a-receipt"
          },
          "response": []
        }
      ]
    }
  ]
}
