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 GatewayGatewaysObservabilityWebhookServerlessHostingDeploymentAsyncAPIEventsWebhooks

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

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/vercel-webhooks-asyncapi"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.