Skip to content
Docs

vercel security

The vercel security command runs your team's security checks and prints them in your terminal. It surfaces the same checks as your team's Security Dashboard, so you can run every check for your team, list the individual findings behind a check, and pipe the raw report into scripts or have an agent address them. Its vulnerabilities subcommand lists and triages the vulnerabilities Security Review reports.

Both run against the current team, so you need a team scope. If no team is selected, run vercel switch to choose one before running the command.

terminal
# Run all checks for the current team
vercel security
 
# List every finding across all checks
vercel security check --findings
 
# Deep-dive one check and list its findings
vercel security check [check-name]
 
# Output the raw report as JSON
vercel security check --json
 
# List open Security Review vulnerabilities
vercel security vulnerabilities

Using the vercel security command to review the current team's security posture.

check is the default subcommand, so vercel security and vercel security check are equivalent. Both run every check for the current team and print a summary table. Pass one or more check slugs to run only those checks and list their findings.

terminal
vercel security check
vercel security check --findings
vercel security check [check-name]
vercel security check [check-name] [check-name]

Run all checks, or pass one or more check slugs to compute and expand only those checks.

The summary table has six columns: Check, Risk, Status, Violations, Muted, and Description. When any check is failing, a footer hint points you to --findings.

OptionTypeDescription
--findingsBooleanList individual findings under each check, including muted ones. Implied when you pass a check slug
--limit <N>NumberMaximum findings returned per check. The default is 100, and the API caps it at 200. Violation counts stay exact even when findings are capped
-p, --project <NAME>StringScope the report to a single project by name or ID
-F, --format <FORMAT>StringOutput format. The only supported value is json
--jsonBooleanShorthand for --format json. Outputs the raw API response
ArgumentRequiredDescription
checkNoOne or more check slugs to run. Only the named checks are computed. Unknown slugs fail immediately with the list of valid slugs

vercel security vulnerabilities lists and triages the vulnerabilities Security Review reports, the same ones as your team's Vulnerabilities dashboard. list is the default subcommand, so vercel security vulnerabilities lists them.

terminal
vercel security vulnerabilities
vercel security vulnerabilities inspect my-app/12
vercel security vulnerabilities dismiss my-app/12 --reason false-positive
vercel security vulnerabilities reopen my-app/12

List vulnerabilities, show one in full, and dismiss or reopen it.

Each vulnerability has a reference, shown in the Vulnerability column: <project>/<number> for a vulnerability in a project, or <owner>/<repo>/<number> for one in a repository. inspect, dismiss, and reopen take its reference or its vulnerability ID. If Security Review isn't enabled for the team, the command fails and says so. Which vulnerabilities you can see and change depends on your role.

Aliases: ls.

Lists the team's vulnerabilities, Production and most severe first. It shows open vulnerabilities by default, 20 at a time. The table has Vulnerability, Severity, Title, Environment, and Branch columns, plus Status when you list more than one status. When there are more vulnerabilities, the command prints the command for the next page.

OptionTypeDescription
-p, --project <NAME_OR_ID>StringOnly list vulnerabilities in this project
-e, --environment <ENVIRONMENT>StringOnly list vulnerabilities in this environment
--git-branch <BRANCH>StringOnly list vulnerabilities on this Git branch
--status <STATUS>StringComma-separated statuses to list: open, closed, or dismissed, or all. The default is open
--severity <SEVERITY>StringComma-separated severities to list: critical, high, medium, or low
-q, --query <TEXT>StringSearch vulnerability titles, summaries, and descriptions
-n, --limit <NUMBER>NumberNumber of vulnerabilities to return. The default is 20, and the maximum is 100
--next <CURSOR>StringShow the next page, using the cursor from the previous page
--jsonBooleanOutput the vulnerabilities as JSON, without their descriptions and fixes, with a pagination.next cursor

Shows one vulnerability in full: its severity, status, class, environment, branch, where it was found and closed, related vulnerabilities, and a link to it in the dashboard, followed by its summary, description, and fix. Pass --json to output the whole vulnerability as JSON.

Dismisses a vulnerability as a false positive or an accepted risk. Without --reason, the command asks for the reason and an optional message in a terminal, and fails in non-interactive runs or with --json.

OptionTypeDescription
--reason <REASON>StringWhy it's dismissed: false-positive or accepted-risk
--message <TEXT>StringA note recorded with the dismissal, up to 500 characters
--jsonBooleanOutput the vulnerability and the outcome as JSON

Dismissing a vulnerability that's already dismissed changes nothing and exits 0. With --json, the outcome is unchanged. To change a dismissed vulnerability's reason or message, reopen it and dismiss it again. Closed vulnerabilities can't be dismissed or reopened.

Reopens a dismissed vulnerability, so it's open again. Reopening an open vulnerability changes nothing and exits 0. Pass --json to output the vulnerability and the outcome as JSON.

Each check has a slug, shown as [check-name] in the examples above, and a risk level of high or medium. Pass the slug to vercel security check to run just that check.

SlugRiskWhat it checks
members-no-mfahighTeam members without multi-factor authentication
members-too-many-ownershighTeam owners to review
pats-no-expirationhighPersonal access tokens that never expire
env-vars-creds-instead-of-oidchighLong-lived credentials where OIDC is available
depl-no-git-fork-protectionhighProjects without Git fork deploy prevention
proj-no-preview-depl-protectionhighProjects without preview deployment protection
env-vars-non-sensitivemediumEnvironment variables not marked Sensitive
env-vars-non-sensitive-stalemediumEnvironment variables older than 90 days
env-vars-exposed-web-app-fwkmediumEnvironment variables exposed via a web application framework

The Status column reports one of the following values for each check. Each value maps to a card state on the Security Dashboard:

StatusMeaningOn the Security Dashboard
failingThe check found one or more violationsA High or Medium risk badge
passingThe check found no violationsA blue check-circle
mutedEvery finding for the check is mutedA blue check-circle with a Check muted badge when the whole check is muted, or an N muted badge when its findings are muted individually
no accessYour role lacks permission to read the data for this checkA Data Unavailable overlay labeled Insufficient Permissions
errorThe check could not be computedA Data Unavailable overlay

By default, vercel security check prints only the summary table. Add --findings to expand the individual findings under every check, or pass one or more check slugs to expand just those checks. Muted findings appear dimmed and tagged with (muted).

terminal
# Expand findings for all checks
vercel security check --findings
 
# Expand findings for a single check
vercel security check [check-name]

When a check has more violations than the number of findings shown, the command prints a Showing N of M findings line so you can raise the cap with --limit.

In non-interactive environments, vercel security check writes the JSON report to stdout automatically, so you don't need to pass --json. Every error path emits a structured JSON payload with a machine-readable reason and suggested follow-up commands.

The command uses two exit codes:

Exit codeMeaning
0The report was produced, including when checks are failing or muted
1The command could not run because of an unknown slug, an invalid flag, a missing team scope, or a failed API request

A failing check still exits 0, so gate a CI step on the report contents rather than the exit code.

vercel security vulnerabilities outputs JSON only with --json. When its output isn't a terminal, list prints tab-separated rows instead of a table. With --json or in non-interactive runs, errors are JSON with a machine-readable reason.

The report lists security findings such as member emails, token names, and project settings. Treat the output as sensitive: it can expose your team's security posture in CI logs or agent context, so don't write it to shared or public logs. Vulnerabilities include source code and how to exploit it, so treat their output the same way.

terminal
vercel security check --project my-app
Run every check against a single project instead of the whole team.
terminal
vercel security check [check-name] --limit 200
List up to 200 findings for a check.
terminal
vercel security check --json | jq '.report'
Output the raw report as JSON and extract the fields you need.
terminal
vercel security vulnerabilities --project my-app --environment production --severity critical
Combine filters to narrow the vulnerability list.
terminal
vercel security vulnerabilities dismiss my-app/12 --reason accepted-risk --message "Internal tool behind SSO"
Record why a vulnerability doesn't need a fix.

The following global options can be passed when using the vercel security command:

For more information on global options and their usage, refer to the options section.

Last updated August 17, 2026

Was this helpful?

supported.