vercel-cli-with-tokens · v1.0.0 · 2026-03-18 · sha256 ac82ddce63103b53

vercel-cli-with-tokens v1.0.0A

Immutable. This exact content is served forever at /api/v1/blob/ac82ddce63103b53.

---
name: vercel-cli-with-tokens
description: Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. "deploy to vercel", "set up vercel", "add environment variables to vercel".
metadata:
  author: vercel
  version: "1.0.0"
---

# Vercel CLI with Tokens

Deploy and manage projects on Vercel using the CLI with token-based authentication. Use this skill when you have a Vercel access token and need to operate without interactive login.

## Authentication

**Never run `vercel login`.** Always use token-based auth via the `--token` flag or `VERCEL_TOKEN` environment variable. This ensures the correct account is used even if another Vercel account is logged in locally.

```bash
vercel <command> --token "$VERCEL_TOKEN"
```

### Scoping to a Team

Use `--scope` to target a specific team. Accepts a **team slug** or **team ID** (`team_...`):

```bash
vercel <command> --token "$VERCEL_TOKEN" --scope <team-slug-or-id>
```

Not required if the project is already linked (`.vercel/project.json` provides the org context) or if `VERCEL_ORG_ID` is set.

### Targeting a Project

Use `--project` to target a specific project **without needing `vercel link`**. Accepts a project **name** or **project ID** (`prj_...`):

```bash
vercel deploy --token "$VERCEL_TOKEN" --scope <team> --project <project-name-or-id>
```

This is the simplest path when you already have a project ID — no `.vercel/` directory needed.

### Environment Variable Alternative

Instead of flags, you can set these environment variables. The CLI recognizes them natively:

| Variable | Purpose | Equivalent flag |
|---|---|---|
| `VERCEL_TOKEN` | Auth token | `--token` |
| `VERCEL_ORG_ID` | Team/org ID | `--scope` |
| `VERCEL_PROJECT_ID` | Project ID | `--project` |

`VERCEL_ORG_ID` and `VERCEL_PROJECT_ID` must be set **together** — setting only one causes an error. When both are set, the CLI skips `.vercel/project.json` entirely.

### Resolution Precedence

**Token:** `--token` flag > `VERCEL_TOKEN` env var > stored auth in config.

**Team/scope:** `--scope` flag > `scope` in `vercel.json` > `currentTeam` in global config > `VERCEL_ORG_ID`.

**Project:** `--project` flag > `VERCEL_PROJECT_ID` env var > `.vercel/project.json` > interactive prompt.

## CLI Setup

```bash
npm install -g vercel
vercel --version
```

Or use `npx` for one-off commands:
```bash
npx vercel <command> --token "$VERCEL_TOKEN"
```

## Deploying a Project

Always deploy as **preview** unless the user explicitly requests production.

### Quick Deploy (have project ID — no linking needed)

When you already have a project ID (e.g., `prj_...`), deploy directly:

```bash
vercel deploy --token "$VERCEL_TOKEN" --scope <team> --project <project-id> -y --no-wait
```

Check status:
```bash
vercel inspect <deployment-url> --token "$VERCEL_TOKEN"
```

Production deploy (only when explicitly requested):
```bash
vercel deploy --prod --token "$VERCEL_TOKEN" --scope <team> --project <project-id> -y --no-wait
```

### Full Deploy Flow (no project ID)

Use this when you have a token and team but need to create or find a project.

#### Step 1: Determine Project State

```bash
# 1. Does the project have a git remote?
git remote get-url origin 2>/dev/null

# 2. Is it already linked to a Vercel project?
cat .vercel/project.json 2>/dev/null || cat .vercel/repo.json 2>/dev/null
```

#### Step 2: Link the Project

If no `.vercel/project.json` or `.vercel/repo.json` exists, link first.

**With git remote (preferred):**
```bash
vercel link --repo --token "$VERCEL_TOKEN" --scope <team> -y
```
Reads the git remote and connects to the matching Vercel project. Creates `.vercel/repo.json`. More reliable than `vercel link` without `--repo`, which matches by directory name.

**Without git remote:**
```bash
vercel link --token "$VERCEL_TOKEN" --scope <team> -y
```
Creates `.vercel/project.json`.

**Link to a specific existing project by name:**
```bash
vercel link --project <project-name> --token "$VERCEL_TOKEN" --scope <team> -y
```

If the project is already linked, check `orgId` in `.vercel/project.json` or `.vercel/repo.json` to verify it matches the intended team. If not, re-link with the correct `--scope`.

#### Step 3: Deploy

**A) Git Push Deploy — has git remote (preferred)**

The best long-term setup. Git pushes trigger automatic Vercel deployments.

1. **Ask the user before pushing.** Never push without explicit approval.
2. Commit and push:
   ```bash
   git add .
   git commit -m "deploy: <description of changes>"
   git push
   ```
3. Vercel builds automatically. Non-production branches get preview deployments; the production branch (usually `main`) gets a production deployment.
4. Retrieve the deployment URL:
   ```bash
   sleep 5
   vercel ls --format json --token "$VERCEL_TOKEN" --scope <team>
   ```
   The latest entry in the `deployments` array has the preview URL.

**B) CLI Deploy — no git remote**

```bash
vercel deploy --token "$VERCEL_TOKEN" --scope <team> -y --no-wait
```

`--no-wait` returns immediately with the deployment URL. Check status:
```bash
vercel inspect <deployment-url> --token "$VERCEL_TOKEN"
```

### Deploying from a Remote Repository

If the user wants to deploy code from a remote that isn't cloned locally:

1. Clone the repository:
   ```bash
   git clone <repo-url>
   cd <repo-name>
   ```
2. Link to Vercel:
   ```bash
   vercel link --repo --token "$VERCEL_TOKEN" --scope <team> -y
   ```
3. Deploy via git push (if you have push access) or CLI deploy.

### About `.vercel/` Directory

A linked project has either:
- `.vercel/project.json` — from `vercel link`. Contains `projectId` and `orgId`.
- `.vercel/repo.json` — from `vercel link --repo`. Contains `orgId`, `remoteName`, and a `projects` map.

Either file means the project is linked. Not needed when using `--project` flag or `VERCEL_ORG_ID` + `VERCEL_PROJECT_ID` env vars.

**Do NOT** run `vercel project inspect`, `vercel ls`, or `vercel link` in an unlinked directory to detect state — without `.vercel/`, they will interactively prompt or silently link as a side-effect. Only `vercel whoami --token "$VERCEL_TOKEN"` is safe to run anywhere.

## Managing Environment Variables

Run from a linked project directory, or use `--project` to target a specific project.

```bash
# Set for all environments
echo "value" | vercel env add VAR_NAME --token "$VERCEL_TOKEN" --scope <team>

# Set for a specific environment (production, preview, development)
echo "value" | vercel env add VAR_NAME production --token "$VERCEL_TOKEN" --scope <team>

# List environment variables
vercel env ls --token "$VERCEL_TOKEN" --scope <team>

# Pull env vars to local .env file
vercel env pull --token "$VERCEL_TOKEN" --scope <team>

# Remove a variable
vercel env rm VAR_NAME --token "$VERCEL_TOKEN" --scope <team> -y
```

## Inspecting Deployments

```bash
# List recent deployments
vercel ls --format json --token "$VERCEL_TOKEN" --scope <team>

# Inspect a specific deployment
vercel inspect <deployment-url> --token "$VERCEL_TOKEN"

# View build logs
vercel logs <deployment-url> --token "$VERCEL_TOKEN"
```

## Managing Domains

```bash
# List domains
vercel domains ls --token "$VERCEL_TOKEN" --scope <team>

# Add a domain to the project
vercel domains add <domain> --token "$VERCEL_TOKEN" --scope <team>
```

## Working Agreement

- **Always use `--token`** on every Vercel CLI command. Never rely on local login state.
- **Use `--scope` and/or `--project`** to target the correct team and project.
- **Do not run `vercel login`.** Authentication is handled entirely by the access token.
- **Default to preview deployments.** Only deploy to production when explicitly asked.
- **Ask before pushing to git.** Never push commits without the user's approval.
- **Do not read or modify `.vercel/` files directly.** The CLI manages this directory.
- **Do not curl/fetch deployed URLs to verify.** Just return the link to the user.
- **Use `--format json`** when structured output will help with follow-up steps (e.g., `vercel ls`).
- **Use `-y`** on commands that prompt for confirmation to avoid interactive blocking.

## Troubleshooting

### Authentication Error

If commands fail with `Authentication required` or similar:
- The token may be expired or revoked. Ask the user for a fresh token or check the token source.
- Verify the token is valid: `vercel whoami --token "$VERCEL_TOKEN"`

### Wrong Team

If deployments appear under the wrong team, verify `--scope` is correct:
```bash
vercel whoami --token "$VERCEL_TOKEN" --scope <team>
```

### Build Failure

Check the build logs:
```bash
vercel logs <deployment-url> --token "$VERCEL_TOKEN"
```

Common causes:
- Missing dependencies — ensure `package.json` is complete and committed.
- Missing environment variables — add them with `vercel env add`.
- Framework misconfiguration — check `vercel.json` or framework-specific settings.
- Vercel auto-detects frameworks (Next.js, Remix, Vite, etc.) from `package.json`. Override with a `vercel.json` if detection is wrong.

### CLI Not Installed

```bash
npm install -g vercel
```