To configure delivery, see Webhooks.
Envelope
Every webhook delivery is a POST with Content-Type: application/json. The body has this shape:
There is no subscription_id, no timestamp, no project field at the top level. Resource information lives inside data.
Common types
These are referenced from multiple events.
Deployment events
Sent for deployment.success and deployment.failed.
Project events
Sent for project.created, project.updated, and project.deleted.
Project domain updated
Sent for project.domain.updated.
Domain events
Sent for domain.created, domain.purchased, and domain.renewed.
DNS record events
Sent for dns.record.created, dns.record.updated, and dns.record.deleted.
Environment variable events
Sent for environment.variables.added, environment.variables.updated, and environment.variables.deleted.
The variable’s value is not included in the payload. Only the variable name. Webhook handlers can react to “this variable changed” without seeing the secret.
Autoscaling events
Sent for autoscaling.group.created, autoscaling.group.updated, and autoscaling.group.deleted.
Subscription events
Sent for subscription.created, subscription.upgraded, subscription.downgraded, subscription.renewed, subscription.renewal_failed, subscription.past_due, subscription.unpaid, subscription.paused, subscription.reactivated, subscription.canceled, and subscription.incomplete_expired.
Payment events
Sent for payment.successful and payment.failed.
Subscribing
Pass the events you want when configuring a webhook, or ["*"] to receive everything. Pass [] to disable delivery without removing the configuration.
Delivery model
- At-least-once. A delivery may be retried after a failed response. Make handlers idempotent. Keying on
data.project_id (or data.domain_id, etc.) plus event plus the relevant timestamp works for most resources.
- Order is not guaranteed. Two events from the same project can arrive out of order. Use
created_at / updated_at from data to reconcile.
- Best-effort. After repeated delivery failures, a single delivery is dropped. Your webhook itself stays enabled and continues to receive subsequent events.
Last modified on May 18, 2026