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
| Method | Type | Description |
|---|---|---|
| Vercel Access Token | API Key | A Vercel access token, plus an optional team ID or slug |
| Your own Vercel OAuth app | OAuth 2.0 | A 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.
- In Vercel, open the Account Tokens page in your account settings.
- Enter a name. Under Scope, choose the team the agents should work in and select All Projects, or choose Full Account.
- Choose an expiration and click Create. Copy the token. Vercel shows it only once.
- In Helios, choose Vercel Access Token and paste the token into Vercel Access Token.
- 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. - 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.
-
In Vercel, open Integrations in the sidebar, click Integrations Console, and click Create.
-
Fill in the form. It asks for a name, a URL Slug, a logo, contact details, and links to your terms and privacy policy.
-
Set Redirect URL to:
https://api.heliosapp.com/integrations/vercel/oauth_callback -
Under API Scopes, give the integration every scope at its highest level:
Scope Level What it allows Integration Configuration Read/Write Read the installation, and remove it Deployments Read/Write Read deployments and build logs, and create, change, and delete deployments Deployment Checks Read/Write Read, create, and update checks on deployments Projects Read/Write Read projects and their domains, and create, change, and delete projects Project Environment Variables Read/Write Manage the environment variables the integration created Global Project Environment Variables Read/Write Manage all environment variables in the team or account Teams Read Read the team and its members Current User Read Read the Hobby account the integration is installed on Drains Read/Write Read, create, and update Drains on Pro and Enterprise teams Domain Read/Write Read domains, their status and configuration, and remove domains -
Leave Webhook URL empty for now, and save the integration.
-
Copy the client ID and client secret from the Credentials section of the integration's settings.
-
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.
-
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.
- In Helios, open the Vercel connection, click Manage, and open Advanced Configuration. Copy the URL under Webhook Setup.
- In the Vercel Integrations Console, open the integration's settings.
- Paste the URL into Webhook URL, and select every event the console offers.
- 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
| Event | Description | Filters |
|---|---|---|
deployment.created | A deployment was created | project, environment, branch (pattern) |
deployment.built | A deployment finished building, before its checks ran | project, environment, branch (pattern) |
deployment.succeeded | A deployment finished building and passed its checks | project, environment, branch (pattern) |
deployment.failed | A deployment failed | project, environment, branch (pattern) |
deployment.canceled | A deployment was canceled | project, environment, branch (pattern) |
deployment.promoted | A deployment was promoted to serve production traffic | project, branch (pattern) |
deployment_check.rerequested | A user asked to rerun a failed deployment check | none |
domain.created | A domain was added to the account | domain (pattern) |
project.created | A project was created | none |
project.removed | A project was deleted | project |
Events for Vercel Access Token only
The Integrations Console doesn't offer these events for an integration's webhook.
| Event | Description | Filters |
|---|---|---|
deployment.rolled_back | Vercel accepted an instant rollback to an earlier production deployment | project |
deployment.deleted | A deployment was permanently deleted after its recovery period | project, environment, branch (pattern) |
domain.auto_renew_changed | Auto-renewal was turned on or off for a domain | domain (pattern) |
domain.renewed | A domain was renewed | domain (pattern) |
domain.renewal_failed | A domain renewal failed | domain (pattern) |
domain.transfer_started | A transfer of a domain into Vercel started | domain (pattern) |
domain.transfer_completed | A transfer of a domain into Vercel finished | domain (pattern) |
domain.transfer_failed | A transfer of a domain into Vercel failed | domain (pattern) |
domain.dns_records_changed | DNS records of a domain were added, changed or removed | domain (pattern) |
certificate.added | An SSL certificate was added for a domain | domain (pattern) |
certificate.add_failed | Adding an SSL certificate for a domain failed | domain (pattern) |
certificate.renewed | An SSL certificate was renewed | domain (pattern) |
certificate.renewal_failed | Renewing an SSL certificate failed | domain (pattern) |
certificate.deleted | An SSL certificate was deleted | domain (pattern) |
project_domain.created | A domain was added to a project | project, domain (pattern) |
project_domain.updated | A project domain's name, redirect or Git branch was changed | project, domain (pattern) |
project_domain.deleted | A domain was removed from a project | project, domain (pattern) |
project_domain.verified | A project domain was verified | project, domain (pattern) |
project_domain.unverified | A project domain became unverified | project, domain (pattern) |
project_domain.moved | A domain was moved from one project to another | project, domain (pattern) |
project.renamed | A project was renamed | project |
env_variable.created | An environment variable was added to a project | project |
env_variable.updated | A project environment variable was changed | project |
env_variable.deleted | A project environment variable was deleted | project |
rolling_release.started | A rolling release started | project |
rolling_release.approved | A rolling release stage was approved and the release moved to the next stage | project |
rolling_release.completed | A rolling release finished | project |
rolling_release.aborted | A rolling release was aborted | project |
flag.created | A feature flag was created | project, flag (pattern) |
flag.updated | A feature flag was changed | project, flag (pattern) |
flag.deleted | A feature flag was deleted | project, flag (pattern) |
flag_segment.created | A flag segment was created | project, segment (pattern) |
flag_segment.updated | A flag segment was changed | project, segment (pattern) |
flag_segment.deleted | A flag segment was deleted | project, segment (pattern) |
alert.triggered | Vercel raised an alert about unusual activity in a project | project, severity |
attack.detected | The Vercel Firewall detected and mitigated a DDoS attack | none |
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.
| Event | Description | Filters |
|---|---|---|
budget.reached | The team's spend reached its budget (undocumented payload) | none |
deployment.build_requested | A deployment build was requested (undocumented payload) | none |
deployment.blocked | A deployment was blocked (undocumented payload) | none |
deployment.check_run_started | A check run started on a deployment (undocumented payload) | none |
deployment.check_run_canceled | A check run on a deployment was canceled (undocumented payload) | none |
deployment.checks_failed | A deployment's checks failed (undocumented payload) | none |
deployment.checks_succeeded | A deployment's checks passed (undocumented payload) | none |
edge_config.created | An Edge Config store was created (undocumented payload) | none |
edge_config.deleted | An Edge Config store was deleted (undocumented payload) | none |
edge_config.items_updated | Items in an Edge Config store were changed (undocumented payload) | none |
firewall.system_rule_anomaly_detected | The Vercel Firewall saw unusual activity on a system rule (undocumented payload) | none |
firewall.custom_rule_anomaly_detected | The Vercel Firewall saw unusual activity on a custom rule (undocumented payload) | none |
function.archival_required | Vercel marked a function for archival (undocumented payload) | none |
function.removal_required | Vercel marked a function for removal (undocumented payload) | none |
ai_gateway.balance_depleted | The AI Gateway credit balance ran out (undocumented payload) | none |
ai_gateway.auto_reload_limit_reached | AI Gateway auto-reload reached its limit (undocumented payload) | none |
observability.anomaly_detected | Vercel Observability detected an anomaly (undocumented payload) | none |
observability.anomaly_error_detected | Vercel Observability reported an anomaly error (undocumented payload) | none |
observability.usage_anomaly_detected | Vercel Observability detected unusual usage (undocumented payload) | none |
observability.error_anomaly_detected | Vercel Observability detected unusual errors (undocumented payload) | none |
botid.anomaly_detected | BotID detected unusual bot activity (undocumented payload) | none |
webhook.tested | Vercel sent a test delivery (undocumented payload) | none |
message.created | A message was posted (undocumented payload) | none |
message.updated | A message was changed (undocumented payload) | none |
message.deleted | A message was deleted (undocumented payload) | none |
message.reaction_added | A reaction was added to a message (undocumented payload) | none |
message.reaction_removed | A reaction was removed from a message (undocumented payload) | none |
message.mentioned | Someone was mentioned in a message (undocumented payload) | none |
thread.resolved | A thread was resolved (undocumented payload) | none |
thread.unresolved | A resolved thread was reopened (undocumented payload) | none |
comment.created | A comment was added (undocumented payload) | none |
comment.updated | A comment was changed (undocumented payload) | none |
comment.deleted | A comment was deleted (undocumented payload) | none |
comment.resolved | A comment was resolved (undocumented payload) | none |
comment.unresolved | A resolved comment was reopened (undocumented payload) | none |
comment.reaction_added | A reaction was added to a comment (undocumented payload) | none |
comment.reaction_removed | A reaction was removed from a comment (undocumented payload) | none |
comment.mentioned | Someone 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.
| Event | Description | Filters |
|---|---|---|
deployment_action.started | A deployment started an integration's deployment action | none |
deployment_action.canceled | An integration's deployment action or its deployment was canceled | none |
deployment_action.cleaned_up | A deployment that ran an integration's deployment action was permanently deleted | none |
installation.permission_upgraded | A user changed which projects the integration can access | none |
installation.removed | The integration was removed from a team or account | none |
installation.scope_change_confirmed | A user accepted new API scopes for the integration | none |
installation.transferred | The integration's installation moved to another team | none |
resource.connected | An integration resource was connected to a project | project |
resource.disconnected | An integration resource was disconnected from a project | project |
invoice.created | A Marketplace invoice was created and sent to the customer | none |
invoice.paid | A Marketplace invoice was paid | none |
invoice.payment_failed | The payment for a Marketplace invoice failed | none |
invoice.overdue | A Marketplace invoice was still unpaid after the grace period | none |
invoice.refunded | A Marketplace invoice was refunded | none |
installation_member.changed | A member was added to or removed from an installation, or their role changed | none |
Vercel's event names
Some events have a different name in Vercel:
deployment.failedisdeployment.error,deployment.builtisdeployment.ready,deployment.rolled_backisdeployment.rollback, anddeployment.deletedisdeployment.cleanup.deployment_check.rerequestedisdeployment.check-rerequested, anddeployment_action.*isdeployment.integration.action.*.- The
domain.*andcertificate.*events are Vercel'sdomain.*events, such asdomain.renewalanddomain.certificate-add. project_domain.*,env_variable.*, androlling_release.*areproject.domain.*,project.env-variable.*, andproject.rolling-release.*.flag_segment.*isflag.segment.*,alert.triggeredisalerts.triggered, andattack.detectedisfirewall.attack.installation.*isintegration-configuration.*,resource.*isintegration-resource.*,invoice.*ismarketplace.invoice.*, andinvoice.payment_failedismarketplace.invoice.notpaid.installation_member.changedismarketplace.member.changed.- For the events with undocumented payloads, Helios replaces Vercel's dashes with underscores, as in
edge_config.createdforedge-config.created. These differ more:deployment.check_run_startedanddeployment.check_run_canceledaredeployment.checkrun.startanddeployment.checkrun.cancel,deployment.checks_failedanddeployment.checks_succeededaredeployment.checks.failedanddeployment.checks.succeeded,edge_config.items_updatedisedge-config.items.updated, andai_gateway.auto_reload_limit_reachedisai-gateway.auto-reload.limit-reached. - The
*_detectedevents are Vercel'sfirewall.system-rule-anomaly,firewall.custom-rule-anomaly,observability.anomaly,observability.anomaly-error,observability.usage-anomaly,observability.error-anomaly, andbotid.anomaly.webhook.testedistest-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
previewornull. Other named environments do not match Preview. - Branch matches the Git branch the deployment was built from, such as
mainorfeature/*. Helios reads it from the deployment'sgithubCommitRef,gitlabCommitRef, orbitbucketCommitRefmetadata. 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:
- Add
deployment.createdto a workflow with no filters. - Push a commit to a project, or redeploy one.
- Check that a run starts. Then open the connection in Helios and click Webhook events to see the event.
- Add
Common errors
| What you see | Cause | Fix |
|---|---|---|
| The connection's status shows Error | The token expired or was deleted, the team ID or slug is wrong, or Vercel disabled the OAuth installation | Create 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 finished | Open 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 set | Use 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 start | The team already has 20 webhooks, or setup failed for one of the reasons above | Remove an unused webhook, then save the connection again |
| An event shows as unavailable | The connection's method can't receive it, or Vercel left it out of the account webhook | Use the other method for that event. See Triggers |
| No runs start with your own OAuth app | Webhook URL in the Integrations Console is empty or wrong, or the event isn't selected | Paste the URL from Webhook Setup and select every event |
project.created or project.removed never starts a run with your own OAuth app | The integration doesn't have access to all projects | Give the integration access to all projects in the team's integration settings |
| Runs stop after you rotate the integration's secret | Helios still verifies deliveries with the old secret | Enter the new secret in Client Secret through Manage and save |
| No run starts, and the webhook looks fine | The filters don't match the event | Try 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
Jira
The Jira integration lets Helios agents work in your Jira Cloud site through the Jira, Jira Software, Jira Service Management, Assets, Forms, and Jira Service Management operations and incident REST APIs, and run agents automatically when issues, comments, worklogs, sprints, boards, versions, projects, and other Jira data change.
GitLab
The GitLab integration lets Helios agents search and call the GitLab REST API on GitLab.com or a self-managed instance, and run agents automatically when something happens in your projects or groups, such as a push, a new merge request, a failed pipeline, or a comment.