> This page is for Webflow CLI.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.webflow.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.webflow.com/_mcp/server.

# Command Reference

> Reference for all commands available in the Webflow CLI

## Global Options

Global options can be used with any command.

| Option                | Description                                                                                                                                                                                                                                                                                                                                                                                                           |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `-v`, `--version`     | Display the installed version of the Webflow CLI.                                                                                                                                                                                                                                                                                                                                                                     |
| `-h`, `--help`        | Display help information for any command.                                                                                                                                                                                                                                                                                                                                                                             |
| `--no-input`          | Disable all interactive prompts. Use in CI/CD pipelines.                                                                                                                                                                                                                                                                                                                                                              |
| `--input`             | Force interactive prompts on when they were auto-disabled. An explicit `--no-input` still wins.                                                                                                                                                                                                                                                                                                                       |
| `--manifest <path>`   | Path to a `webflow.json` file or directory containing one. Defaults to `./webflow.json`.                                                                                                                                                                                                                                                                                                                              |
| `--skip-update-check` | Skip checking for `@webflow` package updates.                                                                                                                                                                                                                                                                                                                                                                         |
| `--verbose`           | Display more information for debugging purposes.                                                                                                                                                                                                                                                                                                                                                                      |
| `--region <us\|eu>`   | Webflow region to target: `us` or `eu`. When omitted, resolved from `WEBFLOW_REGION`, then `region` in `webflow.json`, then the region you last logged into — `us` only if none of those are set. See [Production EU authentication](/cli/authentication#production-eu-authentication) for a walkthrough and [Configuration](/cli/configuration#region) for the full precedence. Requires Webflow CLI 2.9.0 or later. |

---

## Assets

### `assets list`

Lists assets for a site, with optional filtering and sorting.

**Usage**

```bash
webflow assets list [options]
```

**Options**

| Option                | Description                                                                                                                      | Default                           |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
| `--site <siteId>`     | Site ID. Falls back to `webflow.json` or an interactive prompt.                                                                  |                                   |
| `--folder <folderId>` | Filter assets to a specific folder.                                                                                              |                                   |
| `--fields <fields>`   | Comma-separated columns to display. Valid fields: `id`, `displayName`, `originalFileName`, `contentType`, `size`, `lastUpdated`. | `id,displayName,lastUpdated,size` |
| `--sort-by <field>`   | Sort by: `displayName`, `originalFileName`, `contentType`, `size`, `lastUpdated`.                                                | `displayName`                     |
| `--order <dir>`       | Sort direction: `asc` or `desc`.                                                                                                 | `asc`                             |
| `--limit <n>`         | Maximum number of assets to return.                                                                                              | `100`                             |
| `--offset <n>`        | Number of assets to skip (for pagination).                                                                                       | `0`                               |
| `--json`              | Output as JSON.                                                                                                                  | `false`                           |

Also accepts [global options](#global-options).

**Example**

```bash
webflow assets list --site 6258612d1ee792848f805dcf --sort-by size --order desc
```

---

### `assets upload`

Uploads a file as a site asset.

**Supported file types**

* **Images** (≤ 4 MB): PNG, JPG, JPEG, GIF, SVG, WEBP, AVIF
* **Documents** (≤ 10 MB): PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, CSV, ODT, ODS, ODP, JSON, Lottie

**Usage**

```bash
webflow assets upload <file> [options]
```

**Arguments**

| Argument | Description                 |
| -------- | --------------------------- |
| `file`   | Path to the file to upload. |

**Options**

| Option                 | Description                                                     |
| ---------------------- | --------------------------------------------------------------- |
| `--site <siteId>`      | Site ID. Falls back to `webflow.json` or an interactive prompt. |
| `--name <displayName>` | Display name for the asset. Defaults to the filename.           |
| `--folder <folderId>`  | Upload into a specific folder.                                  |
| `--dry-run`            | Preview the upload without uploading.                           |
| `--json`               | Output as JSON.                                                 |

Also accepts [global options](#global-options).

**Example**

```bash
webflow assets upload ./logo.png --site 6258612d1ee792848f805dcf --name "Company Logo"
```

---

### `assets update`

Updates an asset's metadata.

**Usage**

```bash
webflow assets update <assetId> [options]
```

**Arguments**

| Argument  | Description                    |
| --------- | ------------------------------ |
| `assetId` | The ID of the asset to update. |

**Options**

| Option                  | Description                             |
| ----------------------- | --------------------------------------- |
| `--display-name <name>` | New display name for the asset.         |
| `--alt-text <text>`     | Alt text for the asset.                 |
| `--dry-run`             | Preview the update without applying it. |
| `--json`                | Output as JSON.                         |

Also accepts [global options](#global-options).

**Example**

```bash
webflow assets update 6258612d1ee792848f805dcf --display-name "New Logo" --alt-text "Company logo"
```

---

### `assets folders list`

Lists asset folders for a site.

**Usage**

```bash
webflow assets folders list [options]
```

**Options**

| Option                   | Description                                          |
| ------------------------ | ---------------------------------------------------- |
| `-s`, `--site <site-id>` | Site ID. Default: value set in webflow\.json config. |
| `--json`                 | Output as JSON.                                      |

Also accepts [global options](#global-options).

**Example**

```bash
webflow assets folders list --site 6258612d1ee792848f805dcf
```

---

### `assets folders create`

Creates a new asset folder.

**Usage**

```bash
webflow assets folders create [options] <name>
```

**Arguments**

| Argument | Description                  |
| -------- | ---------------------------- |
| `name`   | Display name for the folder. |

**Options**

| Option                   | Description                                          |
| ------------------------ | ---------------------------------------------------- |
| `-s`, `--site <site-id>` | Site ID. Default: value set in webflow\.json config. |
| `--parent <folderId>`    | Parent folder ID (creates a nested folder).          |
| `--json`                 | Output as JSON.                                      |

Also accepts [global options](#global-options).

**Example**

```bash
webflow assets folders create --site 6258612d1ee792848f805dcf "Marketing"
```

---

## Authentication

### `auth login`

Authenticates the CLI with your Webflow account. Opens a browser window where you select a workspace and grant access, then stores a session in a global file at `~/.config/webflow/auth.json` (`%APPDATA%\webflow\auth.json` on Windows) — shared across every project on your machine, not written to a project-local file.

**Usage**

```bash
webflow auth login [options]
```

**Options**

| Option          | Description                                               |
| --------------- | --------------------------------------------------------- |
| `-f`, `--force` | Force reauthentication even if credentials already exist. |

Also accepts [global options](#global-options).

**Example**

```bash
# Open browser OAuth flow to authenticate
webflow auth login

# Re-authenticate even if a token is already saved
webflow auth login --force
```

For more details, see the [authentication documentation](/cli/authentication).

---

### `auth status`

Shows the currently authenticated user and active OAuth scopes.

**Usage**

```bash
webflow auth status
```

**Example**

```bash
webflow auth status
# ✔ Logged in as Jane Smith (jane@example.com)
#    Region: US
#    Scopes: assets:read, assets:write, cms:read, ...
#    Session: ~/.config/webflow/auth.json
```

The `Session:` path shown above is macOS/Linux; on Windows it's `%APPDATA%\webflow\auth.json`. The `Scopes:` line only appears when the stored session has recorded scopes.

---

### `auth logout`

Removes the stored session and logs out of the CLI.

**Usage**

```bash
webflow auth logout
```

**Example**

```bash
webflow auth logout
# ✔ Logged out of the US region.
# ➜ Run webflow auth login to authenticate again.
```

Logout clears the stored session but keeps the region as the default, so a later regionless `webflow auth login` returns to the same region — unless a `WEBFLOW_REGION` environment variable or `webflow.json` `region` overrides it first.

---

### `auth telemetry`

Manages telemetry settings for all Webflow CLI commands.

**Usage**

```bash
webflow auth telemetry [options]
```

**Options**

| Option      | Description                                                                                  |
| ----------- | -------------------------------------------------------------------------------------------- |
| `--enable`  | Enable telemetry for all commands.                                                           |
| `--disable` | Disable telemetry for all commands.                                                          |
| `--status`  | Show current telemetry status.                                                               |
| `--local`   | Write the preference to the current directory's `webflow.json` instead of the global config. |

Also accepts [global options](#global-options).

By default, `--enable`/`--disable` write to a global config file (`~/.config/webflow/telemetry.json` on macOS/Linux, `%APPDATA%\webflow\telemetry.json` on Windows) that applies to every project. Pass `--local` to write the preference to the current directory's `webflow.json` instead, overriding the global setting only for commands run there. A `webflow.json` with an existing telemetry setting is still read and takes precedence over the global config regardless of this flag. `DO_NOT_TRACK` overrides both.

**Example**

```bash
# Check current telemetry status
webflow auth telemetry --status

# Disable telemetry globally (useful in CI/CD)
webflow auth telemetry --disable

# Enable telemetry
webflow auth telemetry --enable

# Disable telemetry for this project only
webflow auth telemetry --disable --local
```

---

## CMS

### `cms collections list`

Lists all CMS collections for a site.

**Usage**

```bash
webflow cms collections list [options]
```

**Options**

| Option              | Description                                                                                                   | Default               |
| ------------------- | ------------------------------------------------------------------------------------------------------------- | --------------------- |
| `--site <siteId>`   | Site ID. Falls back to `webflow.json` or an interactive prompt.                                               |                       |
| `--fields <fields>` | Comma-separated columns to display. Valid fields: `id`, `displayName`, `singularName`, `slug`, `lastUpdated`. | `id,displayName,slug` |
| `--sort-by <field>` | Sort by: `displayName`, `slug`, `lastUpdated`.                                                                | `displayName`         |
| `--order <dir>`     | Sort direction: `asc` or `desc`.                                                                              | `asc`                 |
| `--json`            | Output as JSON.                                                                                               | `false`               |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms collections list --site 6258612d1ee792848f805dcf --sort-by lastUpdated --order desc
```

---

### `cms collections get`

Gets the details and field schema for a CMS collection.

**Usage**

```bash
webflow cms collections get <collectionId> [options]
```

**Arguments**

| Argument       | Description                           |
| -------------- | ------------------------------------- |
| `collectionId` | The ID of the collection to retrieve. |

**Options**

| Option   | Description     |
| -------- | --------------- |
| `--json` | Output as JSON. |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms collections get 6258612d1ee792848f805dcf
```

---

### `cms collections create`

Creates a new CMS collection on a site.

**Usage**

```bash
webflow cms collections create --name <displayName> [options]
```

**Options**

| Option                   | Description                                                         |
| ------------------------ | ------------------------------------------------------------------- |
| `--site <siteId>`        | Site ID. Falls back to `webflow.json` or an interactive prompt.     |
| `--name <displayName>`   | **(Required)** Collection display name.                             |
| `--singular-name <name>` | Singular display name. Defaults to `--name`.                        |
| `--slug <slug>`          | URL slug for the collection. Auto-derived from `--name` if omitted. |
| `--dry-run`              | Preview the collection that would be created without creating it.   |
| `--json`                 | Output as JSON.                                                     |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms collections create --site 6258612d1ee792848f805dcf --name "Blog Posts" --slug "blog-posts"

# Preview without creating
webflow cms collections create --site 6258612d1ee792848f805dcf --name "Blog Posts" --dry-run
```

---

### `cms fields create`

Adds a field to a CMS collection.

**Usage**

```bash
webflow cms fields create --collection <collectionId> --name <name> --type <type> [options]
```

**Options**

| Option                        | Description                                                  |
| ----------------------------- | ------------------------------------------------------------ |
| `--collection <collectionId>` | **(Required)** Collection ID to add the field to.            |
| `--name <displayName>`        | **(Required)** Field display name.                           |
| `--type <type>`               | **(Required)** Field type. See valid types below.            |
| `--required`                  | Mark the field as required.                                  |
| `--dry-run`                   | Preview the field that would be created without creating it. |
| `--json`                      | Output as JSON.                                              |

Also accepts [global options](#global-options).

**Valid field types**

`PlainText`, `RichText`, `Number`, `DateTime`, `Link`, `Image`, `Video`, `Color`, `Bool`, `Option`, `ItemRef`, `ItemRefSet`

**Example**

```bash
webflow cms fields create \
  --collection 6258612d1ee792848f805dcf \
  --name "Author" \
  --type PlainText \
  --required
```

---

### `cms items list`

Lists items in a CMS collection.

**Usage**

```bash
webflow cms items list --collection <collectionId> [options]
```

**Options**

| Option                        | Description                                                                                                  | Default                  |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------------ |
| `--collection <collectionId>` | **(Required)** Collection ID.                                                                                |                          |
| `--fields <fields>`           | Comma-separated columns to display. Valid fields: `id`, `isDraft`, `isArchived`, `lastUpdated`, `fieldData`. | `id,isDraft,lastUpdated` |
| `--limit <n>`                 | Maximum number of items to return.                                                                           | `100`                    |
| `--offset <n>`                | Number of items to skip (for pagination).                                                                    | `0`                      |
| `--locale <cmsLocaleId>`      | CMS locale ID to filter by.                                                                                  |                          |
| `--json`                      | Output as JSON.                                                                                              | `false`                  |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms items list --collection 6258612d1ee792848f805dcf --limit 50 --json
```

---

### `cms items get`

Gets a single CMS item by ID.

**Usage**

```bash
webflow cms items get --collection <collectionId> --item <itemId> [options]
```

**Options**

| Option                        | Description                            |
| ----------------------------- | -------------------------------------- |
| `--collection <collectionId>` | **(Required)** Collection ID.          |
| `--item <itemId>`             | **(Required)** Item ID.                |
| `--locale <cmsLocaleId>`      | CMS locale ID to retrieve content for. |
| `--json`                      | Output as JSON.                        |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms items get \
  --collection 6258612d1ee792848f805dcf \
  --item 62b720ef280c7a7a3be8cabe
```

---

### `cms items create`

Creates a new CMS item.

**Usage**

```bash
webflow cms items create --collection <collectionId> --data <json> [options]
```

**Options**

| Option                        | Description                                                 |
| ----------------------------- | ----------------------------------------------------------- |
| `--collection <collectionId>` | **(Required)** Collection ID.                               |
| `--data <json>`               | **(Required)** Item field data as a JSON string.            |
| `--draft`                     | Create as a draft (not published).                          |
| `--dry-run`                   | Preview the item that would be created without creating it. |
| `--json`                      | Output as JSON.                                             |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms items create \
  --collection 6258612d1ee792848f805dcf \
  --data '{"name":"Hello World","slug":"hello-world"}'
```

---

### `cms items update`

Updates an existing CMS item.

**Usage**

```bash
webflow cms items update --collection <collectionId> --item <itemId> --data <json> [options]
```

**Options**

| Option                        | Description                                         |
| ----------------------------- | --------------------------------------------------- |
| `--collection <collectionId>` | **(Required)** Collection ID.                       |
| `--item <itemId>`             | **(Required)** Item ID to update.                   |
| `--data <json>`               | **(Required)** Updated field data as a JSON string. |
| `--dry-run`                   | Preview the update without applying it.             |
| `--json`                      | Output as JSON.                                     |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms items update \
  --collection 6258612d1ee792848f805dcf \
  --item 62b720ef280c7a7a3be8cabe \
  --data '{"name":"Updated Title"}'
```

---

### `cms items delete`

Deletes a CMS item.

**Usage**

```bash
webflow cms items delete --collection <collectionId> --item <itemId> [options]
```

**Options**

| Option                        | Description                            |
| ----------------------------- | -------------------------------------- |
| `--collection <collectionId>` | **(Required)** Collection ID.          |
| `--item <itemId>`             | **(Required)** Item ID to delete.      |
| `--dry-run`                   | Preview the deletion without deleting. |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms items delete \
  --collection 6258612d1ee792848f805dcf \
  --item 62b720ef280c7a7a3be8cabe
```

---

### `cms items publish`

Publishes one or more CMS items.

**Usage**

```bash
webflow cms items publish --collection <collectionId> --items <itemIds> [options]
```

**Options**

| Option                        | Description                                                |
| ----------------------------- | ---------------------------------------------------------- |
| `--collection <collectionId>` | **(Required)** Collection ID.                              |
| `--items <itemIds>`           | **(Required)** Comma-separated item IDs to publish.        |
| `--dry-run`                   | Preview which items would be published without publishing. |
| `--json`                      | Output as JSON.                                            |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cms items publish \
  --collection 6258612d1ee792848f805dcf \
  --items 62b720ef280c7a7a3be8cabe,62b720ef280c7a7a3be8cabf
```

---

## DevLink Export \[#devlink-export]

### `devlink export`

Exports Webflow components from your site as a static, self-contained local React bundle.

**Usage**

```bash
webflow devlink export [options]
```

**Options**

| Option                 | Description                      | Default                                                              |
| ---------------------- | -------------------------------- | -------------------------------------------------------------------- |
| `--api-token <token>`  | API token to use for the export. | Uses `WEBFLOW_API_TOKEN` from `.env` or the OAuth session.           |
| `-s, --site <site-id>` | Site ID to export from.          | Uses `siteId` from `webflow.json`, or `WEBFLOW_SITE_ID` from `.env`. |

Also accepts [global options](#global-options).

**Example**

```bash
# Export components using a specific site ID and token
webflow devlink export --site 1234567890 --api-token <YOUR_TOKEN>
```

---

### `devlink sync`

> **Deprecated**
>
> `webflow devlink sync` is deprecated and removed. Use [`webflow devlink export`](#devlink-export) instead. If you're upgrading an older project, see [Migrating to DevLink Export](/devlink/docs/reference/migrate-from-sync).

---

## DevLink Import \[#devlink-import]

### `devlink import`

Bundles and shares components with a Webflow Workspace.

**Usage**

```bash
webflow devlink import [options]
```

**Options**

| Option                | Description                                                                        | Default                               |
| --------------------- | ---------------------------------------------------------------------------------- | ------------------------------------- |
| `--api-token <token>` | Workspace API token.                                                               | Uses `WEBFLOW_API_TOKEN` from `.env`. |
| `-f`, `--force`       | Forces the bundler to finish compiling, even if there are warnings or type errors. | `false`                               |
| `--debug-bundler`     | Displays the final bundler configurations for debugging.                           | `false`                               |
| `--dev`               | Bundles in development mode. Disables minification and source maps.                | `false`                               |

Also accepts [global options](#global-options).

**Example**

```bash
# Share the components and bypass any interactive prompts
webflow devlink import --no-input
```

**Exit codes**

| Code     | Meaning                                       |
| -------- | --------------------------------------------- |
| `0`      | Success                                       |
| Non-zero | Failure, including bundling or sharing errors |

---

### `devlink bundle`

Bundles components locally to a `dist` directory.
This command doesn't share the components to Webflow.

**Usage**

```bash
webflow devlink bundle [options]
```

**Options**

| Option                 | Description                                                                        | Default  |
| ---------------------- | ---------------------------------------------------------------------------------- | -------- |
| `--public-path <path>` | Required. The URL where you can serve your library.                                | None     |
| `--output-path <path>` | Overrides the output path for the bundle.                                          | `./dist` |
| `-f`, `--force`        | Forces the bundler to finish compiling, even if there are warnings or type errors. | `false`  |
| `--debug-bundler`      | Displays the final bundler configurations for debugging.                           | `false`  |
| `--dev`                | Bundles in development mode. Disables minification and source maps.                | `false`  |

Also accepts [global options](#global-options).

**Example**

```bash
# Bundle the components and output to a 'build' folder
webflow devlink bundle --output-path ./build
```

**Exit codes**

| Code     | Meaning                            |
| -------- | ---------------------------------- |
| `0`      | Success                            |
| Non-zero | Failure, including bundling errors |

---

## Designer Extensions

### `extension list`

Lists available templates for `extension init`.

**Usage**

```bash
webflow extension list
```

---

### `extension init`

Initializes a new Designer Extension from a template.

**Usage**

```bash
webflow extension init [options] [projectName] [scaffoldName]
```

**Arguments**

Both arguments are optional — the CLI prompts for any that are not provided.

| Argument       | Description                                                   |
| -------------- | ------------------------------------------------------------- |
| `projectName`  | The name of your new app directory.                           |
| `scaffoldName` | The template to use: `default`, `react`, or `typescript-alt`. |

**Example**

```bash
# Initialize a new React-based extension in a 'my-new-extension' folder
webflow extension init my-new-extension react
```

---

### `extension bundle`

Bundles your Designer Extension into a `bundle.zip` file for upload.

**Usage**

```bash
webflow extension bundle
```

---

### `extension serve`

Serves your Designer Extension on a local development server.

**Usage**

```bash
webflow extension serve [port]
```

**Arguments**

| Argument | Description                   | Default |
| -------- | ----------------------------- | ------- |
| `port`   | The port to serve the app on. | `1337`  |

## Forms

### `forms list`

Lists all forms for a site.

**Usage**

```bash
webflow forms list [options]
```

**Options**

| Option              | Description                                                                                                        | Default               |
| ------------------- | ------------------------------------------------------------------------------------------------------------------ | --------------------- |
| `--site <siteId>`   | Site ID. Falls back to `webflow.json` or an interactive prompt.                                                    |                       |
| `--fields <fields>` | Comma-separated columns to display. Valid fields: `id`, `displayName`, `name`, `slug`, `createdOn`, `lastUpdated`. | `id,displayName,slug` |
| `--json`            | Output as JSON.                                                                                                    | `false`               |

Also accepts [global options](#global-options).

**Example**

```bash
webflow forms list --site 6258612d1ee792848f805dcf
webflow forms list --site 6258612d1ee792848f805dcf --fields id,displayName,name,slug --json
```

---

### `forms submissions`

Lists submissions for a specific form. Supports JSON output and CSV export.

**Usage**

```bash
webflow forms submissions [options]
```

**Options**

| Option            | Description                                                     | Default |
| ----------------- | --------------------------------------------------------------- | ------- |
| `--site <siteId>` | Site ID. Falls back to `webflow.json` or an interactive prompt. |         |
| `--form <formId>` | Form ID.                                                        |         |
| `--output <file>` | Export submissions to a CSV file at the given path.             |         |
| `--json`          | Output as JSON. Ignored if `--output` is also provided.         | `false` |

Also accepts [global options](#global-options).

**Example**

```bash
webflow forms submissions --site 6258612d1ee792848f805dcf --form 62b720ef280c7a7a3be8cabe
webflow forms submissions --site 6258612d1ee792848f805dcf --form 62b720ef280c7a7a3be8cabe --output submissions.csv
webflow forms submissions --site 6258612d1ee792848f805dcf --form 62b720ef280c7a7a3be8cabe --json
```

---

## Logging

### `log`

Displays the directory and path to the latest log file.

**Usage**

```bash
webflow log
```

---

## Sites

### `sites list`

Lists all sites in your Webflow workspace.

**Usage**

```bash
webflow sites list [options]
```

**Options**

| Option              | Description                                                                                                                     | Default                        |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ |
| `--fields <fields>` | Comma-separated columns to display. Valid fields: `id`, `displayName`, `shortName`, `timeZone`, `lastUpdated`, `lastPublished`. | `id,displayName,lastPublished` |
| `--json`            | Output as JSON.                                                                                                                 | `false`                        |

Also accepts [global options](#global-options).

**Example**

```bash
webflow sites list
webflow sites list --fields id,displayName,shortName --json
```

---

### `sites get`

Gets details for a specific site.

**Usage**

```bash
webflow sites get <siteId> [options]
```

**Arguments**

| Argument | Description                     |
| -------- | ------------------------------- |
| `siteId` | The ID of the site to retrieve. |

**Options**

| Option   | Description     |
| -------- | --------------- |
| `--json` | Output as JSON. |

Also accepts [global options](#global-options).

**Example**

```bash
webflow sites get 6258612d1ee792848f805dcf
```

---

### `sites domains`

Lists the custom domains configured for a site.

**Usage**

```bash
webflow sites domains --site <siteId> [options]
```

**Options**

| Option            | Description             |
| ----------------- | ----------------------- |
| `--site <siteId>` | **(Required)** Site ID. |
| `--json`          | Output as JSON.         |

Also accepts [global options](#global-options).

**Example**

```bash
webflow sites domains --site 6258612d1ee792848f805dcf
```

---

### `sites publish`

Publishes a site to the Webflow subdomain or to specific custom domains.

**Usage**

```bash
webflow sites publish --site <siteId> [options]
```

**Options**

| Option                  | Description                                                                         |
| ----------------------- | ----------------------------------------------------------------------------------- |
| `--site <siteId>`       | **(Required)** Site ID to publish.                                                  |
| `--domains <domainIds>` | Comma-separated custom domain IDs to publish to. Defaults to the Webflow subdomain. |
| `--page <pageId>`       | Publish a single page instead of the full site.                                     |
| `--dry-run`             | Preview what would be published without triggering a build.                         |
| `--json`                | Output as JSON.                                                                     |

Also accepts [global options](#global-options).

**Example**

```bash
# Publish to the Webflow subdomain
webflow sites publish --site 6258612d1ee792848f805dcf

# Publish a single page
webflow sites publish --site 6258612d1ee792848f805dcf --page 5f43a0dfe6f3b800161c19b3

# Preview without publishing
webflow sites publish --site 6258612d1ee792848f805dcf --dry-run
```

---

## Apps

The `apps` namespace is the canonical way to manage [Webflow Cloud](/webflow-cloud) apps — full-stack applications deployed either to an existing Webflow site (site-attached) or as a standalone project (project app). It replaces the `cloud` namespace below, which remains available as a set of deprecated aliases.

> **\`apps\` is a pre-release namespace — install the \`@next\` channel**
>
> Every `apps` command on this page ships only on the CLI's pre-release channel. On the
> stable channel the `apps` namespace does not exist, and each command below fails with an
> unknown-command error.
>
> ```bash
> npm install -g @webflow/webflow-cli@next
> ```
>
> A pre-release install reports a version with a `-next.` suffix; a stable install reports a
> plain version number. Check with `webflow --version`.
>
> ```bash
> webflow --version
> ```
>
> The stable channel covers [`cloud init`](#cloud-init), [`cloud deploy`](#cloud-deploy),
> [`cloud create`](#cloud-create), and [`cloud list`](#cloud-list) only. There is no stable
> equivalent for the management commands — `apps list`, `get`, `domains`, `link`, `update`,
> `delete`, `environments`, `deployments`, `logs`, or `env-vars`.

For the identity-resolution order (flags, environment variables, `webflow.json`), non-interactive requirements, and CI/CD examples, see [Agents & CI/CD](/cli/agent-workflows).

### `apps init` \[#apps-init]

Bootstraps a new Webflow Cloud app locally. Shares its options and behavior with the deprecated [`cloud init`](#cloud-init).

**Usage**

```bash
webflow apps init [options]
```

**Options**

| Option                         | Short | Description                                                                                                                                           |
| ------------------------------ | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--app-name <name>`            | `-n`  | App name. Required with `--no-input`.                                                                                                                 |
| `--project-name <name>`        | —     | **Deprecated.** Use `--app-name` instead.                                                                                                             |
| `--framework <framework>`      | `-f`  | Framework to use (`astro` or `nextjs`). Required with `--no-input`.                                                                                   |
| `--mount <mount>`              | `-m`  | Mount path. Defaults to `/app` for a site-attached app, `/` for a project app (`--new`).                                                              |
| `--site-id <siteId>`           | `-s`  | Webflow site ID to connect to (site-attached). Mutually exclusive with `--workspace-id`.                                                              |
| `--new`                        | —     | Create an app without connecting to an existing site (project app).                                                                                   |
| `--workspace-id <workspaceId>` | `-w`  | Workspace ID to deploy into. Skips the workspace picker for `--new`. Mutually exclusive with `--site-id`.                                             |
| `--import <repo-url>`          | —     | Create the app from an existing GitHub repository and clone it locally. See [Creating an app from a repository](#apps-init-import).                   |
| `--branch <branch>`            | —     | Branch to build with `--import`. Defaults to the repository's default branch.                                                                         |
| `--idempotency-key <key>`      | —     | Dedupes a retried create. **Required** with `--import` in non-interactive runs. `--import` only.                                                      |
| `--skip-clone`                 | —     | Create the app from `--import` without cloning locally. Nothing is written to disk; the app and environment IDs are printed instead. `--import` only. |
| `--json`                       | —     | Output as JSON. `--import` only — the scaffold path has no single response object to serialize.                                                       |
| `--dry-run`                    | —     | Validate and preview without creating anything. Works on both the scaffold and `--import` paths.                                                      |

Also accepts [global options](#global-options).

> **\`--no-input\` requirements**
>
> Always pass `--app-name` and `--framework`. Site-attached apps additionally require `--site-id`. Project apps
> (`--new`) should pass `--workspace-id` — without it, a token that can see more than one workspace triggers a picker
> that hangs in a non-TTY context.

**Example**

```bash
# Site-attached app, non-interactive
webflow apps init --no-input --app-name my-app --framework astro --mount /app --site-id site_abc123

# Project app (no existing site), non-interactive
webflow apps init --new --no-input --app-name my-app --framework nextjs --workspace-id ws_abc123
```

#### Creating an app from a repository \[#apps-init-import]

`--import` points `init` at an existing GitHub repository instead of scaffolding a new
project. Webflow creates the app from that repo, triggers a first build, and clones the
repo locally so you can keep working in it.

```bash
webflow apps init --import https://github.com/acme/storefront --json
```

The app name defaults to the repository name; pass `--app-name` to override it. The
branch defaults to the repository's default branch; pass `--branch` to build a different
one.

> **\`--site-id\`, \`--new\`, and \`--mount\` behave differently with \`--import\`**
>
> These flags are **not** interchangeable with their scaffold-path behavior. With
> `--import`:
>
> | Flag                   | Rule                                                                                                    |
> | ---------------------- | ------------------------------------------------------------------------------------------------------- |
> | `--site-id` / `--new`  | **Exactly one is required.** A `siteId` found inside the repository is never used to choose the target. |
> | `--mount`              | **Required, and must be non-root**, when attaching with `--site-id`.                                    |
> | `--mount` with `--new` | **Rejected.** A project app owns the root of its own domain, so it always mounts at `/`.                |
>
> `--framework` and `--workspace-id` are also rejected alongside `--import` — a repository
> brings its own code, and the workspace is derived from your token.

> **Non-interactive imports need an idempotency key**
>
> `--idempotency-key` is **required** when importing with `--no-input` (including CI). Use a
> retry-stable value unique to the repository and target, so a retried step replays the
> original app instead of creating a second one.
>
> ```bash
> webflow apps init --import https://github.com/acme/storefront --new --no-input \
>   --idempotency-key "$GITHUB_RUN_ID-acme-storefront" --json
> ```

> **The Webflow GitHub App has to be installed and connected**
>
> Webflow reads the repository through its GitHub App, never through your personal GitHub
> credentials, so the App must be installed on the repository's account **and** connected
> to your workspace. When it isn't, the command fails with an actionable error carrying the
> URL to complete:
>
> | Error                       | What it means                                                         | What the URL opens |
> | --------------------------- | --------------------------------------------------------------------- | ------------------ |
> | `GITHUB_APP_NOT_INSTALLED`  | The App isn't installed on that account at all.                       | the install page   |
> | `GITHUB_REPO_NOT_CONNECTED` | The App is installed, but you haven't connected it to this workspace. | the authorize page |
>
> Open the URL from the error you got — the two are different pages, and visiting the
> install page for an already-installed account only shows GitHub's "Configure" screen and
> connects nothing. Then re-run the command. The browser is only involved for this one-time
> step.

> **Creating an app needs a user token, not a Workspace API Token**
>
> A Workspace API Token can deploy but cannot create an app — creating one records you as
> its author, so it requires a token from `webflow auth login`. This applies to `apps
>   init` generally, `--import` included.

---

### `apps deploy` \[#apps-deploy]

Deploys the current app to Webflow Cloud. Shares its options and behavior with the deprecated [`cloud deploy`](#cloud-deploy).

**Usage**

```bash
webflow apps deploy [options]
```

**Options**

| Option                         | Short | Description                                                                                                                                                                             |
| ------------------------------ | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--environment <environment>`  | `-e`  | Environment name. Created if it doesn't exist.                                                                                                                                          |
| `--mount <mount>`              | `-m`  | Mount path (e.g., `/app`). **Always pass it with `--no-input`** — never read from `webflow.json`. Not enforced: omitting it deploys at root rather than failing. See the warning below. |
| `--app-name <name>`            | `-n`  | App name, used when creating an app on its first deploy.                                                                                                                                |
| `--project-name <name>`        | —     | **Deprecated.** Use `--app-name` instead.                                                                                                                                               |
| `--directory <path>`           | `-d`  | App directory. Use for monorepos.                                                                                                                                                       |
| `--description <description>`  | —     | App description, used when creating an app.                                                                                                                                             |
| `--skip-mount-path-check`      | —     | Skip mount-path validation.                                                                                                                                                             |
| `--auto-publish`               | —     | Publish the Webflow site after deployment so the mount path routing goes live.                                                                                                          |
| `--site-id <siteId>`           | `-s`  | Webflow site ID for a site-attached deploy. Skips the site picker. Overrides `webflow.json`. Mutually exclusive with `--workspace-id`.                                                  |
| `--app-id <appId>`             | `-a`  | App ID to deploy to. Skips the app picker. Overrides `webflow.json`.                                                                                                                    |
| `--project-id <appId>`         | —     | **Deprecated.** Use `--app-id` instead.                                                                                                                                                 |
| `--framework <framework>`      | `-f`  | Override framework detection (`nextjs` or `astro`). Writes the value back to `webflow.json`.                                                                                            |
| `--workspace-id <workspaceId>` | `-w`  | Workspace ID for a project app's first deploy. Skips the workspace picker. Mutually exclusive with `--site-id`.                                                                         |

Also accepts [global options](#global-options).

> **\`--site-id\` and \`--workspace-id\` are mutually exclusive**
>
> Use `--site-id` to deploy site-attached, or `--workspace-id` to deploy a project app in a specific workspace. Passing
> both will error. This one is a hard failure before any backend call — unlike `--mount`, which is not enforced.

> **Pass --mount and --environment together**
>
> The deploy prompts (pick an app, name a new app, pick an environment) are gated on whether `--mount` and `--environment` are *both* set — not on `--no-input`. Passing `--no-input` without both still triggers the prompt and hangs in a non-TTY context. The minimum safe form is `--no-input --mount <path> --environment <env>` plus `--site-id` (site-attached) or `--workspace-id` (project app, first deploy).

> **Omitting \`--mount\` under \`--no-input\` deploys to root, silently**
>
> `--mount` is not enforced. When it is omitted in a non-interactive run the command does not
> fail and does not warn — it deploys at root (`/`). The mount prompt offers a `/app`
> default, but the non-interactive path only accepts a default that passes a validator, and
> this prompt has none, so nothing is returned and the value normalizes to `/`. Root is a
> valid mount, so the deploy goes ahead there.
>
> Always pass `--mount` explicitly in CI and scripts. A wrong mount tends to surface later as
> an `ENVIRONMENT_MOUNT_MISMATCH` on a subsequent deploy, well away from the run that caused
> it.

> **How \`deploy\` decides between site-attached and project app**
>
> A preflight step resolves identity before any backend call, taking the first match:
> `--site-id` → `--workspace-id` → `WEBFLOW_SITE_ID` → `siteId` in `webflow.json` →
> `WEBFLOW_WORKSPACE_ID` → `cloud.workspace_id` → a hard error under `--no-input`, or a
> picker otherwise.
>
> Two consequences worth knowing: environment variables outrank `webflow.json`, and **any
> resolved site short-circuits before workspace resolution is attempted**. A stale
> `WEBFLOW_SITE_ID` left in the environment therefore wins over a manifest configured for a
> project-app deploy. Pass `--site-id` or `--workspace-id` explicitly to remove the
> ambiguity.

**Example**

```bash
# Site-attached deploy
webflow apps deploy --no-input --site-id site_abc123 --mount /app --environment production --skip-mount-path-check

# Project app deploy
webflow apps deploy --no-input --workspace-id ws_abc123 --app-name my-app --mount / --environment production
```

---

### `apps list`

Lists all apps in your Webflow workspace.

**Usage**

```bash
webflow apps list [options]
```

**Options**

| Option              | Description                                                               |
| ------------------- | ------------------------------------------------------------------------- |
| `-s`, `--site`      | Filter to an exact Webflow site ID. Does not default from `webflow.json`. |
| `--name <name>`     | Filter by exact app name (case-sensitive).                                |
| `--q <text>`        | Case-insensitive substring match on the app name.                         |
| `--fields <fields>` | Comma-separated columns to display.                                       |
| `--json`            | Output as JSON.                                                           |

Also accepts [global options](#global-options).

> **How the filters combine**
>
> App names are unique only *within* a site, so pass `--site` **and** `--name` together to
> resolve to at most one app. `--site` alone can match many apps, and `--name` alone can
> match apps across different sites.
>
> Multiple filters combine with AND — every one must match. An exact filter plus a
> non-matching `--q` therefore returns an empty page, and that means nothing matched *all*
> the filters, not that the app doesn't exist. Use `--q` to discover, then narrow.

**Example**

```bash
webflow apps list --json
webflow apps list --q checkout --json              # discover
webflow apps list --site site_abc123 --name shop   # resolve to one
```

---

### `apps get`

Gets details for a specific app.

**Usage**

```bash
webflow apps get [appId] [options]
```

**Arguments**

| Argument | Description                                                                                      |
| -------- | ------------------------------------------------------------------------------------------------ |
| `appId`  | App ID. Defaults to `WEBFLOW_APP_ID`, `webflow.json` (`cloud.app_id`), or an interactive picker. |

**Options**

| Option              | Description                         |
| ------------------- | ----------------------------------- |
| `--fields <fields>` | Comma-separated columns to display. |
| `--json`            | Output as JSON.                     |

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps get app_abc123 --json
```

---

### `apps domains`

Lists the domains and live URLs configured for an app.

**Usage**

```bash
webflow apps domains [appId] [options]
```

**Arguments**

| Argument | Description                                                                     |
| -------- | ------------------------------------------------------------------------------- |
| `appId`  | App ID. Defaults to `WEBFLOW_APP_ID`, `webflow.json`, or an interactive picker. |

**Options**

| Option              | Description                                     |
| ------------------- | ----------------------------------------------- |
| `--fields <fields>` | Comma-separated columns to display.             |
| `--limit <n>`       | Max domains to return (server caps at 100).     |
| `--cursor <cursor>` | Pagination cursor from a previous `nextCursor`. |
| `--json`            | Output as JSON.                                 |

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps domains app_abc123 --json
```

---

### `apps update`

Updates an app's name, description, or GitHub source. Requires at least one of `--name`, `--description`, or `--github-source`.

**Usage**

```bash
webflow apps update [appId] [options]
```

**Arguments**

| Argument | Description                                                                     |
| -------- | ------------------------------------------------------------------------------- |
| `appId`  | App ID. Defaults to `WEBFLOW_APP_ID`, `webflow.json`, or an interactive picker. |

**Options**

| Option                        | Description                                                                                                                                                                |
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--name <name>`               | New app name.                                                                                                                                                              |
| `--description <description>` | New app description.                                                                                                                                                       |
| `--github-source <repo-url>`  | GitHub repository to build from, as `https://github.com/<owner>/<repo>`. Attaches a repository to an app that has none, or repoints one that already has a different repo. |
| `--dry-run`                   | Preview the update without applying it.                                                                                                                                    |
| `--json`                      | Output as JSON.                                                                                                                                                            |

> **\`--github-source\` does not deploy**
>
> Attaching or repointing a repository changes only what the app builds *from*. Run
> [`apps deployments trigger`](#apps-deployments-trigger) afterwards to build it.
>
> To change which branch an environment builds, use
> [`apps environments update --branch`](#apps-environments-update) — `--github-source`
> selects the repository, the environment selects the branch.
>
> It requires the Webflow GitHub App installed on the repository owner and connected to your
> workspace, the same prerequisite as
> [`apps init --import`](#apps-init-import).

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps update app_abc123 --description "Marketing site backend" --dry-run
```

---

### `apps delete`

Deletes (or archives, depending on the site kind) an app.

**Usage**

```bash
webflow apps delete [appId] [options]
```

**Arguments**

| Argument | Description                                                                     |
| -------- | ------------------------------------------------------------------------------- |
| `appId`  | App ID. Defaults to `WEBFLOW_APP_ID`, `webflow.json`, or an interactive picker. |

**Options**

| Option      | Short | Description                                                                                                                   |
| ----------- | ----- | ----------------------------------------------------------------------------------------------------------------------------- |
| `--yes`     | `-y`  | Skip the confirmation prompt. **Required** under `--no-input` or `--json` — without it the CLI refuses rather than prompting. |
| `--dry-run` | —     | Preview the delete without executing it.                                                                                      |
| `--json`    | —     | Output as JSON.                                                                                                               |

Also accepts [global options](#global-options).

**Example**

```bash
# Preview first
webflow apps delete app_abc123 --dry-run

# Delete non-interactively
webflow apps delete app_abc123 --yes --no-input
```

---

### `apps environments list`

Lists the environments of an app.

**Usage**

```bash
webflow apps environments list [appId] [options]
```

**Arguments**

| Argument | Description                                                                     |
| -------- | ------------------------------------------------------------------------------- |
| `appId`  | App ID. Defaults to `WEBFLOW_APP_ID`, `webflow.json`, or an interactive picker. |

**Options**

| Option              | Description                                                                         |
| ------------------- | ----------------------------------------------------------------------------------- |
| `--branch <branch>` | Filter by exact branch name (case-sensitive) — resolves to at most one environment. |
| `--q <text>`        | Case-insensitive substring match on the branch name.                                |
| `--fields <fields>` | Comma-separated columns to display.                                                 |
| `--json`            | Output as JSON.                                                                     |

Also accepts [global options](#global-options).

Filters combine with AND, so `--branch` plus a non-matching `--q` returns an empty page —
that means nothing matched every filter, not that the environment is absent.

**Example**

```bash
webflow apps environments list app_abc123 --json
```

---

### `apps environments create` \[#apps-environments-create]

Creates an environment on an app, bound to a branch and served at a mount path.

**Usage**

```bash
webflow apps environments create [appId] --branch <branch> --mount <path> [options]
```

**Arguments**

| Argument | Description                                                                     |
| -------- | ------------------------------------------------------------------------------- |
| `appId`  | App ID. Defaults to `WEBFLOW_APP_ID`, `webflow.json`, or an interactive picker. |

**Options**

| Option                    | Description                                                                                                                                 |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `--branch <branch>`       | **Required.** Git branch this environment builds from. Must be a valid branch name and not already used by another environment of this app. |
| `--mount <path>`          | **Required.** URL path the environment is served at, for example `/staging`. Must be unique across the site.                                |
| `--idempotency-key <key>` | Retry-stable key that dedupes a retried create. Must be non-empty printable ASCII when passed.                                              |
| `--dry-run`               | Preview without creating anything.                                                                                                          |
| `--json`                  | Output as JSON.                                                                                                                             |

Also accepts [global options](#global-options).

> **Creating an environment does not deploy it**
>
> The environment starts empty. Run [`apps deployments trigger`](#apps-deployments-trigger)
> to build it.

**Example**

```bash
webflow apps environments create --branch staging --mount /staging --dry-run
webflow apps environments create --branch staging --mount /staging --json
```

---

### `apps environments update` \[#apps-environments-update]

Updates an environment's branch or mount path. Requires at least one of `--branch` or `--mount`.

**Usage**

```bash
webflow apps environments update [appId] [envId] [options]
```

**Arguments**

| Argument | Description                                                                                         |
| -------- | --------------------------------------------------------------------------------------------------- |
| `appId`  | App ID. Defaults to `WEBFLOW_APP_ID`, `webflow.json`, or an interactive picker.                     |
| `envId`  | Environment ID. Defaults to `WEBFLOW_APP_ENVIRONMENT_ID`, `webflow.json`, or an interactive picker. |

**Options**

| Option                  | Description                                                                 |
| ----------------------- | --------------------------------------------------------------------------- |
| `--branch <branch>`     | Git branch this environment builds from. Same uniqueness rules as `create`. |
| `--mount <path>`        | URL path the environment is served at. Must be unique across the site.      |
| `--app-id <id>`         | App ID, overriding `webflow.json`.                                          |
| `--environment-id <id>` | Environment ID, overriding `webflow.json`.                                  |
| `--dry-run`             | Preview without applying anything.                                          |
| `--json`                | Output as JSON.                                                             |

Also accepts [global options](#global-options).

> **Changing the branch does not rebuild**
>
> The environment keeps serving its existing build until you run
> [`apps deployments trigger`](#apps-deployments-trigger).

**Example**

```bash
webflow apps environments update --branch release --dry-run
webflow apps environments update env_abc123 --mount /v2 --json
```

---

### `apps environments delete` \[#apps-environments-delete]

Deletes an environment from an app.

**Usage**

```bash
webflow apps environments delete [appId] [envId] [options]
```

**Arguments**

| Argument | Description                                                                                         |
| -------- | --------------------------------------------------------------------------------------------------- |
| `appId`  | App ID. Defaults to `WEBFLOW_APP_ID`, `webflow.json`, or an interactive picker.                     |
| `envId`  | Environment ID. Defaults to `WEBFLOW_APP_ENVIRONMENT_ID`, `webflow.json`, or an interactive picker. |

**Options**

| Option                  | Description                                |
| ----------------------- | ------------------------------------------ |
| `--app-id <id>`         | App ID, overriding `webflow.json`.         |
| `--environment-id <id>` | Environment ID, overriding `webflow.json`. |
| `--yes`                 | Skip the confirmation prompt.              |
| `--dry-run`             | Preview without deleting anything.         |
| `--json`                | Output as JSON.                            |

Also accepts [global options](#global-options).

> **\`--yes\` is required non-interactively**
>
> Without a TTY and without `--yes`, the command refuses rather than deleting, reporting
> `yes` as the missing flag.

**Example**

```bash
webflow apps environments delete env_abc123 --dry-run
webflow apps environments delete env_abc123 --yes --json
```

---

### `apps link` \[#apps-link]

Points the current directory at an existing app and environment by updating `webflow.json`. Verifies the app, but creates and deploys nothing — use it to adopt an app from a fresh clone, or to repoint a directory at a different app or environment.

**Usage**

```bash
webflow apps link [appId] [options]
```

**Arguments**

| Argument | Description                                                                     |
| -------- | ------------------------------------------------------------------------------- |
| `appId`  | App ID. Takes precedence over `--app-id`, `WEBFLOW_APP_ID`, and `webflow.json`. |

**Options**

| Option                               | Description                                                                                                                                     |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `--app-id <id>`                      | App ID, overriding `webflow.json`.                                                                                                              |
| `--environment-id <id>`              | Environment ID to link.                                                                                                                         |
| `-w`, `--workspace-id <workspaceId>` | Workspace ID to persist. Written as supplied — it cannot be derived or verified from the app, so it is only stored when you pass it explicitly. |
| `--dry-run`                          | Preview the manifest change without writing it.                                                                                                 |
| `--json`                             | Output as JSON.                                                                                                                                 |

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps link app_abc123 --environment-id env_abc123 --dry-run
webflow apps link app_abc123 --environment-id env_abc123 --json
```

---

### `apps deployments list` \[#apps-deployments-list]

Lists the most recent deployments of an environment, newest first. Resolves the app and environment from `WEBFLOW_APP_ID` / `WEBFLOW_APP_ENVIRONMENT_ID`, `webflow.json`, or an interactive picker — this command takes no `appId` argument.

**Usage**

```bash
webflow apps deployments list [options]
```

**Options**

| Option              | Description                                   | Default                                          |
| ------------------- | --------------------------------------------- | ------------------------------------------------ |
| `--limit <n>`       | Max deployments to return, most recent first. | `20`                                             |
| `--fields <fields>` | Comma-separated columns to display.           | `id,status,sourceType,commitHash,buildStartedAt` |
| `--json`            | Output as JSON.                               | `false`                                          |

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps deployments list --limit 5 --json
```

---

### `apps deployments get` \[#apps-deployments-get]

Gets details for a specific deployment. Resolves the app and environment the same way as [`deployments list`](#apps-deployments-list).

**Usage**

```bash
webflow apps deployments get <depId> [options]
```

**Options**

| Option                 | Description                                                                                | Default |
| ---------------------- | ------------------------------------------------------------------------------------------ | ------- |
| `--fields <fields>`    | Comma-separated columns to display.                                                        |         |
| `--wait`               | Poll until the deployment reaches a terminal status, then exit with a status-derived code. | `false` |
| `--interval <seconds>` | Seconds between polls when `--wait` is set. Values below `5` are raised to `5`.            | `5`     |
| `--timeout <seconds>`  | Max seconds to keep polling before giving up. Values above `1800` (30 min) are capped.     | `600`   |
| `--json`               | Output as JSON.                                                                            | `false` |

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps deployments get dep_abc123 --json
```

#### Waiting for a deployment to finish \[#apps-deployments-wait]

Watching is a modifier on `get`, not a separate command. Pass `--wait` to poll until the
deployment reaches a terminal status — useful as a gate before a downstream step such as
smoke tests or a notification.

Deployment status is one of `starting`, `building`, `deploying`, `success`, `failed`,
`canceled`, or `unstaged`. The first three are in-flight; the rest are terminal.

**Exit codes with `--wait`**

| Code | Meaning                                                                    |
| ---- | -------------------------------------------------------------------------- |
| `0`  | Deployment reached `success`.                                              |
| `1`  | Any other outcome: a non-`success` terminal status, **or** a poll timeout. |

> **A timeout is not distinguishable from a failure by exit code**
>
> `--wait` exits `1` both when the deployment ends in a non-`success` status and when
> polling times out first. A CI step that needs to tell "it broke" from "it is still
> running" has to read the reported status rather than gate on the exit code alone.

**Example**

```bash
webflow apps deployments get dep_abc123 --wait --interval 10 --timeout 300
echo "exit code: $?"
```

---

### `apps deployments redeploy` \[#apps-deployments-redeploy]

Re-runs an existing deployment at its **same commit**, enqueuing a fresh build. Redeploying an earlier successful deployment is how you roll back.

**Usage**

```bash
webflow apps deployments redeploy <depId> [options]
```

**Arguments**

| Argument | Description                                   |
| -------- | --------------------------------------------- |
| `depId`  | **Required.** ID of the deployment to re-run. |

**Options**

| Option                    | Description                                                                                                                                             |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--idempotency-key <key>` | Sent as the `Idempotency-Key` header so a retried enqueue is deduped instead of queueing a second build. Must be non-empty printable ASCII when passed. |
| `--dry-run`               | Preview without enqueuing anything.                                                                                                                     |
| `--json`                  | Output as JSON.                                                                                                                                         |

Also accepts [global options](#global-options).

> **Requires a GitHub-connected app**
>
> Apps deployed from local files with [`apps deploy`](#apps-deploy) are not eligible —
> there is no commit to re-run. Connect a repository with
> [`apps init --import`](#apps-init-import) or
> [`apps update --github-source`](#apps-update).

**Example**

```bash
# Roll back: find the last success, then re-run it
webflow apps deployments list --status success --limit 1 --fields id --json
webflow apps deployments redeploy dep_abc123 --idempotency-key "$GITHUB_RUN_ID" --json
```

---

### `apps deployments trigger` \[#apps-deployments-trigger]

Builds the resolved environment's **current HEAD** on demand. Same as `redeploy`, but with no deployment ID — there is no past build to re-run, so it builds whatever the environment's configured branch points at now.

**Usage**

```bash
webflow apps deployments trigger [options]
```

**Options**

| Option                    | Description                                                                                                                                             |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--idempotency-key <key>` | Sent as the `Idempotency-Key` header so a retried enqueue is deduped instead of queueing a second build. Must be non-empty printable ASCII when passed. |
| `--dry-run`               | Preview without enqueuing anything.                                                                                                                     |
| `--json`                  | Output as JSON.                                                                                                                                         |

Also accepts [global options](#global-options).

> **Requires a GitHub-connected app**
>
> Same eligibility rule as [`redeploy`](#apps-deployments-redeploy): apps deployed from
> local files with [`apps deploy`](#apps-deploy) cannot be triggered.

> **It builds the environment's branch, not your checked-out branch**
>
> If the two differ, the CLI warns but does not block. Check with
> `webflow apps environments list --fields id,branch` when you are unsure which branch will
> build.

**Example**

```bash
webflow apps deployments trigger --dry-run
webflow apps deployments trigger --json
```

---

### `apps logs build` \[#apps-logs-build]

Reads the build logs of one deployment. Resolves the app and environment from `WEBFLOW_APP_ID` / `WEBFLOW_APP_ENVIRONMENT_ID`, `webflow.json`, or an interactive picker.

**Usage**

```bash
webflow apps logs build <depId> [options]
```

**Arguments**

| Argument | Description                                                                                   |
| -------- | --------------------------------------------------------------------------------------------- |
| `depId`  | **(Required)** Deployment ID. Get one from [`apps deployments list`](#apps-deployments-list). |

> **Why the deployment ID is required**
>
> The command does not fall back to the newest deployment. That default was removed
> because its result could not be told apart from a wrong answer: with two deploys in
> flight you silently got someone else's build, and before your own build was queued you
> got the *previous* deployment — already finished, already green — reported as the
> current one.
>
> Omitting the ID fails before any network call. Under `--json` the error carries
> `missingFlag: "depId"`, so an agent can recover programmatically instead of
> string-matching:
>
> ```json
> { "error": { "message": "Missing deployment ID. Run 'webflow apps deployments list' to find one, then pass it as the argument.", "missingFlag": "depId" } }
> ```
>
> The two-step pattern is the intended one — listing first means you see which
> deployments exist rather than accepting a silent choice.

**Options**

| Option              | Description                                                           | Default             |
| ------------------- | --------------------------------------------------------------------- | ------------------- |
| `--since <iso>`     | Only logs at or after this ISO datetime.                              |                     |
| `--q <text>`        | Substring filter on the log message.                                  |                     |
| `--limit <n>`       | Max log lines to return.                                              | `100`               |
| `--cursor <cursor>` | Pagination cursor from a previous `nextCursor`.                       |                     |
| `--fields <fields>` | Comma-separated columns to display (`timestamp`, `message`, `phase`). | `timestamp,message` |
| `--json`            | Output as JSON.                                                       | `false`             |

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps logs build dep_abc123 --since 2026-07-01T00:00:00Z --q "error" --json
```

---

### `apps logs runtime`

Reads the runtime logs of an environment. Resolves the app from `WEBFLOW_APP_ID` / `webflow.json` (or a picker); the environment from the `envId` argument, `WEBFLOW_APP_ENVIRONMENT_ID`, `webflow.json`, or a picker.

**Usage**

```bash
webflow apps logs runtime [envId] [options]
```

**Arguments**

| Argument | Description                                                                               |
| -------- | ----------------------------------------------------------------------------------------- |
| `envId`  | Environment ID. Defaults to the app's only environment (required if the app has several). |

Accepts the same `--since`, `--q`, `--limit`, `--cursor`, `--fields`, and `--json` options as [`logs build`](#apps-logs-build).

**Example**

```bash
webflow apps logs runtime env_abc123 --limit 200
```

---

### `apps env-vars list`

Lists environment variables for a Cloud app environment. Secret values are always masked.

**Usage**

```bash
webflow apps env-vars list [options]
```

**Options**

| Option                  | Description                                                                                                 | Default        |
| ----------------------- | ----------------------------------------------------------------------------------------------------------- | -------------- |
| `--app-id <id>`         | Cloud app ID. Defaults to `webflow.json` (`cloud.app_id`) or `WEBFLOW_APP_ID`.                              |                |
| `--environment-id <id>` | Environment ID. Defaults to `webflow.json` (`cloud.environment_id`) or `WEBFLOW_APP_ENVIRONMENT_ID`.        |                |
| `--key <key>`           | Filter by exact key (case-sensitive) — resolves to at most one variable. Its value is still never returned. |                |
| `--q <text>`            | Case-insensitive substring match on the key. Never searches values.                                         |                |
| `--fields <fields>`     | Comma-separated columns to display.                                                                         | `key,isSecret` |
| `--json`                | Output as JSON.                                                                                             | `false`        |

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps env-vars list --app-id app_abc123 --environment-id env_abc123 --json
```

---

### `apps env-vars set`

Creates or updates an environment variable.

**Usage**

```bash
webflow apps env-vars set <key> [value] [options]
```

**Arguments**

| Argument | Description                                                                                                                                 |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `key`    | Variable name.                                                                                                                              |
| `value`  | Variable value. Omit to read from piped stdin or an interactive prompt — recommended for secrets, since it keeps them out of shell history. |

**Options**

| Option                  | Description                                                                                |
| ----------------------- | ------------------------------------------------------------------------------------------ |
| `--app-id <id>`         | Cloud app ID.                                                                              |
| `--environment-id <id>` | Environment ID.                                                                            |
| `--secret`              | Mark the variable as secret. Omitting it on an existing key preserves its current secrecy. |
| `--dry-run`             | Preview without executing.                                                                 |
| `--json`                | Output as JSON.                                                                            |

Also accepts [global options](#global-options).

> **Keep secrets out of shell history**
>
> Passing a secret value as the `value` argument exposes it in shell history and the process list. Pipe it via stdin instead:
>
> ```bash
> printf '%s' "$VALUE" | webflow apps env-vars set API_KEY --secret --app-id app_abc123 --environment-id env_abc123
> ```

**Example**

```bash
webflow apps env-vars set NODE_ENV production --app-id app_abc123 --environment-id env_abc123
```

---

### `apps env-vars delete`

Deletes an environment variable.

**Usage**

```bash
webflow apps env-vars delete <key> [options]
```

**Options**

| Option                  | Description                |
| ----------------------- | -------------------------- |
| `--app-id <id>`         | Cloud app ID.              |
| `--environment-id <id>` | Environment ID.            |
| `--dry-run`             | Preview without executing. |
| `--json`                | Output as JSON.            |

Also accepts [global options](#global-options).

**Example**

```bash
webflow apps env-vars delete NODE_ENV --app-id app_abc123 --environment-id env_abc123 --dry-run
```

---

### `apps env-vars import`

Bulk imports environment variables from a `.env`-style file.

**Usage**

```bash
webflow apps env-vars import <file> [options]
```

**Arguments**

| Argument | Description                          |
| -------- | ------------------------------------ |
| `file`   | Path to a `.env` (`KEY=value`) file. |

**Options**

| Option                  | Description                                                                 |
| ----------------------- | --------------------------------------------------------------------------- |
| `--app-id <id>`         | Cloud app ID.                                                               |
| `--environment-id <id>` | Environment ID.                                                             |
| `--secret`              | Mark every imported key as secret.                                          |
| `--dry-run`             | Preview without executing. Never prints values.                             |
| `--json`                | Output as JSON. Values are always omitted from the result, even on success. |

Also accepts [global options](#global-options).

Partial failures exit non-zero after printing the full created / updated / skipped / error breakdown.

**Example**

```bash
webflow apps env-vars import .env.production --app-id app_abc123 --environment-id env_abc123 --secret
```

---

## Webflow Cloud

> **Deprecated namespace**
>
> `webflow cloud init` and `webflow cloud deploy` are deprecated aliases of [`apps init`](#apps-init) and [`apps
>   deploy`](#apps-deploy) — prefer the [`apps`](#apps) namespace for new scripts and CI/CD pipelines. `cloud create`
> remains cloud-only, with no `apps` equivalent. `cloud list` is also deprecated: it lists scaffold templates for
> `init`, **not** your Cloud apps — use [`apps list`](#apps-list) to list your apps, or [`apps init`](#apps-init) with
> `--framework` / `--help` for available templates.

### `cloud create`

> **Deprecated**
>
> `webflow cloud create` is deprecated. Use [`webflow cloud init`](#cloud-init) instead, which supports both
> site-attached and standalone apps and lets you choose the mount path interactively or via `--mount`.

Scaffolds a new site-attached Webflow Cloud project non-interactively. The project mounts at `/app` with no option to override the mount path.

**Usage**

```bash
webflow cloud create <name> [options]
```

**Arguments**

| Argument | Description                  |
| -------- | ---------------------------- |
| `name`   | **(Required)** Project name. |

**Options**

| Option                          | Description                       | Default  |
| ------------------------------- | --------------------------------- | -------- |
| `-f`, `--framework <framework>` | Framework to use for the project. | `nextjs` |

Also accepts [global options](#global-options).

**Example**

```bash
webflow cloud create my-project -f nextjs
```

---

### `cloud init`

> **Deprecated**
>
> `webflow cloud init` is a deprecated alias of [`webflow apps init`](#apps-init). Both share the exact same options and
> behavior; prefer `apps init` in new scripts.

Initializes a new Webflow Cloud app from a template.

**Usage**

```bash
webflow cloud init [options]
```

**Options**

| Option                 | Description                                                                                                                                   |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `-n`, `--app-name`     | App display name. Required in non-interactive mode.                                                                                           |
| `--project-name`       | **Deprecated.** Long-form alias for `--app-name`. Still accepted, emits a warning.                                                            |
| `-f`, `--framework`    | The framework to initialize (e.g., `astro`, `nextjs`).                                                                                        |
| `-m`, `--mount`        | The path to mount the app on. Defaults to `/app` for site-attached apps and `/` when used with `--new`.                                       |
| `-s`, `--site-id`      | Connect to an existing site directly, skipping the site picker.                                                                               |
| `--new`                | Create an app without connecting to an existing site.                                                                                         |
| `-w`, `--workspace-id` | Target workspace explicitly, skipping the workspace picker.                                                                                   |
| `--no-input`           | Global option. Run non-interactively for CI/CD. Requires `--app-name` and `--framework`. Without `--new`, defaults to site-attached behavior. |

Also accepts [global options](#global-options).

> **\`--site-id\` and \`--workspace-id\` are mutually exclusive**
>
> Use `--site-id` to connect to an existing site, or `--workspace-id` with `--new` to create a project app in a specific
> workspace. Passing both will error.

**Example**

```bash
# Initialize a new Astro app mounted at /app on a specific site
webflow cloud init -f astro -m /app -s 1234567890

# Initialize non-interactively with an explicit app name
webflow cloud init -f astro -m /app -s 1234567890 -n "My App" --no-input

# Initialize a project app (no site) in a specific workspace
webflow cloud init --new --no-input \
  --app-name my-app \
  --framework nextjs \
  --workspace-id ws_abc123
```

---

### `cloud list`

> **Deprecated**
>
> `webflow cloud list` is deprecated and will be removed in a future major release. It lists **scaffold templates** for `init` (e.g. `nextjs`, `astro`), **not** the Cloud apps in your workspace. To list your apps, use [`apps list`](#apps-list). For available templates, use [`apps init`](#apps-init) with `--framework` (or `--help`).

Lists available app templates for `cloud init`.

**Usage**

```bash
webflow cloud list
```

---

### `cloud deploy`

> **Deprecated**
>
> `webflow cloud deploy` is a deprecated alias of [`webflow apps deploy`](#apps-deploy). Both share the exact same
> options and behavior; prefer `apps deploy` in new scripts.

Deploys your app to Webflow Cloud.

**Usage**

```bash
webflow cloud deploy [options]
```

**Options**

| Option                    | Description                                                                                                                                                 |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `-e`, `--environment`     | Target environment name.                                                                                                                                    |
| `-m`, `--mount`           | Target mount path (e.g., `/app`).                                                                                                                           |
| `-n`, `--app-name`        | App name when creating an app.                                                                                                                              |
| `--project-name`          | **Deprecated.** Long-form alias for `--app-name`. Still accepted, emits a warning.                                                                          |
| `-a`, `--app-id`          | Deploy to an existing Cloud app directly, skipping the app picker.                                                                                          |
| `--project-id`            | **Deprecated.** Long-form alias for `--app-id`. Still accepted, emits a warning. The CLI no longer accepts the previous `-p` short flag — use `-a` instead. |
| `-d`, `--directory`       | Deploy from a specific subdirectory. Use this when your app lives in a subfolder of a monorepo.                                                             |
| `--description`           | App description when creating an app.                                                                                                                       |
| `-s`, `--site-id`         | Force site-attached deploy context, skipping the site picker.                                                                                               |
| `-f`, `--framework`       | Override framework detection before deploy.                                                                                                                 |
| `--skip-mount-path-check` | Skip mount-path validation checks.                                                                                                                          |
| `--auto-publish`          | Publish the site after deployment.                                                                                                                          |
| `-w`, `--workspace-id`    | Target workspace explicitly for project-app first deploys, skipping the workspace picker.                                                                   |
| `--no-input`              | Global option. Run non-interactively for CI/CD. Disables most prompts but **not** the app-select prompt — see the callout below.                            |

Also accepts [global options](#global-options).

> **\`--site-id\` and \`--workspace-id\` are mutually exclusive**
>
> Use `--site-id` to deploy site-attached, or `--workspace-id` to deploy a project app in a specific workspace. Passing
> both will error.

> **How deploy resolves which app to target**
>
> Before deploying, the CLI resolves the target app in this order:
>
> 1. `--site-id` flag → site-attached deploy.
> 2. `--workspace-id` flag → project-app deploy.
> 3. `siteId` in `webflow.json` → site-attached deploy.
> 4. `cloud.workspace_id` in `webflow.json` → project-app deploy.
> 5. `WEBFLOW_SITE_ID` environment variable → site-attached deploy.
> 6. Interactive picker → or hard-error when `--no-input` is set.

> **Configuration for CI/CD pipelines**
>
> For non-interactive deployments suitable for CI/CD pipelines, pass `--no-input` along with both `--mount` and `--environment`, plus an explicit target — either `--site-id` for site-attached deploys or `--workspace-id` for project apps. You can also use `--auto-publish` to publish the site after deployment so that your new environment is live.
>
> ```bash
> # Site-attached deploy
> webflow cloud deploy --no-input -s 1234567890 -e production -m /app --auto-publish
>
> # Project app deploy
> webflow cloud deploy --no-input -w ws_abc123 -e production -m /app
> ```
>
> > **Avoid hangs in CI**
> >
> > The deploy prompts (select an existing app, name a new app, pick an environment) are gated on whether `--mount` and `--environment` are *both* set — not on `--no-input`. Passing `--no-input` without both flags still fires the prompt and hangs in non-TTY contexts. The minimum safe CI form is `--no-input --mount <path> --environment <env> --site-id <id>` (or `--workspace-id <id>` for a project-app first deploy).

---