Vercel · AsyncAPI Specification

Vercel Webhooks

Version 2026-05-30

AsyncAPI definition for Vercel's webhook surface. Vercel webhooks are HTTP POST deliveries from Vercel to a subscriber-configured endpoint URL registered either as an Account Webhook (Team Settings -> Webhooks) or through a Vercel Integration (Integration Console). Every delivery is a JSON document with a stable envelope: { "id": "", "type": "", "createdAt": , "region": "", "payload": { ... event specific ... } } Each delivery includes an `x-vercel-signature` header. Vercel signs the raw request body with the webhook's secret using HMAC-SHA1 and sends the hex-encoded digest in this header. Subscribers verify a delivery by recomputing HMAC-SHA1 over the raw body with their secret and comparing the result to `x-vercel-signature` using a constant-time comparison. For Integration webhooks the secret is the Integration Secret (also referred to as the Client Secret) from the Integration Console; for Account webhooks the secret is the one shown once when the webhook is created. Sourced from: - https://vercel.com/docs/webhooks - https://vercel.com/docs/webhooks/webhooks-api - https://vercel.com/docs/headers/request-headers#x-vercel-signature Event types and payload fields that the Vercel documentation does not describe are not invented here.

View Spec View on GitHub AI GatewaysGatewaysObservabilityWebhooksAsyncAPIWebhooksEvents

Channels

deployment.created
subscribe onDeploymentCreated
Deployment created
A new deployment is initiated.
deployment.ready
subscribe onDeploymentReady
Deployment ready
A deployment is ready.
deployment.succeeded
subscribe onDeploymentSucceeded
Deployment succeeded
A deployment successfully built and any integration checks completed.
deployment.error
subscribe onDeploymentError
Deployment failed
A deployment failed.
deployment.canceled
subscribe onDeploymentCanceled
Deployment canceled
A deployment was canceled.
deployment.promoted
subscribe onDeploymentPromoted
Deployment promoted
A deployment was promoted to production (manually or automatically). Does not include rollbacks.
deployment.rollback
subscribe onDeploymentRollback
Deployment rollback accepted
Vercel accepted an instant rollback request.
deployment.cleanup
subscribe onDeploymentCleanup
Deployment cleanup
A deployment is permanently deleted after the 30-day recovery period.
deployment.check-rerequested
subscribe onDeploymentCheckRerequested
Deployment check re-requested
A user requested a failed deployment check to be re-run.
deployment.integration.action.start
subscribe onDeploymentIntegrationActionStart
Deployment integration action started
A deployment started an integration action.
deployment.integration.action.cancel
subscribe onDeploymentIntegrationActionCancel
Deployment integration action canceled
An integration action or its deployment was canceled.
deployment.integration.action.cleanup
subscribe onDeploymentIntegrationActionCleanup
Deployment integration action cleanup
A deployment with an integration action is permanently deleted.
domain.created
subscribe onDomainCreated
Domain created
A domain was created.
domain.auto-renew-changed
subscribe onDomainAutoRenewChanged
Domain auto-renew changed
A domain's auto-renew setting changed.
domain.certificate-add
subscribe onDomainCertificateAdd
Domain certificate added
An SSL certificate was added for a domain.
domain.certificate-add-failed
subscribe onDomainCertificateAddFailed
Domain certificate add failed
Adding an SSL certificate for a domain failed.
domain.certificate-deleted
subscribe onDomainCertificateDeleted
Domain certificate deleted
An SSL certificate for a domain was deleted.
domain.certificate-renew
subscribe onDomainCertificateRenew
Domain certificate renewed
An SSL certificate for a domain was renewed.
domain.certificate-renew-failed
subscribe onDomainCertificateRenewFailed
Domain certificate renew failed
Renewing an SSL certificate for a domain failed.
domain.dns-records-changed
subscribe onDomainDnsRecordsChanged
Domain DNS records changed
DNS records in a Vercel-hosted zone were changed.
domain.renewal
subscribe onDomainRenewal
Domain renewed
A domain was renewed.
domain.renewal-failed
subscribe onDomainRenewalFailed
Domain renewal failed
A domain renewal failed.
domain.transfer-in-started
subscribe onDomainTransferInStarted
Domain transfer-in started
A domain transfer into Vercel was initiated.
domain.transfer-in-completed
subscribe onDomainTransferInCompleted
Domain transfer-in completed
A domain transfer into Vercel completed.
domain.transfer-in-failed
subscribe onDomainTransferInFailed
Domain transfer-in failed
A domain transfer into Vercel failed.
project.created
subscribe onProjectCreated
Project created
A new project was created. Sent only when the integration has access to all team projects.
project.removed
subscribe onProjectRemoved
Project removed
A project was removed. Sent only when the integration has access to all team projects.
project.renamed
subscribe onProjectRenamed
Project renamed
A project was renamed. Sent only when the integration has access to all team projects.
project.env-variable.created
subscribe onProjectEnvVariableCreated
Project environment variable created
A project environment variable was created. The value is not included in the payload.
project.env-variable.updated
subscribe onProjectEnvVariableUpdated
Project environment variable updated
A project environment variable was updated. The value is not included in the payload.
project.env-variable.deleted
subscribe onProjectEnvVariableDeleted
Project environment variable deleted
A project environment variable was deleted.
project.domain.created
subscribe onProjectDomainCreated
Project domain created
A domain was added to a project.
project.domain.deleted
subscribe onProjectDomainDeleted
Project domain deleted
A domain was removed from a project.
project.domain.moved
subscribe onProjectDomainMoved
Project domain moved
A domain was moved between projects.
project.domain.verified
subscribe onProjectDomainVerified
Project domain verified
A project domain was verified.
project.domain.unverified
subscribe onProjectDomainUnverified
Project domain unverified
A project domain became unverified.
project.domain.updated
subscribe onProjectDomainUpdated
Project domain updated
A project domain configuration was updated.
project.rolling-release.started
subscribe onProjectRollingReleaseStarted
Rolling release started
A rolling release was started.
project.rolling-release.approved
subscribe onProjectRollingReleaseApproved
Rolling release approved
A rolling release stage was approved.
project.rolling-release.completed
subscribe onProjectRollingReleaseCompleted
Rolling release completed
A rolling release completed successfully.
project.rolling-release.aborted
subscribe onProjectRollingReleaseAborted
Rolling release aborted
A rolling release was aborted.
flag.created
subscribe onFlagCreated
Feature flag created
A feature flag was created.
flag.updated
subscribe onFlagUpdated
Feature flag updated
A feature flag was updated.
integration-configuration.removed
subscribe onIntegrationConfigurationRemoved
Integration configuration removed
An integration configuration was removed.
integration-configuration.permission-upgraded
subscribe onIntegrationConfigurationPermissionUpgraded
Integration configuration permission upgraded
A user changed which projects an integration has access to.
integration-configuration.scope-change-confirmed
subscribe onIntegrationConfigurationScopeChangeConfirmed
Integration configuration scope change confirmed
A user confirmed pending scope changes for an integration.
integration-configuration.transferred
subscribe onIntegrationConfigurationTransferred
Integration configuration transferred
An integration installation was transferred to another team.
integration-resource.project-connected
subscribe onIntegrationResourceProjectConnected
Integration resource connected to project
A user connected an integration resource to a project.
integration-resource.project-disconnected
subscribe onIntegrationResourceProjectDisconnected
Integration resource disconnected from project
A user disconnected an integration resource from a project.
marketplace.invoice.created
subscribe onMarketplaceInvoiceCreated
Marketplace invoice created
A marketplace invoice was created and sent to the customer.
marketplace.invoice.paid
subscribe onMarketplaceInvoicePaid
Marketplace invoice paid
A marketplace invoice was paid.
marketplace.invoice.notpaid
subscribe onMarketplaceInvoiceNotPaid
Marketplace invoice not paid
A marketplace invoice payment failed.
marketplace.invoice.overdue
subscribe onMarketplaceInvoiceOverdue
Marketplace invoice overdue
A marketplace invoice was not paid after the grace period.
marketplace.invoice.refunded
subscribe onMarketplaceInvoiceRefunded
Marketplace invoice refunded
A marketplace invoice was refunded.
marketplace.member.changed
subscribe onMarketplaceMemberChanged
Marketplace member changed
A marketplace installation member was added, removed, or had their role changed.
alerts.triggered
subscribe onAlertsTriggered
Alert triggered
An observability alert was triggered.

Messages

DeploymentCreated
Deployment created
A new deployment is initiated.
DeploymentReady
Deployment ready
DeploymentSucceeded
Deployment succeeded
DeploymentError
Deployment error
DeploymentCanceled
Deployment canceled
DeploymentPromoted
Deployment promoted
DeploymentRollback
Deployment rollback accepted
DeploymentCleanup
Deployment cleanup
DeploymentCheckRerequested
Deployment check re-requested
DeploymentIntegrationActionStart
Deployment integration action started
DeploymentIntegrationActionCancel
Deployment integration action canceled
DeploymentIntegrationActionCleanup
Deployment integration action cleanup
DomainCreated
Domain created
DomainAutoRenewChanged
Domain auto-renew changed
DomainCertificateAdd
Domain certificate added
DomainCertificateAddFailed
Domain certificate add failed
DomainCertificateDeleted
Domain certificate deleted
DomainCertificateRenew
Domain certificate renewed
DomainCertificateRenewFailed
Domain certificate renew failed
DomainDnsRecordsChanged
Domain DNS records changed
DomainRenewal
Domain renewed
DomainRenewalFailed
Domain renewal failed
DomainTransferInStarted
Domain transfer-in started
DomainTransferInCompleted
Domain transfer-in completed
DomainTransferInFailed
Domain transfer-in failed
ProjectCreated
Project created
ProjectRemoved
Project removed
ProjectRenamed
Project renamed
ProjectEnvVariableCreated
Project environment variable created
ProjectEnvVariableUpdated
Project environment variable updated
ProjectEnvVariableDeleted
Project environment variable deleted
ProjectDomainCreated
Project domain created
ProjectDomainDeleted
Project domain deleted
ProjectDomainMoved
Project domain moved
ProjectDomainVerified
Project domain verified
ProjectDomainUnverified
Project domain unverified
ProjectDomainUpdated
Project domain updated
ProjectRollingReleaseStarted
Rolling release started
ProjectRollingReleaseApproved
Rolling release approved
ProjectRollingReleaseCompleted
Rolling release completed
ProjectRollingReleaseAborted
Rolling release aborted
FlagCreated
Feature flag created
FlagUpdated
Feature flag updated
IntegrationConfigurationRemoved
Integration configuration removed
IntegrationConfigurationPermissionUpgraded
Integration configuration permission upgraded
IntegrationConfigurationScopeChangeConfirmed
Integration configuration scope change confirmed
IntegrationConfigurationTransferred
Integration configuration transferred
IntegrationResourceProjectConnected
Integration resource connected to project
IntegrationResourceProjectDisconnected
Integration resource disconnected from project
MarketplaceInvoiceCreated
Marketplace invoice created
MarketplaceInvoicePaid
Marketplace invoice paid
MarketplaceInvoiceNotPaid
Marketplace invoice not paid
MarketplaceInvoiceOverdue
Marketplace invoice overdue
MarketplaceInvoiceRefunded
Marketplace invoice refunded
MarketplaceMemberChanged
Marketplace member changed
AlertsTriggered
Alert triggered

Servers

https
subscriber {endpointUrl}
The HTTPS endpoint that the subscriber configures on the Vercel webhook. Vercel delivers all events the subscription opts into to this URL via HTTP POST with a JSON body.

AsyncAPI Specification

Raw ↑
asyncapi: '2.6.0'
info:
  title: Vercel Webhooks
  version: '2026-05-30'
  description: |
    AsyncAPI definition for Vercel's webhook surface. Vercel webhooks are
    HTTP POST deliveries from Vercel to a subscriber-configured endpoint URL
    registered either as an Account Webhook (Team Settings -> Webhooks) or
    through a Vercel Integration (Integration Console).

    Every delivery is a JSON document with a stable envelope:

      {
        "id":        "<eventId>",
        "type":      "<event-type>",
        "createdAt": <javascript-timestamp>,
        "region":    "<RegionId or null>",
        "payload":   { ... event specific ... }
      }

    Each delivery includes an `x-vercel-signature` header. Vercel signs the
    raw request body with the webhook's secret using HMAC-SHA1 and sends
    the hex-encoded digest in this header. Subscribers verify a delivery by
    recomputing HMAC-SHA1 over the raw body with their secret and comparing
    the result to `x-vercel-signature` using a constant-time comparison.
    For Integration webhooks the secret is the Integration Secret (also
    referred to as the Client Secret) from the Integration Console; for
    Account webhooks the secret is the one shown once when the webhook is
    created.

    Sourced from:
      - https://vercel.com/docs/webhooks
      - https://vercel.com/docs/webhooks/webhooks-api
      - https://vercel.com/docs/headers/request-headers#x-vercel-signature

    Event types and payload fields that the Vercel documentation does not
    describe are not invented here.
  contact:
    name: Vercel
    url: https://vercel.com/docs/webhooks
  license:
    name: Vercel Terms of Service
    url: https://vercel.com/legal/terms
  tags:
    - name: Vercel
    - name: Webhooks
    - name: Deployments
    - name: Projects
    - name: Domains
    - name: Integrations
    - name: Marketplace

defaultContentType: application/json

servers:
  subscriber:
    url: '{endpointUrl}'
    protocol: https
    description: |
      The HTTPS endpoint that the subscriber configures on the Vercel
      webhook. Vercel delivers all events the subscription opts into to
      this URL via HTTP POST with a JSON body.
    variables:
      endpointUrl:
        description: Subscriber-controlled URL configured on the Vercel webhook.
        default: https://example.com/webhooks/vercel

channels:
  deployment.created:
    description: A new deployment is initiated.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment created
      operationId: onDeploymentCreated
      message:
        $ref: '#/components/messages/DeploymentCreated'

  deployment.ready:
    description: A deployment is ready.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment ready
      operationId: onDeploymentReady
      message:
        $ref: '#/components/messages/DeploymentReady'

  deployment.succeeded:
    description: A deployment successfully built and any integration checks completed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment succeeded
      operationId: onDeploymentSucceeded
      message:
        $ref: '#/components/messages/DeploymentSucceeded'

  deployment.error:
    description: A deployment failed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment failed
      operationId: onDeploymentError
      message:
        $ref: '#/components/messages/DeploymentError'

  deployment.canceled:
    description: A deployment was canceled.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment canceled
      operationId: onDeploymentCanceled
      message:
        $ref: '#/components/messages/DeploymentCanceled'

  deployment.promoted:
    description: A deployment was promoted to production (manually or automatically). Does not include rollbacks.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment promoted
      operationId: onDeploymentPromoted
      message:
        $ref: '#/components/messages/DeploymentPromoted'

  deployment.rollback:
    description: Vercel accepted an instant rollback request.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment rollback accepted
      operationId: onDeploymentRollback
      message:
        $ref: '#/components/messages/DeploymentRollback'

  deployment.cleanup:
    description: A deployment is permanently deleted after the 30-day recovery period.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment cleanup
      operationId: onDeploymentCleanup
      message:
        $ref: '#/components/messages/DeploymentCleanup'

  deployment.check-rerequested:
    description: A user requested a failed deployment check to be re-run.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment check re-requested
      operationId: onDeploymentCheckRerequested
      message:
        $ref: '#/components/messages/DeploymentCheckRerequested'

  deployment.integration.action.start:
    description: A deployment started an integration action.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment integration action started
      operationId: onDeploymentIntegrationActionStart
      message:
        $ref: '#/components/messages/DeploymentIntegrationActionStart'

  deployment.integration.action.cancel:
    description: An integration action or its deployment was canceled.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment integration action canceled
      operationId: onDeploymentIntegrationActionCancel
      message:
        $ref: '#/components/messages/DeploymentIntegrationActionCancel'

  deployment.integration.action.cleanup:
    description: A deployment with an integration action is permanently deleted.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Deployment integration action cleanup
      operationId: onDeploymentIntegrationActionCleanup
      message:
        $ref: '#/components/messages/DeploymentIntegrationActionCleanup'

  domain.created:
    description: A domain was created.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain created
      operationId: onDomainCreated
      message:
        $ref: '#/components/messages/DomainCreated'

  domain.auto-renew-changed:
    description: A domain's auto-renew setting changed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain auto-renew changed
      operationId: onDomainAutoRenewChanged
      message:
        $ref: '#/components/messages/DomainAutoRenewChanged'

  domain.certificate-add:
    description: An SSL certificate was added for a domain.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain certificate added
      operationId: onDomainCertificateAdd
      message:
        $ref: '#/components/messages/DomainCertificateAdd'

  domain.certificate-add-failed:
    description: Adding an SSL certificate for a domain failed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain certificate add failed
      operationId: onDomainCertificateAddFailed
      message:
        $ref: '#/components/messages/DomainCertificateAddFailed'

  domain.certificate-deleted:
    description: An SSL certificate for a domain was deleted.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain certificate deleted
      operationId: onDomainCertificateDeleted
      message:
        $ref: '#/components/messages/DomainCertificateDeleted'

  domain.certificate-renew:
    description: An SSL certificate for a domain was renewed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain certificate renewed
      operationId: onDomainCertificateRenew
      message:
        $ref: '#/components/messages/DomainCertificateRenew'

  domain.certificate-renew-failed:
    description: Renewing an SSL certificate for a domain failed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain certificate renew failed
      operationId: onDomainCertificateRenewFailed
      message:
        $ref: '#/components/messages/DomainCertificateRenewFailed'

  domain.dns-records-changed:
    description: DNS records in a Vercel-hosted zone were changed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain DNS records changed
      operationId: onDomainDnsRecordsChanged
      message:
        $ref: '#/components/messages/DomainDnsRecordsChanged'

  domain.renewal:
    description: A domain was renewed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain renewed
      operationId: onDomainRenewal
      message:
        $ref: '#/components/messages/DomainRenewal'

  domain.renewal-failed:
    description: A domain renewal failed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain renewal failed
      operationId: onDomainRenewalFailed
      message:
        $ref: '#/components/messages/DomainRenewalFailed'

  domain.transfer-in-started:
    description: A domain transfer into Vercel was initiated.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain transfer-in started
      operationId: onDomainTransferInStarted
      message:
        $ref: '#/components/messages/DomainTransferInStarted'

  domain.transfer-in-completed:
    description: A domain transfer into Vercel completed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain transfer-in completed
      operationId: onDomainTransferInCompleted
      message:
        $ref: '#/components/messages/DomainTransferInCompleted'

  domain.transfer-in-failed:
    description: A domain transfer into Vercel failed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Domain transfer-in failed
      operationId: onDomainTransferInFailed
      message:
        $ref: '#/components/messages/DomainTransferInFailed'

  project.created:
    description: A new project was created. Sent only when the integration has access to all team projects.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project created
      operationId: onProjectCreated
      message:
        $ref: '#/components/messages/ProjectCreated'

  project.removed:
    description: A project was removed. Sent only when the integration has access to all team projects.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project removed
      operationId: onProjectRemoved
      message:
        $ref: '#/components/messages/ProjectRemoved'

  project.renamed:
    description: A project was renamed. Sent only when the integration has access to all team projects.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project renamed
      operationId: onProjectRenamed
      message:
        $ref: '#/components/messages/ProjectRenamed'

  project.env-variable.created:
    description: A project environment variable was created. The value is not included in the payload.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project environment variable created
      operationId: onProjectEnvVariableCreated
      message:
        $ref: '#/components/messages/ProjectEnvVariableCreated'

  project.env-variable.updated:
    description: A project environment variable was updated. The value is not included in the payload.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project environment variable updated
      operationId: onProjectEnvVariableUpdated
      message:
        $ref: '#/components/messages/ProjectEnvVariableUpdated'

  project.env-variable.deleted:
    description: A project environment variable was deleted.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project environment variable deleted
      operationId: onProjectEnvVariableDeleted
      message:
        $ref: '#/components/messages/ProjectEnvVariableDeleted'

  project.domain.created:
    description: A domain was added to a project.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project domain created
      operationId: onProjectDomainCreated
      message:
        $ref: '#/components/messages/ProjectDomainCreated'

  project.domain.deleted:
    description: A domain was removed from a project.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project domain deleted
      operationId: onProjectDomainDeleted
      message:
        $ref: '#/components/messages/ProjectDomainDeleted'

  project.domain.moved:
    description: A domain was moved between projects.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project domain moved
      operationId: onProjectDomainMoved
      message:
        $ref: '#/components/messages/ProjectDomainMoved'

  project.domain.verified:
    description: A project domain was verified.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project domain verified
      operationId: onProjectDomainVerified
      message:
        $ref: '#/components/messages/ProjectDomainVerified'

  project.domain.unverified:
    description: A project domain became unverified.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project domain unverified
      operationId: onProjectDomainUnverified
      message:
        $ref: '#/components/messages/ProjectDomainUnverified'

  project.domain.updated:
    description: A project domain configuration was updated.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Project domain updated
      operationId: onProjectDomainUpdated
      message:
        $ref: '#/components/messages/ProjectDomainUpdated'

  project.rolling-release.started:
    description: A rolling release was started.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Rolling release started
      operationId: onProjectRollingReleaseStarted
      message:
        $ref: '#/components/messages/ProjectRollingReleaseStarted'

  project.rolling-release.approved:
    description: A rolling release stage was approved.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Rolling release approved
      operationId: onProjectRollingReleaseApproved
      message:
        $ref: '#/components/messages/ProjectRollingReleaseApproved'

  project.rolling-release.completed:
    description: A rolling release completed successfully.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Rolling release completed
      operationId: onProjectRollingReleaseCompleted
      message:
        $ref: '#/components/messages/ProjectRollingReleaseCompleted'

  project.rolling-release.aborted:
    description: A rolling release was aborted.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Rolling release aborted
      operationId: onProjectRollingReleaseAborted
      message:
        $ref: '#/components/messages/ProjectRollingReleaseAborted'

  flag.created:
    description: A feature flag was created.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Feature flag created
      operationId: onFlagCreated
      message:
        $ref: '#/components/messages/FlagCreated'

  flag.updated:
    description: A feature flag was updated.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Feature flag updated
      operationId: onFlagUpdated
      message:
        $ref: '#/components/messages/FlagUpdated'

  integration-configuration.removed:
    description: An integration configuration was removed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Integration configuration removed
      operationId: onIntegrationConfigurationRemoved
      message:
        $ref: '#/components/messages/IntegrationConfigurationRemoved'

  integration-configuration.permission-upgraded:
    description: A user changed which projects an integration has access to.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Integration configuration permission upgraded
      operationId: onIntegrationConfigurationPermissionUpgraded
      message:
        $ref: '#/components/messages/IntegrationConfigurationPermissionUpgraded'

  integration-configuration.scope-change-confirmed:
    description: A user confirmed pending scope changes for an integration.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Integration configuration scope change confirmed
      operationId: onIntegrationConfigurationScopeChangeConfirmed
      message:
        $ref: '#/components/messages/IntegrationConfigurationScopeChangeConfirmed'

  integration-configuration.transferred:
    description: An integration installation was transferred to another team.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Integration configuration transferred
      operationId: onIntegrationConfigurationTransferred
      message:
        $ref: '#/components/messages/IntegrationConfigurationTransferred'

  integration-resource.project-connected:
    description: A user connected an integration resource to a project.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Integration resource connected to project
      operationId: onIntegrationResourceProjectConnected
      message:
        $ref: '#/components/messages/IntegrationResourceProjectConnected'

  integration-resource.project-disconnected:
    description: A user disconnected an integration resource from a project.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Integration resource disconnected from project
      operationId: onIntegrationResourceProjectDisconnected
      message:
        $ref: '#/components/messages/IntegrationResourceProjectDisconnected'

  marketplace.invoice.created:
    description: A marketplace invoice was created and sent to the customer.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Marketplace invoice created
      operationId: onMarketplaceInvoiceCreated
      message:
        $ref: '#/components/messages/MarketplaceInvoiceCreated'

  marketplace.invoice.paid:
    description: A marketplace invoice was paid.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Marketplace invoice paid
      operationId: onMarketplaceInvoicePaid
      message:
        $ref: '#/components/messages/MarketplaceInvoicePaid'

  marketplace.invoice.notpaid:
    description: A marketplace invoice payment failed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Marketplace invoice not paid
      operationId: onMarketplaceInvoiceNotPaid
      message:
        $ref: '#/components/messages/MarketplaceInvoiceNotPaid'

  marketplace.invoice.overdue:
    description: A marketplace invoice was not paid after the grace period.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Marketplace invoice overdue
      operationId: onMarketplaceInvoiceOverdue
      message:
        $ref: '#/components/messages/MarketplaceInvoiceOverdue'

  marketplace.invoice.refunded:
    description: A marketplace invoice was refunded.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Marketplace invoice refunded
      operationId: onMarketplaceInvoiceRefunded
      message:
        $ref: '#/components/messages/MarketplaceInvoiceRefunded'

  marketplace.member.changed:
    description: A marketplace installation member was added, removed, or had their role changed.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Marketplace member changed
      operationId: onMarketplaceMemberChanged
      message:
        $ref: '#/components/messages/MarketplaceMemberChanged'

  alerts.triggered:
    description: An observability alert was triggered.
    bindings:
      http:
        type: request
        method: POST
        bindingVersion: 0.3.0
    subscribe:
      summary: Alert triggered
      operationId: onAlertsTriggered
      message:
        $ref: '#/components/messages/AlertsTriggered'

components:
  messageTraits:
    VercelWebhookHeaders:
      headers:
        type: object
        required:
          - content-type
          - x-vercel-signature
        properties:
          content-type:
            type: string
            const: application/json
            description: Vercel sends webhook bodies as JSON.
          x-vercel-signature:
            type: string
            description: |
              Hex-encoded HMAC-SHA1 of the raw request body computed with
              the webhook's secret. Subscribers should recompute this value
              over the raw body and compare using a constant-time
              comparison.
            example: 1d6789a4f5e6c0a4d5b9f2c3e4a5b6c7d8e9f0a1

  messages:
    DeploymentCreated:
      name: deployment.created
      title: Deployment created
      summary: A new deployment is initiated.
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentCreatedEnvelope'

    DeploymentReady:
      name: deployment.ready
      title: Deployment ready
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentReadyEnvelope'

    DeploymentSucceeded:
      name: deployment.succeeded
      title: Deployment succeeded
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentSucceededEnvelope'

    DeploymentError:
      name: deployment.error
      title: Deployment error
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentErrorEnvelope'

    DeploymentCanceled:
      name: deployment.canceled
      title: Deployment canceled
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentCanceledEnvelope'

    DeploymentPromoted:
      name: deployment.promoted
      title: Deployment promoted
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentPromotedEnvelope'

    DeploymentRollback:
      name: deployment.rollback
      title: Deployment rollback accepted
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentRollbackEnvelope'

    DeploymentCleanup:
      name: deployment.cleanup
      title: Deployment cleanup
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentCleanupEnvelope'

    DeploymentCheckRerequested:
      name: deployment.check-rerequested
      title: Deployment check re-requested
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentCheckRerequestedEnvelope'

    DeploymentIntegrationActionStart:
      name: deployment.integration.action.start
      title: Deployment integration action started
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentIntegrationActionStartEnvelope'

    DeploymentIntegrationActionCancel:
      name: deployment.integration.action.cancel
      title: Deployment integration action canceled
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentIntegrationActionCancelEnvelope'

    DeploymentIntegrationActionCleanup:
      name: deployment.integration.action.cleanup
      title: Deployment integration action cleanup
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DeploymentIntegrationActionCleanupEnvelope'

    DomainCreated:
      name: domain.created
      title: Domain created
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainCreatedEnvelope'

    DomainAutoRenewChanged:
      name: domain.auto-renew-changed
      title: Domain auto-renew changed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainAutoRenewChangedEnvelope'

    DomainCertificateAdd:
      name: domain.certificate-add
      title: Domain certificate added
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainCertificateAddEnvelope'

    DomainCertificateAddFailed:
      name: domain.certificate-add-failed
      title: Domain certificate add failed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainCertificateAddFailedEnvelope'

    DomainCertificateDeleted:
      name: domain.certificate-deleted
      title: Domain certificate deleted
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainCertificateDeletedEnvelope'

    DomainCertificateRenew:
      name: domain.certificate-renew
      title: Domain certificate renewed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainCertificateRenewEnvelope'

    DomainCertificateRenewFailed:
      name: domain.certificate-renew-failed
      title: Domain certificate renew failed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainCertificateRenewFailedEnvelope'

    DomainDnsRecordsChanged:
      name: domain.dns-records-changed
      title: Domain DNS records changed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainDnsRecordsChangedEnvelope'

    DomainRenewal:
      name: domain.renewal
      title: Domain renewed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainRenewalEnvelope'

    DomainRenewalFailed:
      name: domain.renewal-failed
      title: Domain renewal failed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainRenewalFailedEnvelope'

    DomainTransferInStarted:
      name: domain.transfer-in-started
      title: Domain transfer-in started
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainTransferInStartedEnvelope'

    DomainTransferInCompleted:
      name: domain.transfer-in-completed
      title: Domain transfer-in completed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainTransferInCompletedEnvelope'

    DomainTransferInFailed:
      name: domain.transfer-in-failed
      title: Domain transfer-in failed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/DomainTransferInFailedEnvelope'

    ProjectCreated:
      name: project.created
      title: Project created
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/ProjectCreatedEnvelope'

    ProjectRemoved:
      name: project.removed
      title: Project removed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/ProjectRemovedEnvelope'

    ProjectRenamed:
      name: project.renamed
      title: Project renamed
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/ProjectRenamedEnvelope'

    ProjectEnvVariableCreated:
      name: project.env-variable.created
      title: Project environment variable created
      contentType: application/json
      traits:
        - $ref: '#/components/messageTraits/VercelWebhookHeaders'
      payload:
        $ref: '#/components/schemas/Project

# --- truncated at 32 KB (82 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/vercel/refs/heads/main/asyncapi/vercel-webhooks-asyncapi.yml