close
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.

Security checks 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

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

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.

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.

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.

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.


Was this helpful?

supported.