Providers / Vercel
Hosting
Vercel API keys and credentials
What every Vercel credential a founder holds does, whether it expires, and what tends to break. Each fact links to Vercel's own docs.
At a glance
| Credential | Expiry | Permissions |
|---|---|---|
| Vercel dashboard login | Not documented | – |
| Access token (Full Account, Team or Project scope) | You choose | Can be scoped |
| Deploy hook URL | Not documented | Full access only |
How to rotate the Vercel access token
- Open the Account Tokens page from your personal account (not a team view), enter a descriptive token name, then open Scope. Pick Full Account, a team, or (after picking the team) one project; All Projects makes a team-scoped token. Use the narrowest scope that works Vercel docs
- Choose an expiration and select Create. Copy the token and store it securely: Vercel shows the value only once. Personal access tokens begin with vcp_ Vercel docs
- Or create it from the CLI with vercel tokens create <name>. This needs an existing classic access token (a vercel login session cannot create tokens). A full-account token needs a Full Account token to create it; a project-scoped one (--project <PROJECT_ID>) needs a token scoped to the team that owns the project Vercel docs
- Put the new value wherever the old one was used. For the Vercel CLI, that is the VERCEL_TOKEN environment variable or the --token flag; Vercel recommends the environment variable for CI/CD because it keeps the token out of command-line arguments, which can show in process lists and logs Vercel docs
- For GitHub Actions: Vercel's docs show workflows passing the token as --token=${{ secrets.VERCEL_TOKEN }}, so replace the value of the GitHub repository (or environment) secret your workflow reads, and re-run the workflow. The Vercel docs do not describe the GitHub side of editing a secret Vercel docs
- Once nothing uses the old token, revoke it: run vercel tokens list to find its ID, then vercel tokens revoke <id> (it asks you to confirm; --yes skips the prompt) Vercel docs
Can the old and new key work at the same time? Yes. The docs do not state outright that two tokens can work at once. They do show tokens being created with their own names and revoked one by ID, so a new token can be made and put in place before the old one is revoked. The docs also do not say whether an existing token can be edited (renamed, re-scoped or given a new expiry) or has to be recreated; the pages read describe creation and revocation only.
Revoking the old one: Run vercel tokens revoke <id> (find the ID with vercel tokens list), or call DELETE /v3/user/tokens/{tokenId}, which invalidates the token for future requests (https://vercel.com/docs/rest-api/authentication/delete-an-authentication-token). The docs say that after revoking, anything that uses the token stops working. The pages read do not describe a dashboard delete button.
Source: vercel.com/docs/accounts/access-tokens, checked
Does the Vercel access token expire?
It's up to you: you can set an expiry for the Vercel access token.
What breaks when the Vercel access token expires
Requests with an expired, wrong or deleted token get a 403 response whose error object has "invalidToken": true. Vercel's fix: check the header is Authorization: Bearer <token>, check the token still appears on the Account Tokens page, and if it is lost or expired, create a new one. If a GitHub Actions workflow passes the old token through secrets.VERCEL_TOKEN, update that secret. A missing or malformed header gives 403 with "missingToken": true instead. The docs do not give the exact CLI error text.
Other things that often go wrong with Vercel:
- Access token reaches its expiration and CI deploys fail with 403 invalidToken
- A project-scoped token is used against team-level or other-project resources and is denied
- A deploy hook URL is committed to a repository or posted publicly, allowing anyone to trigger builds
How to rotate the Vercel deploy hook URL
- In the project, open Settings, then Git. In the Deploy Hooks section, choose a name and the branch to deploy, and submit. Vercel then shows the URL to copy. The project must be connected to a Git repository Vercel docs
- Or use the CLI: vercel deploy-hooks create <name> --git-branch <branch>, which returns the hook URL Vercel docs
- Replace the old URL with the new one in every system that calls it (for example a CMS publish webhook or a cron service). Vercel's docs say to treat the URL like any other token or password Vercel docs
- Delete the old hook (see Revoke). The docs say that if you believe a URL has been compromised, you can revoke it and create a new one Vercel docs
Can the old and new key work at the same time? Yes. Hobby and Pro projects can have 5 deploy hooks and Enterprise projects 10, each with its own URL, so a new hook can exist next to the old one until you delete the old one. The docs do not use the word overlap; this follows from hooks being created and deleted individually. Trigger limit: 60 per hour per project across all hooks. Vercel's deploy hooks page suggests one hook per branch unless you use several data sources, so keep the overlap short; a project already at its cap has to delete one first.
Revoking the old one: Delete the old hook by ID with vercel deploy-hooks delete <id> (find the ID with vercel deploy-hooks list; --yes with --non-interactive skips the prompt). The docs say hooks can be revoked, but the pages read do not show the dashboard button for deleting one.
Source: vercel.com/docs/deploy-hooks, checked
Does the Vercel deploy hook URL expire?
Vercel's docs don't say whether the Vercel deploy hook URL expires.
What breaks when the Vercel deploy hook URL expires
The docs do not say deploy hook URLs expire. If a hook was deleted, the docs do not say what a POST to its URL returns. If a hook stops starting builds, the docs say to check the status check on the commit tied to the hook, and note that hooks do not trigger when github.enabled = false is set in vercel.json.
Each credential
Vercel dashboard login
- Not documented
Some teams require two-factor authentication or SAML before their tokens can be created.
Access token (Full Account, Team or Project scope)
- You choose
- Can be scoped
- Expiry readable by API
The list-tokens endpoint (GET /v6/user/tokens) shows expiresAt in its example response, though it is not a required field (see https://vercel.com/docs/rest-api/authentication/list-auth-tokens). Token value is shown once. Scopes are Full Account, a single Team, or a single Project; project-scoped tokens cannot create tokens, and full-account tokens must pass teamId (or slug) when targeting a team's resources. Personal access tokens begin with vcp_. An expired token returns 403 invalidToken.
Deploy hook URL
- Not documented
- Full access only
The URL itself is the credential. Anyone holding it can trigger a deployment with a plain GET or POST, no auth header. Each hook is bound to one project and one branch. Revoke a leaked hook by deleting it and creating a new one. Hobby and Pro allow 5 hooks per project (Enterprise 10) and 60 triggers per hour per project.
Renewals and billing
- Vercel Pro or Enterprise plan, billed monthly. Official Pro plan page: billed monthly; $20/month platform fee includes 1 deploying seat and $20 usage credit; additional paid seats $20/month; unused credit expires monthly.
Pro is a monthly platform fee plus per-seat charges and on-demand usage beyond the included monthly credit. Spend management can send alerts or take automatic actions at spend thresholds; notifications on by default at $200 per billing cycle. GET /v1/billing/charges returns FOCUS v1.3 charge rows (JSONL) per team, daily granularity, max one-year range; rows carry ProjectId and ProjectName in Tags.
Where to find it in Vercel
- Open Vercel account tokens
- Read Vercel Spend Management (team Settings > Billing > On-Demand Budget)
- Vercel access tokens guide
What Vercel's docs don't say
We couldn't confirm these from official docs, so don't rely on them either way:
- Exact expiration presets in the token creation dropdown and whether a no-expiry option exists
- Maximum token lifetime
- Whether expiresAt is always populated by the list-tokens API
- Whether deploy hook URLs ever expire
- Spend and usage API availability
- Enterprise billing cadence
- Login and password expiry policy
- Whether an access token can be edited (renamed, re-scoped, new expiry) rather than recreated
- Dashboard steps to delete an access token or a deploy hook
- Whether old and new Vercel access tokens work side by side (inferred from separate creation and revocation)
- What a deleted deploy hook URL returns
- Exact CLI error text in GitHub Actions when VERCEL_TOKEN has expired
- Whether Vercel's GitHub integration has any token that expires
Rotating or replacing a Vercel key
The steps are the same for most providers: make the new key, deploy it everywhere the old one is used, check it works, then revoke the old one. Our guides walk through it:
Sources
- vercel.com/docs/accounts/access-tokens
- vercel.com/docs/deploy-hooks
- vercel.com/docs/rest-api/reference/endpoints/authentication/list-auth-tokens
- vercel.com/docs/plans/pro-plan
- vercel.com/docs/rest-api/projects/create-one-or-more-environment-variables
- vercel.com/docs/rest-api/deployments/create-a-new-deployment
- vercel.com/docs/audit-log
- vercel.com/changelog/project-scoped-tokens
- vercel.com/docs/rest-api/dns/list-existing-dns-records.md
- vercel.com/docs/rest-api/dns/create-a-dns-record.md
- vercel.com/docs/rest-api/dns/delete-a-dns-record.md
- vercel.com/docs/rest-api/domains/get-a-domain-s-configuration.md
- vercel.com/docs/rest-api/projects/get-a-project-domain.md
- vercel.com/docs/rest-api/projects/verify-project-domain.md
- vercel.com/docs/rest-api
- vercel.com/openapi.json
- vercel.com/docs/domains/working-with-domains/add-a-domain
- vercel.com/docs/domains/troubleshooting
- vercel.com/docs/domains/working-with-dns
- vercel.com/docs/domains/managing-dns-records
- vercel.com/docs/rest-api/billing/list-focus-billing-charges
- vercel.com/docs/rest-api/reference/endpoints/billing/list-focus-billing-charges
- vercel.com/changelog/access-billing-usage-cost-data-api
- vercel.com/docs/cli/tokens
- vercel.com/docs/cli/global-options
- vercel.com/docs/git/vercel-for-github
- vercel.com/docs/cli/deploy-hooks
- vercel.com/docs/rest-api/authentication/delete-an-authentication-token
- vercel.com/docs/rest-api/authentication/list-auth-tokens
Related providers
Keep track of every Vercel key
StackHangar stores your Vercel keys in an encrypted vault, grouped by the product they belong to, warns you before they expire, and walks you through rotating them. We can't read your secrets.