# Vercel: events can now return "ai-gateway.budget.updated"

> Source: <https://driftwatch.et/changes/vercel-2026-11-05-dc3ef933>
> Published: 2026-11-05 19:19:44+00:00

## What changed

Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums.

Affects `events[]` on `POST /v1/webhooks`.

New value: `ai-gateway.budget.updated`.

can now return "ai-gateway.budget.updated"

## Who is affected

Code that reads POST /v1/webhooks (events[]).

## Before and after

| Where | Before | After | 
|---|---|---|
| POST /v1/webhooks · events[] | "ai-gateway.auto-reload.limit-reached", "ai-gateway.balance-depleted", "alerts.triggered", "botid.anomaly", "budget.reached", "comment.created", "comment.deleted", "comment.mentioned", "comment.reaction-added", "comment.reaction-removed", "comment.resolved", "comment.unresolved", "comment.updated", "deployment", "deployment-canceled", "deployment-check-rerequested", "deployment-checks-completed", "deployment-error", "deployment-prepared", "deployment-ready", "deployment.blocked", "deployment.build-requested", "deployment.canceled", "deployment.check-rerequested", "deployment.checkrun.cancel", "deployment.checkrun.start", "deployment.checks.failed", "deployment.checks.succeeded", "deployment.cleanup", "deployment.created", "deployment.error", "deployment.integration.action.cancel", "deployment.integration.action.cleanup", "deployment.integration.action.start", "deployment.promoted", "deployment.ready", "deployment.rollback", "deployment.succeeded", "domain-created", "domain.auto-renew.changed", "domain.certificate.add", "domain.certificate.add.failed", "domain.certificate.deleted", "domain.certificate.renew", "domain.certificate.renew.failed", "domain.created", "domain.dns.records.changed", "domain.renewal", "domain.renewal.failed", "domain.transfer-in.completed", "domain.transfer-in.failed", "domain.transfer-in.started", "edge-config.created", "edge-config.deleted", "edge-config.items.updated", "firewall.attack", "firewall.custom-rule-anomaly", "firewall.system-rule-anomaly", "flag.created", "flag.deleted", "flag.segment.created", "flag.segment.deleted", "flag.segment.updated", "flag.updated", "function.archival-required", "function.removal-required", "integration-configuration-permission-updated", "integration-configuration-removed", "integration-configuration-scope-change-confirmed", "integration-configuration.permission-upgraded", "integration-configuration.removed", "integration-configuration.scope-change-confirmed", "integration-configuration.transferred", "integration-resource.project-connected", "integration-resource.project-disconnected", "marketplace.invoice.created", "marketplace.invoice.notpaid", "marketplace.invoice.overdue", "marketplace.invoice.paid", "marketplace.invoice.refunded", "marketplace.member.changed", "message.created", "message.deleted", "message.mentioned", "message.reaction-added", "message.reaction-removed", "message.updated", "observability.anomaly", "observability.anomaly-error", "observability.error-anomaly", "observability.usage-anomaly", "project-created", "project-removed", "project.created", "project.domain.created", "project.domain.deleted", "project.domain.moved", "project.domain.unverified", "project.domain.updated", "project.domain.verified", "project.env-variable.created", "project.env-variable.deleted", "project.env-variable.updated", "project.removed", "project.renamed", "project.rolling-release.aborted", "project.rolling-release.approved", "project.rolling-release.completed", "project.rolling-release.started", "test-webhook", "thread.resolved", "thread.unresolved" | "ai-gateway.auto-reload.limit-reached", "ai-gateway.balance-depleted", "ai-gateway.budget.updated", "alerts.triggered", "botid.anomaly", "budget.reached", "comment.created", "comment.deleted", "comment.mentioned", "comment.reaction-added", "comment.reaction-removed", "comment.resolved", "comment.unresolved", "comment.updated", "deployment", "deployment-canceled", "deployment-check-rerequested", "deployment-checks-completed", "deployment-error", "deployment-prepared", "deployment-ready", "deployment.blocked", "deployment.build-requested", "deployment.canceled", "deployment.check-rerequested", "deployment.checkrun.cancel", "deployment.checkrun.start", "deployment.checks.failed", "deployment.checks.succeeded", "deployment.cleanup", "deployment.created", "deployment.error", "deployment.integration.action.cancel", "deployment.integration.action.cleanup", "deployment.integration.action.start", "deployment.promoted", "deployment.ready", "deployment.rollback", "deployment.succeeded", "domain-created", "domain.auto-renew.changed", "domain.certificate.add", "domain.certificate.add.failed", "domain.certificate.deleted", "domain.certificate.renew", "domain.certificate.renew.failed", "domain.created", "domain.dns.records.changed", "domain.renewal", "domain.renewal.failed", "domain.transfer-in.completed", "domain.transfer-in.failed", "domain.transfer-in.started", "edge-config.created", "edge-config.deleted", "edge-config.items.updated", "firewall.attack", "firewall.custom-rule-anomaly", "firewall.system-rule-anomaly", "flag.created", "flag.deleted", "flag.segment.created", "flag.segment.deleted", "flag.segment.updated", "flag.updated", "function.archival-required", "function.removal-required", "integration-configuration-permission-updated", "integration-configuration-removed", "integration-configuration-scope-change-confirmed", "integration-configuration.permission-upgraded", "integration-configuration.removed", "integration-configuration.scope-change-confirmed", "integration-configuration.transferred", "integration-resource.project-connected", "integration-resource.project-disconnected", "marketplace.invoice.created", "marketplace.invoice.notpaid", "marketplace.invoice.overdue", "marketplace.invoice.paid", "marketplace.invoice.refunded", "marketplace.member.changed", "message.created", "message.deleted", "message.mentioned", "message.reaction-added", "message.reaction-removed", "message.updated", "observability.anomaly", "observability.anomaly-error", "observability.error-anomaly", "observability.usage-anomaly", "project-created", "project-removed", "project.created", "project.domain.created", "project.domain.deleted", "project.domain.moved", "project.domain.unverified", "project.domain.updated", "project.domain.verified", "project.env-variable.created", "project.env-variable.deleted", "project.env-variable.updated", "project.removed", "project.renamed", "project.rolling-release.aborted", "project.rolling-release.approved", "project.rolling-release.completed", "project.rolling-release.started", "test-webhook", "thread.resolved", "thread.unresolved" | 
| GET /v1/webhooks/{id} · events[] | "ai-gateway.auto-reload.limit-reached", "ai-gateway.balance-depleted", "alerts.triggered", "botid.anomaly", "budget.reached", "comment.created", "comment.deleted", "comment.mentioned", "comment.reaction-added", "comment.reaction-removed", "comment.resolved", "comment.unresolved", "comment.updated", "deployment", "deployment-canceled", "deployment-check-rerequested", "deployment-checks-completed", "deployment-error", "deployment-prepared", "deployment-ready", "deployment.blocked", "deployment.build-requested", "deployment.canceled", "deployment.check-rerequested", "deployment.checkrun.cancel", "deployment.checkrun.start", "deployment.checks.failed", "deployment.checks.succeeded", "deployment.cleanup", "deployment.created", "deployment.error", "deployment.integration.action.cancel", "deployment.integration.action.cleanup", "deployment.integration.action.start", "deployment.promoted", "deployment.ready", "deployment.rollback", "deployment.succeeded", "domain-created", "domain.auto-renew.changed", "domain.certificate.add", "domain.certificate.add.failed", "domain.certificate.deleted", "domain.certificate.renew", "domain.certificate.renew.failed", "domain.created", "domain.dns.records.changed", "domain.renewal", "domain.renewal.failed", "domain.transfer-in.completed", "domain.transfer-in.failed", "domain.transfer-in.started", "edge-config.created", "edge-config.deleted", "edge-config.items.updated", "firewall.attack", "firewall.custom-rule-anomaly", "firewall.system-rule-anomaly", "flag.created", "flag.deleted", "flag.segment.created", "flag.segment.deleted", "flag.segment.updated", "flag.updated", "function.archival-required", "function.removal-required", "integration-configuration-permission-updated", "integration-configuration-removed", "integration-configuration-scope-change-confirmed", "integration-configuration.permission-upgraded", "integration-configuration.removed", "integration-configuration.scope-change-confirmed", "integration-configuration.transferred", "integration-resource.project-connected", "integration-resource.project-disconnected", "marketplace.invoice.created", "marketplace.invoice.notpaid", "marketplace.invoice.overdue", "marketplace.invoice.paid", "marketplace.invoice.refunded", "marketplace.member.changed", "message.created", "message.deleted", "message.mentioned", "message.reaction-added", "message.reaction-removed", "message.updated", "observability.anomaly", "observability.anomaly-error", "observability.error-anomaly", "observability.usage-anomaly", "project-created", "project-removed", "project.created", "project.domain.created", "project.domain.deleted", "project.domain.moved", "project.domain.unverified", "project.domain.updated", "project.domain.verified", "project.env-variable.created", "project.env-variable.deleted", "project.env-variable.updated", "project.removed", "project.renamed", "project.rolling-release.aborted", "project.rolling-release.approved", "project.rolling-release.completed", "project.rolling-release.started", "test-webhook", "thread.resolved", "thread.unresolved" | "ai-gateway.auto-reload.limit-reached", "ai-gateway.balance-depleted", "ai-gateway.budget.updated", "alerts.triggered", "botid.anomaly", "budget.reached", "comment.created", "comment.deleted", "comment.mentioned", "comment.reaction-added", "comment.reaction-removed", "comment.resolved", "comment.unresolved", "comment.updated", "deployment", "deployment-canceled", "deployment-check-rerequested", "deployment-checks-completed", "deployment-error", "deployment-prepared", "deployment-ready", "deployment.blocked", "deployment.build-requested", "deployment.canceled", "deployment.check-rerequested", "deployment.checkrun.cancel", "deployment.checkrun.start", "deployment.checks.failed", "deployment.checks.succeeded", "deployment.cleanup", "deployment.created", "deployment.error", "deployment.integration.action.cancel", "deployment.integration.action.cleanup", "deployment.integration.action.start", "deployment.promoted", "deployment.ready", "deployment.rollback", "deployment.succeeded", "domain-created", "domain.auto-renew.changed", "domain.certificate.add", "domain.certificate.add.failed", "domain.certificate.deleted", "domain.certificate.renew", "domain.certificate.renew.failed", "domain.created", "domain.dns.records.changed", "domain.renewal", "domain.renewal.failed", "domain.transfer-in.completed", "domain.transfer-in.failed", "domain.transfer-in.started", "edge-config.created", "edge-config.deleted", "edge-config.items.updated", "firewall.attack", "firewall.custom-rule-anomaly", "firewall.system-rule-anomaly", "flag.created", "flag.deleted", "flag.segment.created", "flag.segment.deleted", "flag.segment.updated", "flag.updated", "function.archival-required", "function.removal-required", "integration-configuration-permission-updated", "integration-configuration-removed", "integration-configuration-scope-change-confirmed", "integration-configuration.permission-upgraded", "integration-configuration.removed", "integration-configuration.scope-change-confirmed", "integration-configuration.transferred", "integration-resource.project-connected", "integration-resource.project-disconnected", "marketplace.invoice.created", "marketplace.invoice.notpaid", "marketplace.invoice.overdue", "marketplace.invoice.paid", "marketplace.invoice.refunded", "marketplace.member.changed", "message.created", "message.deleted", "message.mentioned", "message.reaction-added", "message.reaction-removed", "message.updated", "observability.anomaly", "observability.anomaly-error", "observability.error-anomaly", "observability.usage-anomaly", "project-created", "project-removed", "project.created", "project.domain.created", "project.domain.deleted", "project.domain.moved", "project.domain.unverified", "project.domain.updated", "project.domain.verified", "project.env-variable.created", "project.env-variable.deleted", "project.env-variable.updated", "project.removed", "project.renamed", "project.rolling-release.aborted", "project.rolling-release.approved", "project.rolling-release.completed", "project.rolling-release.started", "test-webhook", "thread.resolved", "thread.unresolved" | 

## Code that breaks

```
switch (response.events[0]) {
  // existing branches …
  // no branch for "ai-gateway.budget.updated"
  default:
    throw new Error("unexpected events");
}
```

Based on Vercel’s published API specification. [How severity is decided](https://driftwatch.et/method).
