HELIOS DOCS

Vercel

The Vercel integration lets Helios agents call the Vercel REST API with your access token, and run agents automatically on Vercel webhook events such as failed deployments, promotions, rollbacks, domain and certificate changes, environment variable changes, feature flag changes, alerts, and firewall attacks.

What your agents can do

Agents can call Vercel REST API endpoints for deployments, projects, environment variables, domains, and feature flags. Helios attaches the connection's token to requests. Access depends on the token's permissions.

  • Read the build logs of a failed deployment and explain what broke
  • List projects and deployments and report their state
  • Redeploy a deployment, promote one to production, or roll back
  • Read and change environment variables
  • Check domains, DNS records, and certificates
  • Read and change feature flags

Agents can call only api.vercel.com. Vercel Blob, Edge Config reads, and AI Gateway run on other hosts with their own tokens, so agents can't reach them. Agents can send files of up to 16 MB, such as deployment files to POST /v2/files.

With Your own Vercel OAuth app, an agent can reach only the endpoints that the integration's API scopes cover, and only the projects you gave it access to when you installed it.

Authentication

MethodTypeDescription
Vercel Access TokenAPI KeyA Vercel access token, plus an optional team ID or slug
Your own Vercel OAuth appOAuth 2.0A Vercel integration you create, with its client ID, secret and URL slug

See Integration authentication for how credentials are stored and injected.

The two methods receive different trigger events. See Triggers.

Vercel Access Token

A Vercel access token has no permission settings. It acts with the role of the member who created it, within the scope you choose. For full access, create it as a team Owner. A Member can't change billing or invite users, and a Developer can't change production environment variables. Triggers need a team on Vercel's Pro or Enterprise plan, because Vercel offers account webhooks only on those plans.

  1. In Vercel, open the Account Tokens page in your account settings.
  2. Enter a name. Under Scope, choose the team the agents should work in and select All Projects, or choose Full Account.
  3. Choose an expiration and click Create. Copy the token. Vercel shows it only once.
  4. In Helios, choose Vercel Access Token and paste the token into Vercel Access Token.
  5. If the token is a Full Account token, enter the team ID (team_..., from the team's Settings → General page) or the team slug in Team ID or slug. Without it, Helios works in your personal account. A token scoped to a team needs no team ID.
  6. Save.

A token scoped to a single project can't manage the team's webhooks, so triggers don't work with it. When the token expires, create a new one and enter it through Manage.

Vercel records every change made with the token as the member who owns it. The token can do anything that member can, including deleting deployments and changing production environment variables, so give it the narrowest scope that covers the projects the agents need.

Your own Vercel OAuth app

In Vercel, an OAuth app is an integration that you create in the Integrations Console. Installing it gives Helios a long-lived token for the team or account you install it on. Vercel issues no refresh token.

  1. In Vercel, open Integrations in the sidebar, click Integrations Console, and click Create.

  2. Fill in the form. It asks for a name, a URL Slug, a logo, contact details, and links to your terms and privacy policy.

  3. Set Redirect URL to:

    https://api.heliosapp.com/integrations/vercel/oauth_callback
  4. Under API Scopes, give the integration every scope at its highest level:

    ScopeLevelWhat it allows
    Integration ConfigurationRead/WriteRead the installation, and remove it
    DeploymentsRead/WriteRead deployments and build logs, and create, change, and delete deployments
    Deployment ChecksRead/WriteRead, create, and update checks on deployments
    ProjectsRead/WriteRead projects and their domains, and create, change, and delete projects
    Project Environment VariablesRead/WriteManage the environment variables the integration created
    Global Project Environment VariablesRead/WriteManage all environment variables in the team or account
    TeamsReadRead the team and its members
    Current UserReadRead the Hobby account the integration is installed on
    DrainsRead/WriteRead, create, and update Drains on Pro and Enterprise teams
    DomainRead/WriteRead domains, their status and configuration, and remove domains
  5. Leave Webhook URL empty for now, and save the integration.

  6. Copy the client ID and client secret from the Credentials section of the integration's settings.

  7. In Helios, choose Your own Vercel OAuth app. Fill in Client ID and Client Secret, and enter the integration's URL slug in Integration URL slug.

  8. Save. Helios opens the integration's install page in Vercel. Choose the team, give the integration access to all projects, finish the installation, and Vercel returns you to Helios.

Vercel takes the scopes from the Integrations Console, not from Helios, and it marks none of them as admin-only. So this method has no Admin access option. Vercel's permission list has no scope for feature flags, the firewall, Edge Config, or Sandbox. Use Vercel Access Token when agents need those.

If you change the scopes later, Vercel notifies the team's owners, and the new scopes apply once they confirm them. If you rotate the secret with Rotate Secret, enter the new one in Client Secret through Manage and save. Vercel disables an installation when the member who installed it leaves the team. Connect again as a current member.

Triggers

Vercel can start a Workflow when something changes in your team. How events reach Helios depends on the method, and each method receives a different set of events. The trigger picker shows the events a connection can't receive as unavailable, with the reason.

With Vercel Access Token

Helios creates an account webhook in the team when you save the connection, so there is nothing to set up in Vercel. The webhook covers every project in the team and requests the supported account webhook events. Deleting the connection removes the webhook.

This needs a team on the Pro or Enterprise plan, and a token scoped to that team or to the full account. On a Hobby team, agents can still use the connection, but no events reach Helios. Vercel allows up to 20 account webhooks per team, and each Helios connection uses one. If Vercel refuses an event, Helios creates the webhook again without that event and the events with undocumented payloads. The trigger picker shows every event left out of the webhook as unavailable.

With your own Vercel OAuth app

Helios doesn't create an account webhook for an OAuth app connection. Point the integration's own webhook at Helios instead. Vercel signs these deliveries with the integration's client secret, which Helios already has.

  1. In Helios, open the Vercel connection, click Manage, and open Advanced Configuration. Copy the URL under Webhook Setup.
  2. In the Vercel Integrations Console, open the integration's settings.
  3. Paste the URL into Webhook URL, and select every event the console offers.
  4. Save.

An integration has one webhook URL, so only one Helios connection can receive its events. Helios accepts only deliveries for the installation or owner saved during OAuth. Connect the app again if those details are missing or the installation moves to another team. Vercel sends project.created and project.removed to an integration only when it has access to all projects.

Events for both methods

EventDescriptionFilters
deployment.createdA deployment was createdproject, environment, branch (pattern)
deployment.builtA deployment finished building, before its checks ranproject, environment, branch (pattern)
deployment.succeededA deployment finished building and passed its checksproject, environment, branch (pattern)
deployment.failedA deployment failedproject, environment, branch (pattern)
deployment.canceledA deployment was canceledproject, environment, branch (pattern)
deployment.promotedA deployment was promoted to serve production trafficproject, branch (pattern)
deployment_check.rerequestedA user asked to rerun a failed deployment checknone
domain.createdA domain was added to the accountdomain (pattern)
project.createdA project was creatednone
project.removedA project was deletedproject

Events for Vercel Access Token only

The Integrations Console doesn't offer these events for an integration's webhook.

EventDescriptionFilters
deployment.rolled_backVercel accepted an instant rollback to an earlier production deploymentproject
deployment.deletedA deployment was permanently deleted after its recovery periodproject, environment, branch (pattern)
domain.auto_renew_changedAuto-renewal was turned on or off for a domaindomain (pattern)
domain.renewedA domain was reneweddomain (pattern)
domain.renewal_failedA domain renewal faileddomain (pattern)
domain.transfer_startedA transfer of a domain into Vercel starteddomain (pattern)
domain.transfer_completedA transfer of a domain into Vercel finisheddomain (pattern)
domain.transfer_failedA transfer of a domain into Vercel faileddomain (pattern)
domain.dns_records_changedDNS records of a domain were added, changed or removeddomain (pattern)
certificate.addedAn SSL certificate was added for a domaindomain (pattern)
certificate.add_failedAdding an SSL certificate for a domain faileddomain (pattern)
certificate.renewedAn SSL certificate was reneweddomain (pattern)
certificate.renewal_failedRenewing an SSL certificate faileddomain (pattern)
certificate.deletedAn SSL certificate was deleteddomain (pattern)
project_domain.createdA domain was added to a projectproject, domain (pattern)
project_domain.updatedA project domain's name, redirect or Git branch was changedproject, domain (pattern)
project_domain.deletedA domain was removed from a projectproject, domain (pattern)
project_domain.verifiedA project domain was verifiedproject, domain (pattern)
project_domain.unverifiedA project domain became unverifiedproject, domain (pattern)
project_domain.movedA domain was moved from one project to anotherproject, domain (pattern)
project.renamedA project was renamedproject
env_variable.createdAn environment variable was added to a projectproject
env_variable.updatedA project environment variable was changedproject
env_variable.deletedA project environment variable was deletedproject
rolling_release.startedA rolling release startedproject
rolling_release.approvedA rolling release stage was approved and the release moved to the next stageproject
rolling_release.completedA rolling release finishedproject
rolling_release.abortedA rolling release was abortedproject
flag.createdA feature flag was createdproject, flag (pattern)
flag.updatedA feature flag was changedproject, flag (pattern)
flag.deletedA feature flag was deletedproject, flag (pattern)
flag_segment.createdA flag segment was createdproject, segment (pattern)
flag_segment.updatedA flag segment was changedproject, segment (pattern)
flag_segment.deletedA flag segment was deletedproject, segment (pattern)
alert.triggeredVercel raised an alert about unusual activity in a projectproject, severity
attack.detectedThe Vercel Firewall detected and mitigated a DDoS attacknone

Events with undocumented payloads

Vercel accepts these events for account webhooks but doesn't document their payloads, so they have no filters and a run gets the payload as Vercel sent it. Only Vercel Access Token receives them.

EventDescriptionFilters
budget.reachedThe team's spend reached its budget (undocumented payload)none
deployment.build_requestedA deployment build was requested (undocumented payload)none
deployment.blockedA deployment was blocked (undocumented payload)none
deployment.check_run_startedA check run started on a deployment (undocumented payload)none
deployment.check_run_canceledA check run on a deployment was canceled (undocumented payload)none
deployment.checks_failedA deployment's checks failed (undocumented payload)none
deployment.checks_succeededA deployment's checks passed (undocumented payload)none
edge_config.createdAn Edge Config store was created (undocumented payload)none
edge_config.deletedAn Edge Config store was deleted (undocumented payload)none
edge_config.items_updatedItems in an Edge Config store were changed (undocumented payload)none
firewall.system_rule_anomaly_detectedThe Vercel Firewall saw unusual activity on a system rule (undocumented payload)none
firewall.custom_rule_anomaly_detectedThe Vercel Firewall saw unusual activity on a custom rule (undocumented payload)none
function.archival_requiredVercel marked a function for archival (undocumented payload)none
function.removal_requiredVercel marked a function for removal (undocumented payload)none
ai_gateway.balance_depletedThe AI Gateway credit balance ran out (undocumented payload)none
ai_gateway.auto_reload_limit_reachedAI Gateway auto-reload reached its limit (undocumented payload)none
observability.anomaly_detectedVercel Observability detected an anomaly (undocumented payload)none
observability.anomaly_error_detectedVercel Observability reported an anomaly error (undocumented payload)none
observability.usage_anomaly_detectedVercel Observability detected unusual usage (undocumented payload)none
observability.error_anomaly_detectedVercel Observability detected unusual errors (undocumented payload)none
botid.anomaly_detectedBotID detected unusual bot activity (undocumented payload)none
webhook.testedVercel sent a test delivery (undocumented payload)none
message.createdA message was posted (undocumented payload)none
message.updatedA message was changed (undocumented payload)none
message.deletedA message was deleted (undocumented payload)none
message.reaction_addedA reaction was added to a message (undocumented payload)none
message.reaction_removedA reaction was removed from a message (undocumented payload)none
message.mentionedSomeone was mentioned in a message (undocumented payload)none
thread.resolvedA thread was resolved (undocumented payload)none
thread.unresolvedA resolved thread was reopened (undocumented payload)none
comment.createdA comment was added (undocumented payload)none
comment.updatedA comment was changed (undocumented payload)none
comment.deletedA comment was deleted (undocumented payload)none
comment.resolvedA comment was resolved (undocumented payload)none
comment.unresolvedA resolved comment was reopened (undocumented payload)none
comment.reaction_addedA reaction was added to a comment (undocumented payload)none
comment.reaction_removedA reaction was removed from a comment (undocumented payload)none
comment.mentionedSomeone was mentioned in a comment (undocumented payload)none

Events for your own Vercel OAuth app only

Vercel sends these events only to an integration's webhook. The invoice, member, resource, and deployment action events come from Marketplace native integrations.

EventDescriptionFilters
deployment_action.startedA deployment started an integration's deployment actionnone
deployment_action.canceledAn integration's deployment action or its deployment was cancelednone
deployment_action.cleaned_upA deployment that ran an integration's deployment action was permanently deletednone
installation.permission_upgradedA user changed which projects the integration can accessnone
installation.removedThe integration was removed from a team or accountnone
installation.scope_change_confirmedA user accepted new API scopes for the integrationnone
installation.transferredThe integration's installation moved to another teamnone
resource.connectedAn integration resource was connected to a projectproject
resource.disconnectedAn integration resource was disconnected from a projectproject
invoice.createdA Marketplace invoice was created and sent to the customernone
invoice.paidA Marketplace invoice was paidnone
invoice.payment_failedThe payment for a Marketplace invoice failednone
invoice.overdueA Marketplace invoice was still unpaid after the grace periodnone
invoice.refundedA Marketplace invoice was refundednone
installation_member.changedA member was added to or removed from an installation, or their role changednone

Vercel's event names

Some events have a different name in Vercel:

  • deployment.failed is deployment.error, deployment.built is deployment.ready, deployment.rolled_back is deployment.rollback, and deployment.deleted is deployment.cleanup.
  • deployment_check.rerequested is deployment.check-rerequested, and deployment_action.* is deployment.integration.action.*.
  • The domain.* and certificate.* events are Vercel's domain.* events, such as domain.renewal and domain.certificate-add.
  • project_domain.*, env_variable.*, and rolling_release.* are project.domain.*, project.env-variable.*, and project.rolling-release.*.
  • flag_segment.* is flag.segment.*, alert.triggered is alerts.triggered, and attack.detected is firewall.attack.
  • installation.* is integration-configuration.*, resource.* is integration-resource.*, invoice.* is marketplace.invoice.*, and invoice.payment_failed is marketplace.invoice.notpaid. installation_member.changed is marketplace.member.changed.
  • For the events with undocumented payloads, Helios replaces Vercel's dashes with underscores, as in edge_config.created for edge-config.created. These differ more: deployment.check_run_started and deployment.check_run_canceled are deployment.checkrun.start and deployment.checkrun.cancel, deployment.checks_failed and deployment.checks_succeeded are deployment.checks.failed and deployment.checks.succeeded, edge_config.items_updated is edge-config.items.updated, and ai_gateway.auto_reload_limit_reached is ai-gateway.auto-reload.limit-reached.
  • The *_detected events are Vercel's firewall.system-rule-anomaly, firewall.custom-rule-anomaly, observability.anomaly, observability.anomaly-error, observability.usage-anomaly, observability.error-anomaly, and botid.anomaly. webhook.tested is test-webhook.

Filters

All filters are optional. An empty filter matches every event. Pattern filters are case sensitive, and * matches any text except /.

  • Project matches the project the event belongs to, chosen from a list of your projects. For project_domain.moved, it matches either project.
  • Environment is Production or Preview. Preview matches deployments whose target is preview or null. Other named environments do not match Preview.
  • Branch matches the Git branch the deployment was built from, such as main or feature/*. Helios reads it from the deployment's githubCommitRef, gitlabCommitRef, or bitbucketCommitRef metadata. A deployment without Git metadata, such as one made through the API, has no branch, so a branch filter skips it.
  • Domain matches any domain name in the event, such as *.example.com. That includes the old and new name of an updated project domain, the DNS zone of a DNS change, and the names on a certificate.
  • Flag and Segment match the slug of the feature flag or flag segment, such as checkout-*.
  • Severity is Low, Medium, High, or Critical. Vercel sets Critical only after a Vercel Agent investigation.

Deliveries are verified with the HMAC-SHA1 x-vercel-signature header. Vercel retries a failed delivery for up to 24 hours. Deliveries more than 24 hours old are rejected, and a delivery that Vercel retries is processed once.

An agent that redeploys on deployment.failed starts another run if the redeploy fails too, and each redeploy also sends deployment.created. An agent that changes an environment variable, a domain, or a feature flag sends the matching env_variable.*, project_domain.*, or flag.* event. Say in the prompt when to stop, for example after one retry or for changes the agent made. See Guarding against events you don't want.

Check that it works

  • The connection: after you save, the connection's status shows Connected. Error means Vercel rejected the token, or the team ID or slug is wrong.
  • The webhook: with Vercel Access Token, open the team's Settings → Webhooks in Vercel. A webhook with the connection's Helios URL should be listed. With your own OAuth app, check Webhook URL and the selected events in the integration's settings.
  • A trigger:
    1. Add deployment.created to a workflow with no filters.
    2. Push a commit to a project, or redeploy one.
    3. Check that a run starts. Then open the connection in Helios and click Webhook events to see the event.

Common errors

What you seeCauseFix
The connection's status shows ErrorThe token expired or was deleted, the team ID or slug is wrong, or Vercel disabled the OAuth installationCreate a new token and enter it through Manage, check Team ID or slug, or connect the OAuth app again
Vercel access token not found. Finish connecting the integration first.The OAuth installation wasn't finishedOpen the connection and connect again
Vercel refused to manage webhooks. Triggers need a team on the Pro or Enterprise plan, and a token scoped to that team or to the full account.The team is on the Hobby plan, the token is scoped to one project, or a Full Account token has no team setUse a Pro or Enterprise team and a team or full-account token with Team ID or slug set. Then save the connection again
No Helios webhook under Settings → Webhooks, and no runs startThe team already has 20 webhooks, or setup failed for one of the reasons aboveRemove an unused webhook, then save the connection again
An event shows as unavailableThe connection's method can't receive it, or Vercel left it out of the account webhookUse the other method for that event. See Triggers
No runs start with your own OAuth appWebhook URL in the Integrations Console is empty or wrong, or the event isn't selectedPaste the URL from Webhook Setup and select every event
project.created or project.removed never starts a run with your own OAuth appThe integration doesn't have access to all projectsGive the integration access to all projects in the team's integration settings
Runs stop after you rotate the integration's secretHelios still verifies deliveries with the old secretEnter the new secret in Client Secret through Manage and save
No run starts, and the webhook looks fineThe filters don't match the eventTry the trigger with no filters, then add filters back one at a time

Limits

Account webhooks need a Pro or Enterprise team, and a team can have up to 20 of them. See Vercel's webhooks docs.

Last updated on