Documentation

esc
    Webhooks / Event types

    Webhook event types

    Every event a webhook can subscribe to, grouped by resource, with what each one means and the fields billing events carry.

    A webhook subscribes to exact types, to every type of one resource with <resource>.*, or to everything with *. The same list, with a one-line description of each type, comes from the API:

    Terminal
    $ curl https://api.pantechdynamics.com/public/v1/webhook-event-types \    -H "Authorization: Bearer $PANTECH_API_KEY"

    Every event arrives in the same envelope, described in What is sent. Only data differs.

    Infrastructure

    Every change to a resource is an operation, and every operation that ends sends one event: <resource>.<past tense> when it finished, <resource>.<verb>_failed when it failed. Both kinds carry the same data:

    FieldWhat it is
    resource_typeThe resource, as in the event type: instance, volume, kubernetes_cluster…
    resource_idThe resource's id (vm_…, vol_…, db_…).
    operation_idThe operation that made the change (op_…).
    actionThe verb that was asked for, as in the _failed type: create, attach, resize_storage…
    statussucceeded or failed.
    errorOnly when status is failed: code and message, the same as the operation's failure.

    Events are deliberately thin. To know more, such as a machine's address after instance.created, read the resource through the API with resource_id.

    Instances

    Subscribe to all of them with instance.*.

    FinishedFailedWhat happened
    instance.createdinstance.create_failedA machine was created and is running.
    instance.startedinstance.start_failedA machine was started.
    instance.stoppedinstance.stop_failedA machine was stopped.
    instance.rebootedinstance.reboot_failedA machine was rebooted.
    instance.renamedinstance.rename_failedA machine was renamed.
    instance.rebuiltinstance.rebuild_failedA machine's root disk was rebuilt from an image.
    instance.deletedinstance.delete_failedA machine was deleted.
    instance.deletion_protection_enabledinstance.enable_deletion_protection_failedDeletion protection was turned on.
    instance.deletion_protection_disabledinstance.disable_deletion_protection_failedDeletion protection was turned off.
    instance.restoredinstance.restore_failedA machine was restored from one of its snapshots.
    instance.resizedinstance.resize_failedA machine was moved to another plan.
    instance.ssh_key_changedinstance.change_ssh_key_failedA machine's SSH key was changed.
    instance.security_group_changedinstance.change_security_group_failedA machine was moved to another security group.
    instance.private_network_attachedinstance.attach_private_network_failedA machine was given an interface on its zone's private database network.
    instance.private_network_detachedinstance.detach_private_network_failedThat interface was removed.

    Volumes

    Subscribe to all of them with volume.*.

    FinishedFailedWhat happened
    volume.createdvolume.create_failedA volume was created.
    volume.attachedvolume.attach_failedA volume was attached to a machine.
    volume.detachedvolume.detach_failedA volume was detached.
    volume.resizedvolume.resize_failedA volume was grown.
    volume.deletedvolume.delete_failedA volume was deleted.

    Snapshots

    Subscribe to all of them with snapshot.*.

    FinishedFailedWhat happened
    snapshot.createdsnapshot.create_failedA snapshot was taken, by hand or by a schedule.
    snapshot.deletedsnapshot.delete_failedA snapshot was deleted.

    VPC networks

    Subscribe to all of them with network.*.

    FinishedFailedWhat happened
    network.creatednetwork.create_failedA VPC was created.
    network.deletednetwork.delete_failedA VPC was deleted.

    Subnets

    Subscribe to all of them with subnet.*.

    FinishedFailedWhat happened
    subnet.createdsubnet.create_failedA subnet was created.
    subnet.deletedsubnet.delete_failedA subnet was deleted.

    Firewall rules

    Subscribe to all of them with firewall_rule.*.

    FinishedFailedWhat happened
    firewall_rule.createdfirewall_rule.create_failedA rule was added to a subnet's firewall.
    firewall_rule.deletedfirewall_rule.delete_failedA rule was removed.

    Security groups

    Subscribe to all of them with security_group.*.

    FinishedFailedWhat happened
    security_group.createdsecurity_group.create_failedA security group was created.
    security_group.rules_updatedsecurity_group.update_rules_failedA security group's rules were changed.
    security_group.deletedsecurity_group.delete_failedA security group was deleted.

    Public IPs

    Subscribe to all of them with public_ip.*.

    FinishedFailedWhat happened
    public_ip.createdpublic_ip.create_failedA public IP was reserved.
    public_ip.deletedpublic_ip.delete_failedA public IP was released.
    public_ip.attachedpublic_ip.attach_failedA public IP was attached to a machine.
    public_ip.detachedpublic_ip.detach_failedA public IP was taken off its machine.

    Port forwarding rules

    Subscribe to all of them with port_forwarding_rule.*.

    FinishedFailedWhat happened
    port_forwarding_rule.createdport_forwarding_rule.create_failedA port forward was added to a public IP.
    port_forwarding_rule.deletedport_forwarding_rule.delete_failedA port forward was removed.

    Load balancers

    Subscribe to all of them with load_balancer.*.

    FinishedFailedWhat happened
    load_balancer.createdload_balancer.create_failedA load balancer was created.
    load_balancer.updatedload_balancer.update_failedA load balancer's name, algorithm or targets were changed.
    load_balancer.deletedload_balancer.delete_failedA load balancer was deleted.

    Databases

    Subscribe to all of them with database.*.

    FinishedFailedWhat happened
    database.createddatabase.create_failedA database was created and is running.
    database.starteddatabase.start_failedA database was started.
    database.stoppeddatabase.stop_failedA database was stopped.
    database.deleteddatabase.delete_failedA database was deleted.
    database.access_rules_updateddatabase.update_access_rules_failedThe CIDRs allowed to connect were changed.
    database.password_changeddatabase.change_password_failedThe admin password was changed to one you chose.
    database.password_resetdatabase.reset_password_failedThe admin password was reset to a generated one.
    database.storage_resizeddatabase.resize_storage_failedThe data disk was grown.

    Kubernetes clusters

    Subscribe to all of them with kubernetes_cluster.*.

    FinishedFailedWhat happened
    kubernetes_cluster.createdkubernetes_cluster.create_failedA cluster was created and is running.
    kubernetes_cluster.scaledkubernetes_cluster.scale_failedThe number of workers was changed.
    kubernetes_cluster.upgradedkubernetes_cluster.upgrade_failedA cluster was upgraded to a newer Kubernetes version.
    kubernetes_cluster.startedkubernetes_cluster.start_failedA cluster was started.
    kubernetes_cluster.stoppedkubernetes_cluster.stop_failedA cluster was stopped.
    kubernetes_cluster.deletedkubernetes_cluster.delete_failedA cluster was deleted.
    kubernetes_cluster.configuredkubernetes_cluster.configure_failedA cluster's settings were changed.
    kubernetes_cluster.nodes_resizedkubernetes_cluster.resize_nodes_failedThe nodes were moved to another plan.
    kubernetes_cluster.network_upgradedkubernetes_cluster.upgrade_network_failedThe cluster's pod network was upgraded.

    Billing

    Amounts are integers in minor units of currency (kobo for NGN, cents for USD): amount_minor: 1504000 in NGN is NGN 15,040.00. Times are RFC 3339, UTC. Subscribe to every event of one kind with its prefix, such as invoice.* or credit.*. See how billing works.

    EventWhendata
    invoice.issuedA billing period closed and its invoice was issued.invoice_id, invoice_number, currency, subtotal_minor, tax_minor, tax_rate_bps (VAT in basis points: 750 is 7.5%), total_minor, credit_applied_minor, brought_forward_minor, total_due_minor
    invoice.paidAn invoice was paid, by card or from credit.invoice_id, invoice_number, currency, amount_minor, paid_with (payment or credit), receipt_id when paid by card
    payment.receivedA payment was received.receipt_id, purpose (such as invoice_collection, credit_purchase, verification or initial_payment), currency, amount_minor
    payment.failedCollecting an invoice failed; another attempt is scheduled.currency, amount_due_minor, attempt_number, next_retry_at (left out when no automatic retry remains), past_due_on
    credit.lowCredit no longer covers the estimated next invoice.currency, available_minor, prepaid_minor, projected_invoice_minor, next_invoice_at, has_payment_method
    credit.depletedCredit has run out.The same fields as credit.low
    credit_purchase.succeededA credit purchase was paid and added to the balance.currency, amount_minor, new_balance_minor and receipt_id when known
    credit_purchase.failedA credit purchase failed.currency, amount_minor
    receipt.issuedA receipt was issued.receipt_number, kind (payment, invoice_payment, credit_purchase, wallet_debit or refund), currency, amount_minor
    account.activatedThe account's verification payment succeeded and it can create resources.Empty
    account.past_dueThe account is past due.reason_code, currency, amount_owed_minor
    account.currentThe account is no longer past due.Empty
    spend_cap.reachedUnbilled usage reached the account's spend cap.currency, accrued_minor, cap_minor
    JSON
    {
      "id": "evt_06gk3x9tq7m2v8r4y1c5d0zp8w",
      "type": "invoice.paid",
      "api_version": "2026-10-22",
      "created_at": "2026-11-01T00:12:40Z",
      "organization_id": "org_06gk3x9tq7m2v8r4y1c5d0zp8w",
      "project_id": "acc_06gk3x9tq7m2v8r4y1c5d0zp8w",
      "data": {
        "invoice_id": "inv_06gk3x9tq7m2v8r4y1c5d0zp8w",
        "invoice_number": "INV-d0zp8w-0007",
        "currency": "NGN",
        "amount_minor": 1504000,
        "paid_with": "payment",
        "receipt_id": "rct_06gk3x9tq7m2v8r4y1c5d0zp8w"
      }
    }

    Test

    EventWhendata
    webhook.testYou asked for a test event. It is sent whatever the webhook subscribes to, and you cannot subscribe to it.endpoint_id (the webhook's id), message

    New event types

    New types are added from time to time, and a <resource>.* or * subscription receives them without a change. Ignore a type you do not recognise and answer 2xx anyway, or it is retried. A new field in data is not a breaking change either: ignore fields you do not use. A change that would break a receiver comes with a new api_version.

    Was this page helpful?

    Updated