Documentation

esc
    API reference · Platform / Catalogue

    Catalogue

    Regions, plans, images and disk offerings: what you can create, and what it costs.

    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).

    List regions

    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.

    GET/public/v1/regions
    Read keyReturns200OK

    Headers

    • Authorizationstringrequired

      Bearer and your API key: Bearer PAN_….

    Response 200

    Regions.
    • dataarray of Regionrequired
      Show 3 child fields
      • codestringrequired

        e.g. af-abj.

      • namestringrequired

        Its name for display.

      • placementsarray of objectrequired
        Show 5 child fields
        • kindstringrequired

          standard instances or vpc networks.

          One of standard, vpc.

        • zonestringrequired
        • availablebooleanrequired
        • unavailable_reasonstring or null
        • private_network_cidrstring or null

          The range of the zone's private database network, e.g. 10.250.0.0/20, when instances there can add a private network interface (POST /public/v1/instances/{instance_id}/private-network); null otherwise, and in every VPC zone. Allow this range nowhere in the security group of an instance with that interface.

    • next_cursorstring or nullrequired

      Always null: this list is returned whole.

    Errors

    • 401UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. Send Authorization: Bearer PAN_… with a valid key; create one in the console under Organization › API keys.
    • 403INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (read for GET, write for changes; an AI app's key also needs delete for a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access. FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin. AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps.
    • 429RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. Wait Retry-After seconds, then retry. For authenticated quota denials, RateLimit-Scope identifies the denying quota and RateLimit-Reset reports its remaining window in seconds.
    • 503SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.

    Every code is explained in Errors.

    Authorization
    curl "https://api.pantechdynamics.com/public/v1/regions" \
      -H "Authorization: Bearer $PANTECH_API_KEY"
    Response 200
    {
      "data": [
        {
          "code": "af-abj",
          "name": "Abuja",
          "placements": [
            {
              "kind": "standard",
              "zone": "af-abj-1",
              "available": true,
              "unavailable_reason": null,
              "private_network_cidr": "10.250.0.0/20"
            }
          ]
        }
      ],
      "next_cursor": null
    }

    List plans

    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.

    GET/public/v1/plans
    Read keyReturns200OK

    Headers

    • Authorizationstringrequired

      Bearer and your API key: Bearer PAN_….

    Query parameters

    • placementstring

      Price for standard instances or VPC instances.

      One of standard, vpc. Defaults to standard.

    Response 200

    Plans.
    • dataarray of Planrequired
      Show 8 child fields
      • idstringrequired

        The plan's id.

      • slugstringrequired

        Use this in plan_slug.

      • namestringrequired

        Its name for display.

      • vcpuintegerrequired

        Virtual CPUs.

      • memory_mbintegerrequired

        Memory in MB.

      • disk_gbintegerrequired

        Root disk in GB; for a database, the smallest data disk.

      • priceobject or null

        In the organization's currency; null when it cannot be priced.

        Show 4 child fields
        • currencystringrequired
        • monthly_estimate_minorintegerrequired

          A full month running.

        • storage_floor_minorintegerrequired

          A full month stopped (storage only).

        • initial_payment_minorintegerrequired

          Taken when the instance is ordered.

      • unpriced_reasonstring or null

        Why price is null; null when priced.

    • next_cursorstring or nullrequired

      Always null: this list is returned whole.

    Errors

    • 401UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. Send Authorization: Bearer PAN_… with a valid key; create one in the console under Organization › API keys.
    • 403INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (read for GET, write for changes; an AI app's key also needs delete for a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access. FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin. AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps.
    • 422VALIDATION_FAILED: a field is invalid. Each entry of errors names the field and its code: placement INVALID_PLACEMENT: use standard or vpc.
    • 429RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. Wait Retry-After seconds, then retry. For authenticated quota denials, RateLimit-Scope identifies the denying quota and RateLimit-Reset reports its remaining window in seconds.
    • 503SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.

    Every code is explained in Errors.

    Authorization
    Query
    curl "https://api.pantechdynamics.com/public/v1/plans" \
      -H "Authorization: Bearer $PANTECH_API_KEY"
    Response 200
    {
      "data": [
        {
          "id": "id",
          "slug": "slug",
          "name": "web-1",
          "vcpu": 2,
          "memory_mb": 4096,
          "disk_gb": 80,
          "price": {
            "currency": "NGN",
            "monthly_estimate_minor": 3760000,
            "storage_floor_minor": 460000,
            "initial_payment_minor": 1504000
          },
          "unpriced_reason": null
        }
      ],
      "next_cursor": null
    }

    List images

    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.

    Encrypted images (encrypted: true) appear only for organizations they are enabled for; elsewhere their slug is refused as IMAGE_NOT_FOUND.

    GET/public/v1/images
    Read keyReturns200OK

    Headers

    • Authorizationstringrequired

      Bearer and your API key: Bearer PAN_….

    Response 200

    Images.
    • dataarray of Imagerequired
      Show 7 child fields
      • idstringrequired

        The image's id.

      • slugstringrequired

        Use this in image_slug.

      • namestringrequired

        Its name for display, e.g. Ubuntu.

      • versionstringrequired

        Its version, e.g. 24.04.

      • zonesarray of stringrequired

        Zones this image can be deployed in.

      • encryptedboolean

        True for an encrypted image: the instance's root disk is encrypted on our storage, with its own key, and the instance needs our key servers to start. Encrypted images are listed only for organizations they are enabled for.

      • encrypted_variant_ofstring or null

        On an encrypted image, the slug of the plain image it is the encrypted version of (e.g. ubuntu-24-04 for ubuntu-24-04-encrypted); null otherwise.

    • next_cursorstring or nullrequired

      Always null: this list is returned whole.

    Errors

    • 401UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. Send Authorization: Bearer PAN_… with a valid key; create one in the console under Organization › API keys.
    • 403INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (read for GET, write for changes; an AI app's key also needs delete for a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access. FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin. AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps.
    • 429RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. Wait Retry-After seconds, then retry. For authenticated quota denials, RateLimit-Scope identifies the denying quota and RateLimit-Reset reports its remaining window in seconds.
    • 503SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.

    Every code is explained in Errors.

    Authorization
    curl "https://api.pantechdynamics.com/public/v1/images" \
      -H "Authorization: Bearer $PANTECH_API_KEY"
    Response 200
    {
      "data": [
        {
          "id": "id",
          "slug": "slug",
          "name": "web-1",
          "version": "version",
          "zones": [
            "af-abj-1"
          ],
          "encrypted": true,
          "encrypted_variant_of": "encrypted-variant-of"
        }
      ],
      "next_cursor": null
    }

    List disk offerings

    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.

    GET/public/v1/disk-offerings
    Read keyReturns200OK

    Headers

    • Authorizationstringrequired

      Bearer and your API key: Bearer PAN_….

    Response 200

    Disk offerings.
    • dataarray of DiskOfferingrequired
      Show 7 child fields
      • slugstringrequired

        Use this in disk_offering_slug.

      • namestringrequired

        Its name for display.

      • size_gbinteger or null

        Fixed size; null for a custom-size offering.

      • custom_sizebooleanrequired

        When true, send size_gb on create; the price is then per GB.

      • storage_typestring or null

        The storage class, e.g. shared or local; null when not stated.

      • currencystringrequired

        NGN or USD: your organization's currency.

      • hourly_price_minorintegerrequired

        Price per hour in minor units of currency: for the whole volume, or per GB for a custom-size offering.

    • next_cursorstring or nullrequired

      Always null: this list is returned whole.

    Errors

    • 401UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. Send Authorization: Bearer PAN_… with a valid key; create one in the console under Organization › API keys.
    • 403INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (read for GET, write for changes; an AI app's key also needs delete for a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access. FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin. AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps.
    • 429RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. Wait Retry-After seconds, then retry. For authenticated quota denials, RateLimit-Scope identifies the denying quota and RateLimit-Reset reports its remaining window in seconds.
    • 503SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.

    Every code is explained in Errors.

    Authorization
    curl "https://api.pantechdynamics.com/public/v1/disk-offerings" \
      -H "Authorization: Bearer $PANTECH_API_KEY"
    Response 200
    {
      "data": [
        {
          "slug": "slug",
          "name": "web-1",
          "size_gb": 20,
          "custom_size": false,
          "storage_type": "shared",
          "currency": "NGN",
          "hourly_price_minor": 640
        }
      ],
      "next_cursor": null
    }

    Price a volume

    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.

    GET/public/v1/disk-offerings/{slug}/quote
    Read keyReturns200OK

    Headers

    • Authorizationstringrequired

      Bearer and your API key: Bearer PAN_….

    Path parameters

    • slugstringrequired

      The disk offering's slug.

    Query parameters

    • size_gbinteger

      At least 1.

    Response 200

    The price.
    • disk_offering_slugstringrequired
    • size_gbintegerrequired
    • currencystringrequired
    • hourly_price_minorintegerrequired
    • monthly_price_minorintegerrequired

    Errors

    • 401UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. Send Authorization: Bearer PAN_… with a valid key; create one in the console under Organization › API keys.
    • 403INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (read for GET, write for changes; an AI app's key also needs delete for a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access. FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin. AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps.
    • 404RESOURCE_NOT_FOUND: no active disk offering has this slug. Pick one from GET /public/v1/disk-offerings.
    • 422VALIDATION_FAILED: a field is invalid. Each entry of errors names the field and its code: size_gb INVALID_SIZE: send a whole number of GB, at least 1. size_gb SIZE_REQUIRED: this offering is custom-size, so size_gb is required.
    • 429RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. Wait Retry-After seconds, then retry. For authenticated quota denials, RateLimit-Scope identifies the denying quota and RateLimit-Reset reports its remaining window in seconds.
    • 503SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.

    Every code is explained in Errors.

    Authorization
    Path
    Query
    curl "https://api.pantechdynamics.com/public/v1/disk-offerings/medium-20gb/quote" \
      -H "Authorization: Bearer $PANTECH_API_KEY"
    Response 200
    {
      "disk_offering_slug": "medium-20gb",
      "size_gb": 20,
      "currency": "NGN",
      "hourly_price_minor": 640,
      "monthly_price_minor": 467200
    }

    Estimate a monthly bill

    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.

    pricing_complete is false when any line could not be priced; that line has priced: false and an unpriced_reason.

    POST/public/v1/pricing/estimate
    Read keyReturns200OK

    Headers

    • Authorizationstringrequired

      Bearer and your API key: Bearer PAN_….

    Body

    application/json
    • currencystringrequired

      The currency to price in: NGN or USD.

      One of NGN, USD.

    • machinesarray of object

      Instances to price: up to 50 lines, each a plan, a quantity and running hours per month.

      At most 50 items.

      Show 4 child fields
      • plan_slugstringrequired
      • quantityintegerrequired

        At least 1.

      • running_hoursintegerrequired

        From 0 to 730.

      • placementstring

        One of standard, vpc.

    • extra_storage_gbinteger

      Extra volume storage in GB.

      At least 0.

    • network_countinteger

      Number of VPC networks.

      At least 0.

    • snapshot_gbinteger

      Snapshot storage in GB.

      At least 0.

    Response 200

    The estimate.
    • currencystringrequired

      NGN or USD, as requested.

    • nominal_month_hoursintegerrequired

      Hours in the month prices assume: 730.

    • machinesarray of objectrequired
      Show 7 child fields
      • plan_slugstringrequired
      • quantityintegerrequired
      • running_hoursintegerrequired
      • pricedbooleanrequired
      • unpriced_reasonstring or null
      • unit_monthly_estimate_minorinteger or null
      • total_monthly_estimate_minorinteger or null
    • extra_storage_gbobject
      Show 4 child fields
      • requestedintegerrequired
      • pricedbooleanrequired
      • unpriced_reasonstring or null
      • amount_minorinteger or null
    • networksobject
      Show 4 child fields
      • requestedintegerrequired
      • pricedbooleanrequired
      • unpriced_reasonstring or null
      • amount_minorinteger or null
    • snapshot_gbobject
      Show 4 child fields
      • requestedintegerrequired
      • pricedbooleanrequired
      • unpriced_reasonstring or null
      • amount_minorinteger or null
    • pricing_completebooleanrequired

      False when any line could not be priced.

    • priced_subtotal_minorintegerrequired

      The sum of every priced line, in minor units. Lines that could not be priced are left out.

    Errors

    • 400INVALID_REQUEST_BODY: the body is not a single valid JSON object. Send one JSON object with the fields documented for this endpoint.
    • 401UNAUTHENTICATED: the request has no API key, or the key is mistyped, revoked or expired, or its creator has left the organization. Send Authorization: Bearer PAN_… with a valid key; create one in the console under Organization › API keys.
    • 403INSUFFICIENT_SCOPE: the API key lacks the scope this endpoint needs (read for GET, write for changes; an AI app's key also needs delete for a destructive call). Use a key with that scope, or reconnect the AI app with "Manage and delete" access. FORBIDDEN: the member who created the key may not do this in the organization. Use a key created by an owner or admin. AI_APPS_DISABLED: the organization has turned AI app access off, and this request was made with an AI app's key or sent by Pantech's MCP server (Pantech-Client: mcp/…). An owner can turn it on in the console under Organization › AI apps.
    • 413REQUEST_TOO_LARGE: the body is larger than 64 KiB. Send a smaller request.
    • 422VALIDATION_FAILED: a field is invalid. Each entry of errors names the field and its code: currency UNSUPPORTED_CURRENCY: use NGN or USD. machines TOO_MANY_MACHINES: at most 50 machine lines. machines INVALID_MACHINE: each machine needs a plan_slug, a quantity above 0 and 0 to 730 running_hours. placement INVALID_PLACEMENT: use standard or vpc. UNKNOWN_FIELD: the body has a field this endpoint does not take (named in field). Remove it or fix its spelling.
    • 429RATE_LIMITED: this API key, verified user or organization used its request budget for the current window, or this address exceeded an IP/failed-auth limit. Wait Retry-After seconds, then retry. For authenticated quota denials, RateLimit-Scope identifies the denying quota and RateLimit-Reset reports its remaining window in seconds.
    • 503SERVICE_UNAVAILABLE: request quota storage is unavailable. Wait a few seconds, then retry.

    Every code is explained in Errors.

    Authorization
    Body
    curl -X POST "https://api.pantechdynamics.com/public/v1/pricing/estimate" \
      -H "Authorization: Bearer $PANTECH_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "currency": "NGN",
        "machines": [
          {
            "plan_slug": "starter",
            "quantity": 2,
            "running_hours": 730,
            "placement": "standard"
          }
        ]
      }'
    Response 200
    {
      "currency": "NGN",
      "nominal_month_hours": 730,
      "machines": [
        {
          "plan_slug": "starter",
          "quantity": 2,
          "running_hours": 730,
          "priced": true,
          "unpriced_reason": null,
          "unit_monthly_estimate_minor": 1,
          "total_monthly_estimate_minor": 1
        }
      ],
      "extra_storage_gb": {
        "requested": 0,
        "priced": true,
        "unpriced_reason": null,
        "amount_minor": 1059200
      },
      "networks": {
        "requested": 0,
        "priced": true,
        "unpriced_reason": null,
        "amount_minor": 1059200
      },
      "snapshot_gb": {
        "requested": 0,
        "priced": true,
        "unpriced_reason": null,
        "amount_minor": 1059200
      },
      "pricing_complete": true,
      "priced_subtotal_minor": 1
    }

    Was this page helpful?

    Updated