Vercel: events can now return "ai-gateway.budget.updated" Vercel added a new event value, "ai-gateway.budget.updated", to the events[] field on its POST /v1/webhooks endpoint, expanding the list of webhook events that producers can emit. Vercel describes the change as additive, but it breaks exhaustive switches, strict parsers and generated client enums in code that reads POST /v1/webhooks. The new value joins existing AI Gateway events such as "ai-gateway.auto-reload.limit-reached" and "ai-gateway.balance-depleted". 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 .