Webhooks API Reference

Vercel Integrations allow you to subscribe to certain trigger-based events through webhooks. An example use-cases for webhooks might be cleaning up resources after someone removes your Integration.

The webhook payload is a JSON object with the following keys.

KeyTypeDescription
typeStringThe event type.
idIDThe ID of the webhook delivery.
createdAtDateThe webhook delivery timestamp.
regionStringThe region the event occurred in (possibly null).
payloadObjectThe payload of the webhook. See Supported Event Types for more information.

Occurs whenever a deployment is canceled.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.project.idIDThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

Occurs when a user has requested for a check to be rerun after it failed.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.deployment.idIDThe ID of the deployment.
payload.check.idIDThe ID of the check.

Occurs whenever a deployment is created.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.aliasListAn array of aliases that will get assigned when the deployment is ready.
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.project.idIDThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

Occurs whenever a deployment has failed.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.project.idIDThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

Occurs when an integration deployment action or the deployment itself is canceled.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.resourceIdIDThe ID of the integration resource for which the action is canceled.
payload.actionStringThe action slug, declared by the integration
payload.deployment.idIDThe ID of the deployment.

Occurs when a deployment that executed an integration deployment action is cleaned up, such as due to the deployment retention policy.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.resourceIdIDThe ID of the integration resource for which the action is cleaned up.
payload.actionStringThe action slug, declared by the integration
payload.deployment.idIDThe ID of the deployment.

Occurs when a deployment starts an integration deployment action.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.resourceIdIDThe ID of the integration resource for which the action is started.
payload.actionStringThe action slug, declared by the integration
payload.deployment.idIDThe ID of the deployment.

Occurs whenever a deployment is promoted.

This event gets fired after a production deployment is promoted to start serving production traffic. This can happen automatically after a successful build, or after running the promote command.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.project.idIDThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

Occurs whenever a deployment is successfully built and your integration has registered at least one check.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.project.idIDThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

Occurs whenever a deployment is ready.

This event gets fired after all blocking Checks have passed. See deployment-prepared if you registered Checks.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.project.idIDThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

Occurs whenever a domain has been created.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.domain.nameStringThe Domain name created.
payload.domain.delegatedBooleanWhether or not the domain was delegated/shared.

Occurs whenever a domain's auto-renewal setting is changed.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.domain.nameStringThe name of the domain.
payload.previousBooleanThe previous auto-renewal setting.
payload.nextBooleanThe new auto-renewal setting.

Occurs whenever a new SSL certificate is added for a domain.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.certObjectThe certificate object containing certificate details.

Occurs whenever adding a new SSL certificate for a domain fails.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.dnsNamesListAn array of DNS names for which the certificate addition failed.

Occurs whenever an SSL certificate is deleted for a domain.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.certObjectThe certificate object containing certificate details.

Occurs whenever an SSL certificate is renewed for a domain.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.certObjectThe certificate object containing certificate details.

Occurs whenever renewing an SSL certificate for a domain fails.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.dnsNamesListAn array of DNS names for which the certificate renewal failed.

Occurs whenever DNS records for a domain are modified.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.zoneStringThe DNS zone that was modified.
payload.changesListAn array of changes made to the DNS records.

Occurs whenever a domain is renewed.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.domain.nameStringThe name of the domain that was renewed.
payload.priceStringThe renewal price as a decimal number.
payload.expirationDateDateThe new expiration date of the domain.
payload.renewedAtDateThe timestamp when the domain was renewed.

Occurs whenever a domain renewal fails.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.domain.nameStringThe name of the domain for which renewal failed.
payload.errorReasonStringThe reason why the renewal failed.
payload.failedAtDateThe timestamp when the renewal failed.

Occurs whenever a domain transfer into Vercel is completed.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.domain.nameStringThe name of the domain that was transferred.

Occurs whenever a domain transfer into Vercel fails.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.domain.nameStringThe name of the domain for which the transfer failed.

Occurs whenever a domain transfer into Vercel is initiated.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.domain.nameStringThe name of the domain for which the transfer was started.

Occurs whenever a domain is added to a project.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.domain.nameStringThe name of the domain that was added to the project.

Occurs whenever a domain is removed from a project.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.domain.nameStringThe name of the domain that was removed from the project.

Occurs whenever a domain is moved from one project to another.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.domain.nameStringThe name of the domain that was moved.
payload.from.projectIdIDThe ID of the project the domain was moved from.
payload.to.projectIdIDThe ID of the project the domain was moved to.
payload.isRedirectBooleanWhether the move created a redirect.

Occurs whenever a project domain becomes unverified.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.domain.nameStringThe name of the domain that became unverified.

Occurs whenever a project domain is updated.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.previous.domainStringThe previous domain name.
payload.previous.redirectStringThe previous redirect URL (possibly null).
payload.previous.redirectStatusCodeNumberThe previous redirect status code (possibly null).
payload.previous.gitBranchStringThe previous git branch (possibly null).
payload.next.domainStringThe new domain name.
payload.next.redirectStringThe new redirect URL (possibly null).
payload.next.redirectStatusCodeNumberThe new redirect status code (possibly null).
payload.next.gitBranchStringThe new git branch (possibly null).

Occurs whenever a project domain is verified.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.domain.nameStringThe name of the domain that was verified.

Occurs whenever the user changes the project permission for an integration.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.configuration.idIDThe ID of the configuration.
payload.configuration.projectSelectionStringA String representing the permission for projects. Possible values are all or selected.
payload.configuration.projectsListAn array of project IDs.
payload.projects.addedListAn array of added project IDs.
payload.projects.removedListAn array of removed project IDs.

Occurs whenever an integration has been removed.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.configuration.idIDThe ID of the configuration.
payload.configuration.projectSelectionStringA String representing the permission for projects. Possible values are all or selected.
payload.configuration.projectsListAn array of project IDs.

Occurs whenever the user confirms pending scope changes.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.configuration.idIDThe ID of the configuration.
payload.configuration.scopesListList of all scopes (after confirmation).

Occurs whenever the user connects the integration resource to a project.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.resourceIdIDThe ID of the resource.
payload.project.idIDThe ID of the project.
payload.project.nameStringThe name of the project.
payload.projectIdIDThe ID of the project (same as project.id).
payload.targetsListThe list of the deployment targets.

Occurs whenever the user disconnects the integration resource to a project.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.resourceIdIDThe ID of the resource.
payload.project.idIDThe ID of the project.
payload.projectIdIDThe ID of the project (same as project.id).
payload.targetsListThe list of the deployment targets.

Occurs when an invoice was created and sent to the customer.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.invoiceIdIDThe ID of the Marketplace invoice.
payload.externalInvoiceIdIDThe ID of the Marketplace invoice, provided by integrator. Possibly null.
payload.period.startIsoDateThe invoice's period start date.
payload.period.endIsoDateThe invoice's period end date.
payload.invoiceDateIsoDateThe invoice's date.
payload.invoiceTotalStringThe invoice's total as a decimal number.

Occurs when an invoice was not paid after a grace period.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.invoiceIdIDThe ID of the Marketplace invoice.
payload.externalInvoiceIdIDThe ID of the Marketplace invoice, provided by integrator. Possibly null.
payload.period.startIsoDateThe invoice's period start date.
payload.period.endIsoDateThe invoice's period end date.
payload.invoiceDateIsoDateThe invoice's date.
payload.invoiceTotalStringThe invoice's total as a decimal number.

Occurs when an invoice was paid.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.invoiceIdIDThe ID of the Marketplace invoice.
payload.externalInvoiceIdIDThe ID of the Marketplace invoice, provided by integrator. Possibly null.
payload.period.startIsoDateThe invoice's period start date.
payload.period.endIsoDateThe invoice's period end date.
payload.invoiceDateIsoDateThe invoice's date.
payload.invoiceTotalStringThe invoice's total as a decimal number.

Occurs when an invoice is refunded.

KeyTypeDescription
payload.configuration.idIDThe ID of the integration installation.
payload.installationIdIDThe ID of the integration installation (same as configuration.id).
payload.invoiceIdIDThe ID of the Marketplace invoice.
payload.externalInvoiceIdIDThe ID of the Marketplace invoice, provided by integrator. Possibly null.
payload.period.startIsoDateThe invoice's period start date.
payload.period.endIsoDateThe invoice's period end date.
payload.amountStringThe amount being refunded as a decimal number.
payload.reasonStringThe reason for why the refund has been issued.

Occurs whenever a project has been created.

This event is sent only when the Integration has access to all projects in a Vercel scope.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.project.nameStringName of the project.

Occurs whenever a project has been removed.

This event is sent only when the integration has access to all projects in a Vercel scope.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.project.nameStringName of the project.

Occurs whenever a rolling release stage is approved and progresses to the next stage.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.project.nameStringName of the project.
payload.rollingReleaseObjectThe current rolling release configuration.
payload.rollingRelease.projectIdIDThe ID of the project.
payload.rollingRelease.ownerIdIDThe ID of the team or user that owns the rolling release.
payload.rollingRelease.deploymentIdsListArray of deployment IDs involved in the rolling release.
payload.rollingRelease.stateStringThe current state of the rolling release. Possible values are ACTIVE, COMPLETE, ABORTED.
payload.rollingRelease.activeStageIndexNumberThe index of the currently active stage.
payload.rollingRelease.defaultObjectThe default deployment configuration.
payload.rollingRelease.default.baseDeploymentIdIDThe ID of the base deployment.
payload.rollingRelease.default.targetDeploymentIdIDThe ID of the target deployment.
payload.rollingRelease.default.targetPercentageNumberThe target percentage of traffic to route to the target deployment.
payload.rollingRelease.default.targetStartAtNumberThe timestamp when the target deployment started.
payload.rollingRelease.default.targetUpdatedAtNumberThe timestamp when the target deployment was last updated.
payload.rollingRelease.configObjectThe rolling release configuration.
payload.rollingRelease.config.targetStringThe target environment for the rolling release.
payload.rollingRelease.config.stagesListArray of stage configurations.
payload.rollingRelease.writtenByStringThe source that triggered the rolling release update.
payload.prevRollingReleaseObjectThe previous rolling release configuration before the approval.

Occurs whenever a rolling release is completed successfully.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.project.nameStringName of the project.
payload.rollingReleaseObjectThe completed rolling release configuration.
payload.rollingRelease.projectIdIDThe ID of the project.
payload.rollingRelease.ownerIdIDThe ID of the team or user that owns the rolling release.
payload.rollingRelease.deploymentIdsListArray of deployment IDs involved in the rolling release.
payload.rollingRelease.stateStringThe state of the rolling release (will be COMPLETE).
payload.rollingRelease.activeStageIndexNumberThe index of the final stage.
payload.rollingRelease.defaultObjectThe final deployment configuration.
payload.rollingRelease.default.baseDeploymentIdIDThe ID of the base deployment.
payload.rollingRelease.default.targetDeploymentIdIDThe ID of the target deployment.
payload.rollingRelease.default.targetPercentageNumberThe final target percentage (will be 100).
payload.rollingRelease.default.targetStartAtNumberThe timestamp when the target deployment started.
payload.rollingRelease.default.targetUpdatedAtNumberThe timestamp when the target deployment was last updated.
payload.rollingRelease.configObjectThe rolling release configuration.
payload.rollingRelease.config.targetStringThe target environment for the rolling release.
payload.rollingRelease.config.stagesListArray of stage configurations.
payload.rollingRelease.writtenByStringThe source that completed the rolling release.
payload.prevRollingReleaseObjectThe previous rolling release configuration before completion.

Occurs whenever a rolling release is aborted.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.project.nameStringName of the project.
payload.rollingReleaseObjectThe aborted rolling release configuration.
payload.rollingRelease.projectIdIDThe ID of the project.
payload.rollingRelease.ownerIdIDThe ID of the team or user that owns the rolling release.
payload.rollingRelease.deploymentIdsListArray of deployment IDs involved in the rolling release.
payload.rollingRelease.stateStringThe state of the rolling release (will be ABORTED).
payload.rollingRelease.activeStageIndexNumberThe index of the stage when aborted.
payload.rollingRelease.defaultObjectThe deployment configuration at the time of abortion.
payload.rollingRelease.default.baseDeploymentIdIDThe ID of the base deployment.
payload.rollingRelease.default.targetDeploymentIdIDThe ID of the target deployment.
payload.rollingRelease.default.targetStartAtNumberThe timestamp when the target deployment started.
payload.rollingRelease.default.targetUpdatedAtNumberThe timestamp when the rolling release was aborted.
payload.rollingRelease.configObjectThe rolling release configuration.
payload.rollingRelease.config.targetStringThe target environment for the rolling release.
payload.rollingRelease.config.stagesListArray of stage configurations.
payload.rollingRelease.writtenByStringThe source that aborted the rolling release.
payload.prevRollingReleaseObjectThe previous rolling release configuration before abortion.

Occurs whenever a rolling release is started.

KeyTypeDescription
payload.team.idIDThe ID of the event's team (possibly null).
payload.user.idIDThe ID of the event's user.
payload.project.idIDThe ID of the project.
payload.project.nameStringName of the project.
payload.rollingReleaseObjectThe started rolling release configuration.
payload.rollingRelease.projectIdIDThe ID of the project.
payload.rollingRelease.ownerIdIDThe ID of the team or user that owns the rolling release.
payload.rollingRelease.deploymentIdsListArray of deployment IDs involved in the rolling release.
payload.rollingRelease.stateStringThe state of the rolling release (will be ACTIVE).
payload.rollingRelease.activeStageIndexNumberThe index of the initial stage (usually 0).
payload.rollingRelease.defaultObjectThe initial deployment configuration.
payload.rollingRelease.default.baseDeploymentIdIDThe ID of the base deployment.
payload.rollingRelease.default.targetDeploymentIdIDThe ID of the target deployment.
payload.rollingRelease.default.targetPercentageNumberThe initial target percentage for the first stage.
payload.rollingRelease.default.targetStartAtNumberThe timestamp when the rolling release started.
payload.rollingRelease.default.targetUpdatedAtNumberThe timestamp when the rolling release was last updated.
payload.rollingRelease.configObjectThe rolling release configuration.
payload.rollingRelease.config.targetStringThe target environment for the rolling release.
payload.rollingRelease.config.stagesListArray of stage configurations.
payload.rollingRelease.writtenByStringThe source that started the rolling release.
payload.prevRollingReleaseObjectThe previous rolling release configuration (if any) before starting the new one.

The legacy webhook payload is a JSON object with the following keys.

KeyTypeDescription
typeStringThe legacy event type.
idIDThe ID of the webhook delivery.
createdAtNumberThe webhook delivery timestamp.
regionStringThe region the event occurred in (possibly null).
clientIdIDThe ID of integration's client.
ownerIdIDThe ID of the event owner (user or team).
teamIdIDThe ID of the event's team (possibly null).
userIdIDThe ID of the event's users.
webhookIdIDThe ID of the webhook.
payloadObjectThe payload of the webhook. See Legacy Event Types for more information.

The following event types have been deprecated and webhooks that listen for them can no longer be created. Vercel will continue to deliver the deprecated events to existing webhooks.

This event is replaced by deployment.created.

Occurs whenever a deployment is created.

KeyTypeDescription
payload.aliasListAn array of aliases that will get assigned when the deployment is ready.
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.projectIdStringThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

This event is replaced by deployment.succeeded.

Occurs whenever a deployment is ready.

This event gets fired after all blocking checks have passed. See deployment-prepared if you registered Checks.

KeyTypeDescription
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.projectIdStringThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

This event is replaced by deployment.ready.

Occurs whenever a deployment is successfully built and your integration has registered at least one check.

KeyTypeDescription
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.projectIdStringThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

This event is replaced by deployment.canceled.

Occurs whenever a deployment is canceled.

KeyTypeDescription
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.projectIdStringThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

This event is replaced by deployment.error.

Occurs whenever a deployment has failed.

KeyTypeDescription
payload.deployment.idIDThe ID of the deployment.
payload.deployment.metaMapA Map of deployment metadata.
payload.deployment.urlStringThe URL of the deployment.
payload.deployment.nameStringThe project name used in the deployment URL.
payload.links.deploymentStringThe URL on the Vercel Dashboard to inspect the deployment.
payload.links.projectStringThe URL on the Vercel Dashboard to the project.
payload.targetStringA String that indicates the target. Possible values are production, staging or null.
payload.projectIdStringThe ID of the project.
payload.planStringThe plan type of the deployment.
payload.regionsListAn array of the supported regions for the deployment.

This event is replaced by deployment.check-rerequested.

Occurs when a user has requested for a check to be rerun after it failed.

KeyTypeDescription
payload.deployment.idIDThe ID of the deployment.
payload.check.idIDThe ID of the check.

This event has been removed. deployment.succeeded can be used for the same purpose.

Occurs when all checks for a deployment have completed. This does not indicate that they have all passed, only that they are no longer running. It is possible for webhook to occur multiple times for a single deployment if any checks are re-requested.

KeyTypeDescription
payload.deployment.idIDThe ID of the deployment.
payload.checksListInformation about the Checks.

Each item in checks has the following properties:

KeyTypeDescription
payload.idIDThe unique identifier of the check. Always prepended with check_.
payload.nameStringThe name of the check.
payload.statusStringThe status of the check. One of registered, running or completed
payload.conclusionStringThe conclusion of the check. One of cancelled, failed, neutral, succeeded or skipped.
payload.blockingBooleanWhether a deployment should be blocked or not.
payload.integrationIdStringThe unique identifier of the integration.

This event is replaced by project.created.

Occurs whenever a project has been created.

This event is sent only when the Integration has access to all projects in a Vercel scope.


KeyTypeDescription
payload.project.idIDThe ID of the project.
payload.project.nameStringName of the project.

This event is replaced by project.removed.

Occurs whenever a Project has been removed.

This event is sent only when the Integration has access to all Projects in a Vercel scope.


KeyTypeDescription
payload.project.idIDThe ID of the project.
payload.project.nameStringName of the project.

This event is replaced by integration-configuration.removed.

Occurs whenever an integration has been removed.

KeyTypeDescription
payload.configuration.idIDThe ID of the configuration.
payload.configuration.projectsListAn array of project IDs.

Occurs whenever the user changes the project permission for an integration.

KeyTypeDescription
payload.configuration.idIDThe ID of the configuration.
payload.configuration.projectSelectionStringA String representing the permission for projects. Possible values are all or selected.
payload.configuration.projectsListAn array of project IDs.
payload.projects.addedListAn array of added project IDs.
payload.projects.removedListAn array of removed project IDs.

Occurs whenever the user confirms pending scope changes.

KeyTypeDescription
payload.configuration.idIDThe ID of the configuration.
payload.configuration.scopesListList of all scopes (after confirmation).

This event is replaced by domain.created.

Occurs whenever a domain has been created.

KeyTypeDescription
payload.domain.nameStringThe Domain name created.
payload.domain.delegatedStringWhether or not the domain was delegated/shared.

Once your server is configured to receive payloads, it will listen for any payload sent to the endpoint you configured. By knowing the URL of your webhook, anybody can send you requests. Therefore, it is recommended to check whether the requests are coming from Vercel or not.

The recommended method to check is to use the x-vercel-signature security header you receive with each request. The value of this header corresponds to the sha1 of the request body using your client secret.

For example, you can validate a webhook request as follows:

app/api/webhook-validator-example/route.ts
import crypto from 'crypto';
 
export async function GET(request: Request) {
  const { INTEGRATION_SECRET } = process.env;
 
  if (typeof INTEGRATION_SECRET != 'string') {
    throw new Error('No integration secret found');
  }
 
  const rawBody = await request.text();
  const rawBodyBuffer = Buffer.from(rawBody, 'utf-8');
  const bodySignature = sha1(rawBodyBuffer, INTEGRATION_SECRET);
 
  if (bodySignature !== request.headers.get('x-vercel-signature')) {
    return Response.json({
      code: 'invalid_signature',
      error: "signature didn't match",
    });
  }
 
  const json = JSON.parse(rawBodyBuffer.toString('utf-8'));
 
  switch (json.type) {
    case 'project.created':
    // ...
  }
 
  return new Response('Webhook request validated', {
    status: 200,
  });
}
 
function sha1(data: Buffer, secret: string): string {
  return crypto.createHmac('sha1', secret).update(data).digest('hex');
}
Example on how to validate a webhook message.

You can compute the signature using an HMAC hexdigest from the secret token of OAuth2 and request body, then compare it with the value of the x-vercel-signature header to validate the payload.

You should consider this HTTP request to be an event. Once you receive the request, you should schedule a task for your action.

This request has a timeout of 30 seconds. That means if a 2XX HTTP response is not received within 30 seconds, the request will be aborted.

If your HTTP endpoint does not respond with a 2XX HTTP status code, we attempt to deliver the webhook event up to 24 hours with an exponential backoff. Events that could not be delivered within 24 hours will not be retried and will be discarded.

Last updated on May 8, 2025